forked from cafeberry/cafeberry
update lcemp networking
This commit is contained in:
@@ -47,7 +47,7 @@ void AwardStatPacket::read(DataInputStream *dis) //throws IOException
|
||||
|
||||
// Read parameter blob.
|
||||
int length = dis->readInt();
|
||||
if(length > 0)
|
||||
if(length > 0 && length <= 65536)
|
||||
{
|
||||
m_paramData = byteArray(length);
|
||||
dis->readFully(m_paramData);
|
||||
|
||||
@@ -103,6 +103,12 @@ void BlockRegionUpdatePacket::read(DataInputStream *dis) //throws IOException
|
||||
levelIdx = ( size >> 30 ) & 3;
|
||||
size &= 0x3fffffff;
|
||||
|
||||
const int MAX_COMPRESSED_CHUNK_SIZE = 5 * 1024 * 1024;
|
||||
if(size < 0 || size > MAX_COMPRESSED_CHUNK_SIZE)
|
||||
{
|
||||
size = 0;
|
||||
}
|
||||
|
||||
if(size == 0)
|
||||
{
|
||||
buffer = byteArray();
|
||||
@@ -131,7 +137,10 @@ void BlockRegionUpdatePacket::read(DataInputStream *dis) //throws IOException
|
||||
|
||||
|
||||
delete [] compressedBuffer.data;
|
||||
assert(buffer.length == outputSize);
|
||||
if(buffer.length != outputSize)
|
||||
{
|
||||
app.DebugPrintf("BlockRegionUpdatePacket: decompressed size mismatch (expected %d, got %d)\n", buffer.length, outputSize);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -10,8 +10,14 @@
|
||||
//offset - the offset in the buffer of the first byte to read.
|
||||
//length - the maximum number of bytes to read from the buffer.
|
||||
ByteArrayInputStream::ByteArrayInputStream(byteArray buf, unsigned int offset, unsigned int length)
|
||||
: pos( offset ), count( min( offset+length, buf.length ) ), mark( offset )
|
||||
: pos( offset ), mark( offset )
|
||||
{
|
||||
if( offset > buf.length )
|
||||
count = buf.length;
|
||||
else if( length > buf.length - offset )
|
||||
count = buf.length;
|
||||
else
|
||||
count = offset + length;
|
||||
this->buf = buf;
|
||||
}
|
||||
|
||||
|
||||
@@ -31,7 +31,12 @@ void ByteArrayOutputStream::write(unsigned int b)
|
||||
{
|
||||
// If we will fill the buffer we need to make it bigger
|
||||
if( count + 1 >= buf.length )
|
||||
buf.resize( buf.length * 2 );
|
||||
{
|
||||
unsigned int newSize = buf.length * 2;
|
||||
if( newSize <= buf.length )
|
||||
return;
|
||||
buf.resize( newSize );
|
||||
}
|
||||
|
||||
buf[count] = (byte) b;
|
||||
count++;
|
||||
|
||||
@@ -21,6 +21,8 @@ public:
|
||||
void load(DataInput *dis, int tagDepth)
|
||||
{
|
||||
int length = dis->readInt();
|
||||
|
||||
if (length < 0 || length > 2 * 1024 * 1024) length = 0;
|
||||
|
||||
if ( data.data ) delete[] data.data;
|
||||
data = byteArray(length);
|
||||
|
||||
@@ -32,7 +32,9 @@ void ComplexItemDataPacket::read(DataInputStream *dis) //throws IOException
|
||||
itemType = dis->readShort();
|
||||
itemId = dis->readShort();
|
||||
|
||||
data = charArray(dis->readUnsignedShort() & 0xffff);
|
||||
int dataLength = dis->readUnsignedShort() & 0xffff;
|
||||
if(dataLength > 32767) dataLength = 0;
|
||||
data = charArray(dataLength);
|
||||
dis->readFully(data);
|
||||
}
|
||||
|
||||
|
||||
@@ -43,9 +43,12 @@ public:
|
||||
}
|
||||
tags.clear();
|
||||
Tag *tag;
|
||||
int tagCount = 0;
|
||||
const int MAX_COMPOUND_TAGS = 10000;
|
||||
while ((tag = Tag::readNamedTag(dis))->getId() != Tag::TAG_End)
|
||||
{
|
||||
tags[tag->getName()] = tag;
|
||||
if(++tagCount >= MAX_COMPOUND_TAGS) break;
|
||||
}
|
||||
delete tag;
|
||||
}
|
||||
|
||||
@@ -108,8 +108,8 @@ Connection::Connection(Socket *socket, const wstring& id, PacketListener *packet
|
||||
const char *szId = wstringtofilename(id);
|
||||
char readThreadName[256];
|
||||
char writeThreadName[256];
|
||||
sprintf(readThreadName,"%s read\n",szId);
|
||||
sprintf(writeThreadName,"%s write\n",szId);
|
||||
sprintf(readThreadName, "%.240s read\n", szId);
|
||||
sprintf(writeThreadName, "%.240s write\n", szId);
|
||||
|
||||
readThread = new C4JThread(runRead, (void*)this, readThreadName, READ_STACK_SIZE);
|
||||
writeThread = new C4JThread(runWrite, this, writeThreadName, WRITE_STACK_SIZE);
|
||||
|
||||
@@ -32,6 +32,9 @@ void ContainerSetContentPacket::read(DataInputStream *dis) //throws IOException
|
||||
{
|
||||
containerId = dis->readByte();
|
||||
int count = dis->readShort();
|
||||
|
||||
if(count < 0 || count > 256) count = 0;
|
||||
|
||||
items = ItemInstanceArray(count);
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
|
||||
@@ -35,7 +35,7 @@ void ContainerSetSlotPacket::read(DataInputStream *dis) //throws IOException
|
||||
// 4J Stu - TU-1 hotfix
|
||||
// Fix for #13142 - Holding down the A button on the furnace ingredient slot causes the UI to display incorrect item counts
|
||||
BYTE byteId = dis->readByte();
|
||||
containerId = *(char *)&byteId;
|
||||
containerId = (char)(signed char)byteId;
|
||||
slot = dis->readShort();
|
||||
item = readItem(dis);
|
||||
}
|
||||
|
||||
@@ -43,7 +43,7 @@ void CustomPayloadPacket::read(DataInputStream *dis)
|
||||
identifier = readUtf(dis, 20);
|
||||
length = dis->readShort();
|
||||
|
||||
if (length > 0 && length < Short::MAX_VALUE)
|
||||
if (length > 0 && length <= Short::MAX_VALUE)
|
||||
{
|
||||
if(data.data != NULL)
|
||||
{
|
||||
|
||||
@@ -303,6 +303,10 @@ wstring DataInputStream::readUTF()
|
||||
int b = stream->read();
|
||||
unsigned short UTFLength = (unsigned short) (((a & 0xff) << 8) | (b & 0xff));
|
||||
|
||||
const unsigned short MAX_UTF_LENGTH = 32767;
|
||||
if( UTFLength > MAX_UTF_LENGTH )
|
||||
return outputString;
|
||||
|
||||
//// 4J Stu - I decided while writing DataOutputStream that we didn't need to bother using the UTF8 format
|
||||
//// used in the java libs, and just write in/out as wchar_t all the time
|
||||
|
||||
|
||||
@@ -432,6 +432,28 @@ void DirectoryLevelStorage::save(shared_ptr<Player> player)
|
||||
CompoundTag *DirectoryLevelStorage::load(shared_ptr<Player> player)
|
||||
{
|
||||
CompoundTag *tag = loadPlayerDataTag( player->getXuid() );
|
||||
|
||||
#if defined(_WINDOWS64) || defined(DISABLE_PSN) || defined(_DISABLE_XBLIVE)
|
||||
if (tag == NULL)
|
||||
{
|
||||
const PlayerUID WIN64_XUID_BASE = (PlayerUID)0xe000d45248242f2e;
|
||||
for (int i = 0; i < MINECRAFT_NET_MAX_PLAYERS; i++)
|
||||
{
|
||||
PlayerUID oldXuid = WIN64_XUID_BASE + i;
|
||||
tag = loadPlayerDataTag(oldXuid);
|
||||
if (tag != NULL)
|
||||
{
|
||||
ConsoleSavePath oldFile = ConsoleSavePath(playerDir.getName() + _toString(oldXuid) + L".dat");
|
||||
if (m_saveFile->doesFileExist(oldFile))
|
||||
{
|
||||
m_saveFile->deleteFile(m_saveFile->createFile(oldFile));
|
||||
}
|
||||
app.DebugPrintf("Migrated player data from old XUID %llu to new XUID %llu\n", oldXuid, player->getXuid());
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if (tag != NULL)
|
||||
{
|
||||
player->load(tag);
|
||||
|
||||
@@ -56,6 +56,8 @@ void ExplodePacket::read(DataInputStream *dis) //throws IOException
|
||||
r = dis->readFloat();
|
||||
int count = dis->readInt();
|
||||
|
||||
if(count < 0 || count > 32768) count = 0;
|
||||
|
||||
int xp = (int)x;
|
||||
int yp = (int)y;
|
||||
int zp = (int)z;
|
||||
|
||||
@@ -40,7 +40,7 @@ void GameCommandPacket::read(DataInputStream *dis)
|
||||
command = (EGameCommand)dis->readInt();
|
||||
length = dis->readShort();
|
||||
|
||||
if (length > 0 && length < Short::MAX_VALUE)
|
||||
if (length > 0 && length <= Short::MAX_VALUE)
|
||||
{
|
||||
if(data.data != NULL)
|
||||
{
|
||||
|
||||
@@ -35,6 +35,7 @@ public:
|
||||
void load(DataInput *dis, int tagDepth)
|
||||
{
|
||||
int length = dis->readInt();
|
||||
if (length < 0 || length > 65536) length = 0;
|
||||
|
||||
if ( data.data ) delete[] data.data;
|
||||
data = intArray(length);
|
||||
|
||||
@@ -1197,7 +1197,6 @@ void LevelChunk::addEntity(shared_ptr<Entity> e)
|
||||
int zc = Mth::floor(e->z / 16);
|
||||
if (xc != this->x || zc != this->z)
|
||||
{
|
||||
app.DebugPrintf("Wrong location!");
|
||||
// System.out.println("Wrong location! " + e);
|
||||
// Thread.dumpStack();
|
||||
}
|
||||
|
||||
@@ -37,11 +37,13 @@ public:
|
||||
}
|
||||
type = dis->readByte();
|
||||
int size = dis->readInt();
|
||||
if (size < 0 || size > 10000) size = 0;
|
||||
|
||||
list.clear();
|
||||
for (int i = 0; i < size; i++)
|
||||
{
|
||||
Tag *tag = Tag::newTag(type, L"");
|
||||
if (tag == NULL) break;
|
||||
tag->load(dis, tagDepth);
|
||||
list.push_back(tag);
|
||||
}
|
||||
|
||||
+21
-17
@@ -268,7 +268,13 @@ void Packet::updatePacketStatsPIX()
|
||||
shared_ptr<Packet> Packet::getPacket(int id)
|
||||
{
|
||||
// 4J: Removed try/catch
|
||||
return idToCreateMap[id]();
|
||||
#ifdef __PS3__
|
||||
boost::unordered_map<int, packetCreateFn>::iterator it = idToCreateMap.find(id);
|
||||
#else
|
||||
auto it = idToCreateMap.find(id);
|
||||
#endif
|
||||
if (it == idToCreateMap.end()) return shared_ptr<Packet>();
|
||||
return it->second();
|
||||
}
|
||||
|
||||
void Packet::writeBytes(DataOutputStream *dataoutputstream, byteArray bytes)
|
||||
@@ -330,13 +336,12 @@ shared_ptr<Packet> Packet::readPacket(DataInputStream *dis, bool isServer) // th
|
||||
if ((isServer && serverReceivedPackets.find(id) == serverReceivedPackets.end()) || (!isServer && clientReceivedPackets.find(id) == clientReceivedPackets.end()))
|
||||
{
|
||||
//app.DebugPrintf("Bad packet id %d\n", id);
|
||||
__debugbreak();
|
||||
assert(false);
|
||||
return nullptr;
|
||||
// throw new IOException(wstring(L"Bad packet id ") + _toString<int>(id));
|
||||
}
|
||||
|
||||
packet = getPacket(id);
|
||||
if (packet == NULL) assert(false);//throw new IOException(wstring(L"Bad packet id ") + _toString<int>(id));
|
||||
if (packet == NULL) return nullptr;//throw new IOException(wstring(L"Bad packet id ") + _toString<int>(id));
|
||||
|
||||
//app.DebugPrintf("%s reading packet %d\n", isServer ? "Server" : "Client", packet->getId());
|
||||
packet->read(dis);
|
||||
@@ -394,17 +399,9 @@ wstring Packet::readUtf(DataInputStream *dis, int maxLength) // throws IOExcepti
|
||||
{
|
||||
|
||||
short stringLength = dis->readShort();
|
||||
if (stringLength > maxLength)
|
||||
if (stringLength > maxLength || stringLength < 0)
|
||||
{
|
||||
wstringstream stream;
|
||||
stream << L"Received string length longer than maximum allowed (" << stringLength << " > " << maxLength << ")";
|
||||
assert(false);
|
||||
// throw new IOException( stream.str() );
|
||||
}
|
||||
if (stringLength < 0)
|
||||
{
|
||||
assert(false);
|
||||
// throw new IOException(L"Received string length is less than zero! Weird string!");
|
||||
return L"";
|
||||
}
|
||||
|
||||
wstring builder = L"";
|
||||
@@ -507,7 +504,7 @@ shared_ptr<ItemInstance> Packet::readItem(DataInputStream *dis)
|
||||
{
|
||||
shared_ptr<ItemInstance> item = nullptr;
|
||||
int id = dis->readShort();
|
||||
if (id >= 0)
|
||||
if (id >= 0 && id < 32000) // validate against Item::ITEM_NUM_COUNT
|
||||
{
|
||||
int count = dis->readByte();
|
||||
int damage = dis->readShort();
|
||||
@@ -545,9 +542,16 @@ void Packet::writeItem(shared_ptr<ItemInstance> item, DataOutputStream *dos)
|
||||
CompoundTag *Packet::readNbt(DataInputStream *dis)
|
||||
{
|
||||
int size = dis->readShort();
|
||||
if (size < 0) return NULL;
|
||||
if (size <= 0) return NULL;
|
||||
|
||||
const int MAX_NBT_SIZE = 32767;
|
||||
if (size > MAX_NBT_SIZE) return NULL;
|
||||
byteArray buff(size);
|
||||
dis->readFully(buff);
|
||||
if (!dis->readFully(buff))
|
||||
{
|
||||
delete [] buff.data;
|
||||
return NULL;
|
||||
}
|
||||
CompoundTag *result = (CompoundTag *) NbtIo::decompress(buff);
|
||||
delete [] buff.data;
|
||||
return result;
|
||||
|
||||
@@ -62,6 +62,7 @@ void PreLoginPacket::read(DataInputStream *dis) //throws IOException
|
||||
m_friendsOnlyBits = dis->readByte();
|
||||
m_ugcPlayersVersion = dis->readInt();
|
||||
m_dwPlayerCount = dis->readByte();
|
||||
if( m_dwPlayerCount > MINECRAFT_NET_MAX_PLAYERS ) m_dwPlayerCount = MINECRAFT_NET_MAX_PLAYERS;
|
||||
if( m_dwPlayerCount > 0 )
|
||||
{
|
||||
m_playerXuids = new PlayerUID[m_dwPlayerCount];
|
||||
@@ -74,6 +75,7 @@ void PreLoginPacket::read(DataInputStream *dis) //throws IOException
|
||||
{
|
||||
m_szUniqueSaveName[i]=dis->readByte();
|
||||
}
|
||||
m_szUniqueSaveName[m_iSaveNameLen - 1] = 0;
|
||||
m_serverSettings = dis->readInt();
|
||||
m_hostIndex = dis->readByte();
|
||||
|
||||
|
||||
@@ -21,7 +21,9 @@ RemoveEntitiesPacket::~RemoveEntitiesPacket()
|
||||
|
||||
void RemoveEntitiesPacket::read(DataInputStream *dis) //throws IOException
|
||||
{
|
||||
ids = intArray(dis->readByte());
|
||||
int count = dis->readByte();
|
||||
if(count < 0) count = 0;
|
||||
ids = intArray(count);
|
||||
for(unsigned int i = 0; i < ids.length; ++i)
|
||||
{
|
||||
ids[i] = dis->readInt();
|
||||
|
||||
@@ -138,6 +138,11 @@ void Socket::pushDataToQueue(const BYTE * pbData, DWORD dwDataSize, bool fromHos
|
||||
}
|
||||
|
||||
EnterCriticalSection(&m_queueLockNetwork[queueIdx]);
|
||||
if(m_queueNetwork[queueIdx].size() + dwDataSize > 2 * 1024 * 1024)
|
||||
{
|
||||
LeaveCriticalSection(&m_queueLockNetwork[queueIdx]);
|
||||
return;
|
||||
}
|
||||
for( unsigned int i = 0; i < dwDataSize; i++ )
|
||||
{
|
||||
m_queueNetwork[queueIdx].push(*pbData++);
|
||||
|
||||
@@ -343,8 +343,10 @@ vector<shared_ptr<SynchedEntityData::DataItem> > *SynchedEntityData::unpack(Data
|
||||
vector<shared_ptr<DataItem> > *result = NULL;
|
||||
|
||||
int currentHeader = input->readByte();
|
||||
int itemCount = 0;
|
||||
const int MAX_ENTITY_DATA_ITEMS = 256;
|
||||
|
||||
while (currentHeader != EOF_MARKER)
|
||||
while (currentHeader != EOF_MARKER && itemCount < MAX_ENTITY_DATA_ITEMS)
|
||||
{
|
||||
|
||||
if (result == NULL)
|
||||
@@ -399,6 +401,7 @@ vector<shared_ptr<SynchedEntityData::DataItem> > *SynchedEntityData::unpack(Data
|
||||
break;
|
||||
}
|
||||
result->push_back(item);
|
||||
itemCount++;
|
||||
|
||||
currentHeader = input->readByte();
|
||||
}
|
||||
|
||||
+26
-5
@@ -84,27 +84,48 @@ Tag *Tag::readNamedTag(DataInput *dis)
|
||||
|
||||
Tag *Tag::readNamedTag(DataInput *dis, int tagDepth)
|
||||
{
|
||||
static __declspec(thread) int depth = 0;
|
||||
static __declspec(thread) int totalTagCount = 0;
|
||||
|
||||
if (depth == 0)
|
||||
totalTagCount = 0;
|
||||
|
||||
depth++;
|
||||
|
||||
if (depth > 256)
|
||||
{
|
||||
depth--;
|
||||
return new EndTag();
|
||||
}
|
||||
|
||||
totalTagCount++;
|
||||
const int MAX_TOTAL_TAGS = 32768;
|
||||
if (totalTagCount > MAX_TOTAL_TAGS)
|
||||
{
|
||||
depth--;
|
||||
return new EndTag();
|
||||
}
|
||||
|
||||
byte type = dis->readByte();
|
||||
if (type == 0) return new EndTag();
|
||||
if (type == 0) { depth--; return new EndTag(); }
|
||||
|
||||
// 4J Stu - readByte can return -1, so if it's that then also mark as the end tag
|
||||
if(type == 255)
|
||||
{
|
||||
app.DebugPrintf("readNamedTag read a type of 255\n");
|
||||
#ifndef _CONTENT_PACKAGE
|
||||
__debugbreak();
|
||||
#endif
|
||||
depth--;
|
||||
return new EndTag();
|
||||
}
|
||||
|
||||
wstring name = dis->readUTF();//new String(bytes, "UTF-8");
|
||||
|
||||
Tag *tag = newTag(type, name);
|
||||
if (tag == NULL) { depth--; return new EndTag(); }
|
||||
// short length = dis.readShort();
|
||||
// byte[] bytes = new byte[length];
|
||||
// dis.readFully(bytes);
|
||||
|
||||
tag->load(dis, tagDepth);
|
||||
depth--;
|
||||
return tag;
|
||||
}
|
||||
|
||||
|
||||
@@ -123,7 +123,16 @@ void TextureAndGeometryPacket::read(DataInputStream *dis) //throws IOException
|
||||
{
|
||||
textureName = dis->readUTF();
|
||||
dwSkinID = (DWORD)dis->readInt();
|
||||
dwTextureBytes = (DWORD)dis->readShort();
|
||||
short rawTextureBytes = dis->readShort();
|
||||
if(rawTextureBytes <= 0)
|
||||
{
|
||||
dwTextureBytes = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
dwTextureBytes = (DWORD)(unsigned short)rawTextureBytes;
|
||||
if(dwTextureBytes > 65536) dwTextureBytes = 0;
|
||||
}
|
||||
|
||||
if(dwTextureBytes>0)
|
||||
{
|
||||
@@ -136,7 +145,16 @@ void TextureAndGeometryPacket::read(DataInputStream *dis) //throws IOException
|
||||
}
|
||||
uiAnimOverrideBitmask = dis->readInt();
|
||||
|
||||
dwBoxC = (DWORD)dis->readShort();
|
||||
short rawBoxC = dis->readShort();
|
||||
if(rawBoxC <= 0)
|
||||
{
|
||||
dwBoxC = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
dwBoxC = (DWORD)(unsigned short)rawBoxC;
|
||||
if(dwBoxC > 256) dwBoxC = 0; // sane limit for skin boxes
|
||||
}
|
||||
|
||||
if(dwBoxC>0)
|
||||
{
|
||||
|
||||
@@ -37,16 +37,24 @@ void TexturePacket::handle(PacketListener *listener)
|
||||
void TexturePacket::read(DataInputStream *dis) //throws IOException
|
||||
{
|
||||
textureName = dis->readUTF();
|
||||
dwBytes = (DWORD)dis->readShort();
|
||||
|
||||
if(dwBytes>0)
|
||||
short rawBytes = dis->readShort();
|
||||
if(rawBytes <= 0)
|
||||
{
|
||||
this->pbData= new BYTE [dwBytes];
|
||||
dwBytes = 0;
|
||||
return;
|
||||
}
|
||||
dwBytes = (DWORD)(unsigned short)rawBytes;
|
||||
if(dwBytes > 65536)
|
||||
{
|
||||
dwBytes = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
for(DWORD i=0;i<dwBytes;i++)
|
||||
{
|
||||
this->pbData[i] = dis->readByte();
|
||||
}
|
||||
this->pbData= new BYTE [dwBytes];
|
||||
|
||||
for(DWORD i=0;i<dwBytes;i++)
|
||||
{
|
||||
this->pbData[i] = dis->readByte();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -42,7 +42,7 @@ void UpdateGameRuleProgressPacket::read(DataInputStream *dis) //throws IOExcepti
|
||||
m_dataTag = dis->readInt();
|
||||
int dataLength = dis->readInt();
|
||||
|
||||
if(dataLength > 0)
|
||||
if(dataLength > 0 && dataLength <= 65536)
|
||||
{
|
||||
m_data = byteArray(dataLength);
|
||||
dis->readFully(m_data);
|
||||
|
||||
@@ -196,9 +196,20 @@ HRESULT Compression::DecompressLZXRLE(void *pDestination, unsigned int *pDestSiz
|
||||
unsigned int rleSize = staticRleSize;
|
||||
unsigned char *dynamicRleBuf = NULL;
|
||||
|
||||
if(*pDestSize > rleSize)
|
||||
unsigned int safeRleSize = max(rleSize, *pDestSize);
|
||||
|
||||
const unsigned int MAX_RLE_ALLOC = 16 * 1024 * 1024; // 16 MB
|
||||
if(safeRleSize > MAX_RLE_ALLOC)
|
||||
{
|
||||
rleSize = *pDestSize;
|
||||
LeaveCriticalSection(&rleDecompressLock);
|
||||
*pDestSize = 0;
|
||||
// E_FAIL doesnt exist on PS3
|
||||
return (HRESULT)0x80004005L;
|
||||
}
|
||||
|
||||
if(safeRleSize > staticRleSize)
|
||||
{
|
||||
rleSize = safeRleSize;
|
||||
dynamicRleBuf = new unsigned char[rleSize];
|
||||
Decompress(dynamicRleBuf, &rleSize, pSource, SrcSize);
|
||||
pucIn = (unsigned char *)dynamicRleBuf;
|
||||
@@ -212,16 +223,19 @@ HRESULT Compression::DecompressLZXRLE(void *pDestination, unsigned int *pDestSiz
|
||||
//unsigned char *pucIn = (unsigned char *)rleDecompressBuf;
|
||||
unsigned char *pucEnd = pucIn + rleSize;
|
||||
unsigned char *pucOut = (unsigned char *)pDestination;
|
||||
unsigned char *pucOutEnd = pucOut + *pDestSize;
|
||||
|
||||
while( pucIn != pucEnd )
|
||||
{
|
||||
unsigned char thisOne = *pucIn++;
|
||||
if( thisOne == 255 )
|
||||
{
|
||||
if( pucIn >= pucEnd ) break;
|
||||
unsigned int count = *pucIn++;
|
||||
if( count < 3 )
|
||||
{
|
||||
count++;
|
||||
if( pucOut + count > pucOutEnd ) { pucOut = pucOutEnd; break; }
|
||||
for( unsigned int i = 0; i < count; i++ )
|
||||
{
|
||||
*pucOut++ = 255;
|
||||
@@ -230,7 +244,9 @@ HRESULT Compression::DecompressLZXRLE(void *pDestination, unsigned int *pDestSiz
|
||||
else
|
||||
{
|
||||
count++;
|
||||
if( pucIn >= pucEnd ) break;
|
||||
unsigned char data = *pucIn++;
|
||||
if( pucOut + count > pucOutEnd ) { pucOut = pucOutEnd; break; }
|
||||
for( unsigned int i = 0; i < count; i++ )
|
||||
{
|
||||
*pucOut++ = data;
|
||||
@@ -239,6 +255,7 @@ HRESULT Compression::DecompressLZXRLE(void *pDestination, unsigned int *pDestSiz
|
||||
}
|
||||
else
|
||||
{
|
||||
if( pucOut >= pucOutEnd ) break;
|
||||
*pucOut++ = thisOne;
|
||||
}
|
||||
}
|
||||
@@ -260,16 +277,19 @@ HRESULT Compression::DecompressRLE(void *pDestination, unsigned int *pDestSize,
|
||||
unsigned char *pucIn = (unsigned char *)pSource;
|
||||
unsigned char *pucEnd = pucIn + SrcSize;
|
||||
unsigned char *pucOut = (unsigned char *)pDestination;
|
||||
unsigned char *pucOutEnd = pucOut + *pDestSize;
|
||||
|
||||
while( pucIn != pucEnd )
|
||||
{
|
||||
unsigned char thisOne = *pucIn++;
|
||||
if( thisOne == 255 )
|
||||
{
|
||||
if( pucIn >= pucEnd ) break;
|
||||
unsigned int count = *pucIn++;
|
||||
if( count < 3 )
|
||||
{
|
||||
count++;
|
||||
if( pucOut + count > pucOutEnd ) { pucOut = pucOutEnd; break; }
|
||||
for( unsigned int i = 0; i < count; i++ )
|
||||
{
|
||||
*pucOut++ = 255;
|
||||
@@ -278,7 +298,9 @@ HRESULT Compression::DecompressRLE(void *pDestination, unsigned int *pDestSize,
|
||||
else
|
||||
{
|
||||
count++;
|
||||
if( pucIn >= pucEnd ) break;
|
||||
unsigned char data = *pucIn++;
|
||||
if( pucOut + count > pucOutEnd ) { pucOut = pucOutEnd; break; }
|
||||
for( unsigned int i = 0; i < count; i++ )
|
||||
{
|
||||
*pucOut++ = data;
|
||||
@@ -287,6 +309,7 @@ HRESULT Compression::DecompressRLE(void *pDestination, unsigned int *pDestSize,
|
||||
}
|
||||
else
|
||||
{
|
||||
if( pucOut >= pucOutEnd ) break;
|
||||
*pucOut++ = thisOne;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -249,6 +249,9 @@ private:
|
||||
};
|
||||
|
||||
void Win64_SetupRemoteQNetPlayer(IQNetPlayer *player, BYTE smallId, bool isHost, bool isLocal);
|
||||
char GetUsername();
|
||||
PlayerUID Win64_UsernameToXuid(const char* username);
|
||||
PlayerUID Win64_UsernameToXuid(const wchar_t* username);
|
||||
|
||||
const int QNET_GETSENDQUEUESIZE_SECONDARY_TYPE = 0;
|
||||
const int QNET_GETSENDQUEUESIZE_MESSAGES = 0;
|
||||
|
||||
Reference in New Issue
Block a user