From: ShadowNinja Date: Fri, 21 Mar 2014 09:18:35 +0000 (-0400) Subject: Fix serializing of signed numbers in serializeStructToString X-Git-Url: http://81.2.79.47:8989/gitweb/?a=commitdiff_plain;h=5fefc4bbf6380960f11f0b125fc51b6efdc19e2e;p=zefram%2Fminetest%2Fminetest_engine.git Fix serializing of signed numbers in serializeStructToString --- diff --git a/src/util/serialize.cpp b/src/util/serialize.cpp index f05cfcc9..8779ee63 100644 --- a/src/util/serialize.cpp +++ b/src/util/serialize.cpp @@ -385,6 +385,9 @@ fail: } +// Casts *buf to a signed or unsigned fixed-width integer of 'w' width +#define SIGN_CAST(w, buf) (is_unsigned ? *((u##w *) buf) : *((s##w *) buf)) + bool serializeStructToString(std::string *out, std::string format, void *value) { @@ -412,15 +415,15 @@ bool serializeStructToString(std::string *out, case 'i': if (width == 16) { bufpos += PADDING(bufpos, u16); - os << *((u16 *) bufpos); + os << SIGN_CAST(16, bufpos); bufpos += sizeof(u16); } else if (width == 32) { bufpos += PADDING(bufpos, u32); - os << *((u32 *) bufpos); + os << SIGN_CAST(32, bufpos); bufpos += sizeof(u32); } else if (width == 64) { bufpos += PADDING(bufpos, u64); - os << *((u64 *) bufpos); + os << SIGN_CAST(64, bufpos); bufpos += sizeof(u64); } break; @@ -474,3 +477,5 @@ bool serializeStructToString(std::string *out, return true; } + +#undef SIGN_CAST