Skip to content

Commit 113bdd3

Browse files
committedApr 1, 2015
NetworkPacket: reading outside packet is now clearer.
Use a common function to check the reading offset
1 parent ddf96c7 commit 113bdd3

File tree

2 files changed

+31
-38
lines changed

2 files changed

+31
-38
lines changed
 

Diff for: ‎src/network/networkpacket.cpp

+29-38
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,16 @@ NetworkPacket::~NetworkPacket()
3939
m_data.clear();
4040
}
4141

42+
void NetworkPacket::checkReadOffset(u32 from_offset)
43+
{
44+
if (from_offset >= m_datasize) {
45+
std::stringstream ss;
46+
ss << "Reading outside packet (offset: " <<
47+
from_offset << ", packet size: " << getSize() << ")";
48+
throw SerializationError(ss.str());
49+
}
50+
}
51+
4252
void NetworkPacket::putRawPacket(u8 *data, u32 datasize, u16 peer_id)
4353
{
4454
// If a m_command is already set, we are rewriting on same packet
@@ -55,8 +65,7 @@ void NetworkPacket::putRawPacket(u8 *data, u32 datasize, u16 peer_id)
5565

5666
char* NetworkPacket::getString(u32 from_offset)
5767
{
58-
if (from_offset >= m_datasize)
59-
throw SerializationError("Malformed packet read");
68+
checkReadOffset(from_offset);
6069

6170
return (char*)&m_data[from_offset];
6271
}
@@ -187,8 +196,7 @@ std::string NetworkPacket::readLongString()
187196

188197
NetworkPacket& NetworkPacket::operator>>(char& dst)
189198
{
190-
if (m_read_offset >= m_datasize)
191-
throw SerializationError("Malformed packet read");
199+
checkReadOffset(m_read_offset);
192200

193201
dst = readU8(&m_data[m_read_offset]);
194202

@@ -198,8 +206,7 @@ NetworkPacket& NetworkPacket::operator>>(char& dst)
198206

199207
char NetworkPacket::getChar(u32 offset)
200208
{
201-
if (offset >= m_datasize)
202-
throw SerializationError("Malformed packet read");
209+
checkReadOffset(offset);
203210

204211
return readU8(&m_data[offset]);
205212
}
@@ -276,8 +283,7 @@ NetworkPacket& NetworkPacket::operator<<(float src)
276283

277284
NetworkPacket& NetworkPacket::operator>>(bool& dst)
278285
{
279-
if (m_read_offset >= m_datasize)
280-
throw SerializationError("Malformed packet read");
286+
checkReadOffset(m_read_offset);
281287

282288
dst = readU8(&m_data[m_read_offset]);
283289

@@ -287,8 +293,7 @@ NetworkPacket& NetworkPacket::operator>>(bool& dst)
287293

288294
NetworkPacket& NetworkPacket::operator>>(u8& dst)
289295
{
290-
if (m_read_offset >= m_datasize)
291-
throw SerializationError("Malformed packet read");
296+
checkReadOffset(m_read_offset);
292297

293298
dst = readU8(&m_data[m_read_offset]);
294299

@@ -298,8 +303,7 @@ NetworkPacket& NetworkPacket::operator>>(u8& dst)
298303

299304
u8 NetworkPacket::getU8(u32 offset)
300305
{
301-
if (offset >= m_datasize)
302-
throw SerializationError("Malformed packet read");
306+
checkReadOffset(offset);
303307

304308
return readU8(&m_data[offset]);
305309
}
@@ -310,16 +314,14 @@ u8* NetworkPacket::getU8Ptr(u32 from_offset)
310314
return NULL;
311315
}
312316

313-
if (from_offset >= m_datasize)
314-
throw SerializationError("Malformed packet read");
317+
checkReadOffset(from_offset);
315318

316319
return (u8*)&m_data[from_offset];
317320
}
318321

319322
NetworkPacket& NetworkPacket::operator>>(u16& dst)
320323
{
321-
if (m_read_offset >= m_datasize)
322-
throw SerializationError("Malformed packet read");
324+
checkReadOffset(m_read_offset);
323325

324326
dst = readU16(&m_data[m_read_offset]);
325327

@@ -329,16 +331,14 @@ NetworkPacket& NetworkPacket::operator>>(u16& dst)
329331

330332
u16 NetworkPacket::getU16(u32 from_offset)
331333
{
332-
if (from_offset >= m_datasize)
333-
throw SerializationError("Malformed packet read");
334+
checkReadOffset(from_offset);
334335

335336
return readU16(&m_data[from_offset]);
336337
}
337338

338339
NetworkPacket& NetworkPacket::operator>>(u32& dst)
339340
{
340-
if (m_read_offset >= m_datasize)
341-
throw SerializationError("Malformed packet read");
341+
checkReadOffset(m_read_offset);
342342

343343
dst = readU32(&m_data[m_read_offset]);
344344

@@ -348,8 +348,7 @@ NetworkPacket& NetworkPacket::operator>>(u32& dst)
348348

349349
NetworkPacket& NetworkPacket::operator>>(u64& dst)
350350
{
351-
if (m_read_offset >= m_datasize)
352-
throw SerializationError("Malformed packet read");
351+
checkReadOffset(m_read_offset);
353352

354353
dst = readU64(&m_data[m_read_offset]);
355354

@@ -359,8 +358,7 @@ NetworkPacket& NetworkPacket::operator>>(u64& dst)
359358

360359
NetworkPacket& NetworkPacket::operator>>(float& dst)
361360
{
362-
if (m_read_offset >= m_datasize)
363-
throw SerializationError("Malformed packet read");
361+
checkReadOffset(m_read_offset);
364362

365363
dst = readF1000(&m_data[m_read_offset]);
366364

@@ -370,8 +368,7 @@ NetworkPacket& NetworkPacket::operator>>(float& dst)
370368

371369
NetworkPacket& NetworkPacket::operator>>(v2f& dst)
372370
{
373-
if (m_read_offset >= m_datasize)
374-
throw SerializationError("Malformed packet read");
371+
checkReadOffset(m_read_offset);
375372

376373
dst = readV2F1000(&m_data[m_read_offset]);
377374

@@ -381,8 +378,7 @@ NetworkPacket& NetworkPacket::operator>>(v2f& dst)
381378

382379
NetworkPacket& NetworkPacket::operator>>(v3f& dst)
383380
{
384-
if (m_read_offset >= m_datasize)
385-
throw SerializationError("Malformed packet read");
381+
checkReadOffset(m_read_offset);
386382

387383
dst = readV3F1000(&m_data[m_read_offset]);
388384

@@ -392,8 +388,7 @@ NetworkPacket& NetworkPacket::operator>>(v3f& dst)
392388

393389
NetworkPacket& NetworkPacket::operator>>(s16& dst)
394390
{
395-
if (m_read_offset >= m_datasize)
396-
throw SerializationError("Malformed packet read");
391+
checkReadOffset(m_read_offset);
397392

398393
dst = readS16(&m_data[m_read_offset]);
399394

@@ -409,8 +404,7 @@ NetworkPacket& NetworkPacket::operator<<(s16 src)
409404

410405
NetworkPacket& NetworkPacket::operator>>(s32& dst)
411406
{
412-
if (m_read_offset >= m_datasize)
413-
throw SerializationError("Malformed packet read");
407+
checkReadOffset(m_read_offset);
414408

415409
dst = readS32(&m_data[m_read_offset]);
416410

@@ -426,8 +420,7 @@ NetworkPacket& NetworkPacket::operator<<(s32 src)
426420

427421
NetworkPacket& NetworkPacket::operator>>(v3s16& dst)
428422
{
429-
if (m_read_offset >= m_datasize)
430-
throw SerializationError("Malformed packet read");
423+
checkReadOffset(m_read_offset);
431424

432425
dst = readV3S16(&m_data[m_read_offset]);
433426

@@ -445,8 +438,7 @@ NetworkPacket& NetworkPacket::operator>>(v2s32& dst)
445438

446439
NetworkPacket& NetworkPacket::operator>>(v3s32& dst)
447440
{
448-
if (m_read_offset >= m_datasize)
449-
throw SerializationError("Malformed packet read");
441+
checkReadOffset(m_read_offset);
450442

451443
dst = readV3S32(&m_data[m_read_offset]);
452444

@@ -494,8 +486,7 @@ NetworkPacket& NetworkPacket::operator<<(v3s32 src)
494486

495487
NetworkPacket& NetworkPacket::operator>>(video::SColor& dst)
496488
{
497-
if (m_read_offset >= m_datasize)
498-
throw SerializationError("Malformed packet read");
489+
checkReadOffset(m_read_offset);
499490

500491
dst = readARGB8(&m_data[m_read_offset]);
501492

Diff for: ‎src/network/networkpacket.h

+2
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,8 @@ class NetworkPacket
109109
// Temp, we remove SharedBuffer when migration finished
110110
Buffer<u8> oldForgePacket();
111111
private:
112+
void checkReadOffset(u32 from_offset);
113+
112114
template<typename T> void checkDataSize()
113115
{
114116
if (m_read_offset + sizeof(T) > m_datasize) {

0 commit comments

Comments
 (0)
Please sign in to comment.