Skip to content

Commit

Permalink
Fix compiler warnings
Browse files Browse the repository at this point in the history
  • Loading branch information
yourWaifu committed Feb 8, 2025
1 parent 5e1f517 commit f28ab55
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 10 deletions.
1 change: 1 addition & 0 deletions examples/sound-player/main.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include <random> //For noise
#include <queue>
#include "sleepy_discord/sleepy_discord.h"
#include "IO_file.h" //For music

Expand Down
33 changes: 23 additions & 10 deletions include/sleepy_discord/asio_websocketconnection.h
Original file line number Diff line number Diff line change
Expand Up @@ -247,7 +247,6 @@ namespace SleepyDiscord {
headers.insert(std::make_pair(headerFieldLeft, std::move(headerFieldRight)));
}
offset += 2; // + 2 to skip end of header
const auto bodyStart = offset;

// easyer to write it like this, but a map of functions might be faster
{
Expand Down Expand Up @@ -478,7 +477,7 @@ namespace SleepyDiscord {

void receiveFullHandshake(std::shared_ptr<std::array<char, 256>> responsePtr, const std::size_t length, int score = 0) {
const static std::array<char, 4> endOfHandshake = { '\r', '\n', '\r', '\n' };
for (int i = 0; i < length; i += 1) {
for (std::size_t i = 0; i < length; i += 1) {
if (responsePtr->data()[i] == endOfHandshake[score]) {
score += 1;
if (score == 4) {
Expand Down Expand Up @@ -538,15 +537,15 @@ namespace SleepyDiscord {
std::memcpy(&secondByte, &temp, 1);
}

constexpr int8_t hasMaskByte = 1; constexpr int8_t hasMaskBit = static_cast<uint8_t>(0b1000'0000);
constexpr int8_t hasMaskBit = static_cast<uint8_t>(0b1000'0000);
bool hasMask = (secondByte & hasMaskBit) == hasMaskBit;
const std::size_t maskLength = hasMask ? sizeof(uint32_t) : 0;
if (hasMask) { // Servers shouldn't sent masked payloads
std::cerr << "Recevied masked websocket message, Servers shouldn't send masked payloads\n";
return;
}

constexpr int8_t hasExtendedLengthByte = 1; constexpr int8_t hasExtendedLength = static_cast<uint8_t>(0b0111'1111);
constexpr int8_t hasExtendedLength = static_cast<uint8_t>(0b0111'1111);
int8_t length7Bit = secondByte & hasExtendedLength;
std::size_t lengthOfLength;
switch (length7Bit) {
Expand Down Expand Up @@ -589,7 +588,7 @@ namespace SleepyDiscord {
auto self = shared_from_this();
std::istream inputStream(readBuffer.get());
int extendedLengthPrefixLength;
uint64_t payloadLength;
std::size_t payloadLength;
switch (frame.length7Bit) {
case 126: {
constexpr std::size_t size = sizeof(uint16_t);
Expand All @@ -609,7 +608,19 @@ namespace SleepyDiscord {
inputStream.read(temp.data(), networkInt.size());
std::memcpy(networkInt.data(), temp.data(), networkInt.size());
}
payloadLength = net2System64(networkInt);
uint64_t temp = net2System64(networkInt);

constexpr bool pointerIsTooSmall = (std::numeric_limits<std::size_t>::max)() < (std::numeric_limits<uint64_t>::max)();
if ( // on a 32 bit or 16 bit system, we can't put the message in memory
// the compiler should be smart enough to get rid of this on 64-bit systems
pointerIsTooSmall && ((std::numeric_limits<std::size_t>::max)() < payloadLength)
) { // doubt that Discord would ever sent a 4 GB websocket payload, so just kill it
std::cerr << "Can't read message larger then max pointer value\n";
disconnect(1009, "sizeof(PTR)<MSG");
return;
}

payloadLength = static_cast<std::size_t>(temp);
} break;
default:
extendedLengthPrefixLength = 0;
Expand All @@ -619,11 +630,11 @@ namespace SleepyDiscord {

const std::size_t maskStart = 2 + static_cast<size_t>(extendedLengthPrefixLength);
const std::size_t payloadStart = maskStart + frame.maskLength;
const std::size_t fullMessageLength = payloadStart + payloadLength;
const std::size_t leftOverLength = length - payloadStart;

if (length < fullMessageLength) {
if (leftOverLength < payloadLength) {
// we don't have the whole message, loop receive until we have the whole message
const std::size_t bytesLeftToGet = fullMessageLength - length;
const std::size_t bytesLeftToGet = payloadLength - leftOverLength;
asio::async_read(*(self->socketPtr), *readBuffer, asio::transfer_at_least(bytesLeftToGet), [self, readBuffer, frame, payloadLength, bytesLeftToGet](const asio::error_code& err, const std::size_t length) {
if (err) {
std::cerr << "failed to read whole\n";
Expand All @@ -636,7 +647,7 @@ namespace SleepyDiscord {
else {
// we have the whole message, we don't need to read again
self->onPayload(frame.opCode, readBuffer, payloadLength);
afterPayload(length - fullMessageLength, readBuffer);
afterPayload(leftOverLength - payloadLength, readBuffer);
}
}

Expand Down Expand Up @@ -680,6 +691,8 @@ namespace SleepyDiscord {
case pongOp:
// only needed if ping send is implemented
break;
case continueOp:
// shouldn't happen because we don't support websocket fragmentation
default:
std::cerr << "Unknown op code from server\n";
return;
Expand Down

0 comments on commit f28ab55

Please sign in to comment.