Skip to content

Commit 5f0430c

Browse files
committed
Fix signed integer reading
Reading signed integers would fail if the integer wasn't negative, because it would be packed as an unsigned integer Added tests to catch problems like this Uniformly handle endian conversion (all done in cmp_read_object)
1 parent 9edd8fe commit 5f0430c

2 files changed

Lines changed: 654 additions & 290 deletions

File tree

cmp.c

Lines changed: 48 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
#include "cmp.h"
66

7-
static const uint32_t version = 2;
7+
static const uint32_t version = 3;
88
static const uint32_t mp_version = 5;
99

1010
enum {
@@ -1137,6 +1137,11 @@ bool cmp_read_char(cmp_ctx_t *ctx, int8_t *c) {
11371137
case CMP_TYPE_SINT8:
11381138
*c = obj.as.s8;
11391139
return true;
1140+
case CMP_TYPE_UINT8:
1141+
if (obj.as.u8 <= 127) {
1142+
*c = obj.as.u8;
1143+
return true;
1144+
}
11401145
default:
11411146
ctx->error = INVALID_TYPE_ERROR;
11421147
return false;
@@ -1155,9 +1160,17 @@ bool cmp_read_short(cmp_ctx_t *ctx, int16_t *s) {
11551160
case CMP_TYPE_SINT8:
11561161
*s = obj.as.s8;
11571162
return true;
1163+
case CMP_TYPE_UINT8:
1164+
*s = obj.as.u8;
1165+
return true;
11581166
case CMP_TYPE_SINT16:
11591167
*s = obj.as.s16;
11601168
return true;
1169+
case CMP_TYPE_UINT16:
1170+
if (obj.as.u16 <= 32767) {
1171+
*s = obj.as.u16;
1172+
return true;
1173+
}
11611174
default:
11621175
ctx->error = INVALID_TYPE_ERROR;
11631176
return false;
@@ -1176,12 +1189,23 @@ bool cmp_read_int(cmp_ctx_t *ctx, int32_t *i) {
11761189
case CMP_TYPE_SINT8:
11771190
*i = obj.as.s8;
11781191
return true;
1192+
case CMP_TYPE_UINT8:
1193+
*i = obj.as.u8;
1194+
return true;
11791195
case CMP_TYPE_SINT16:
11801196
*i = obj.as.s16;
11811197
return true;
1198+
case CMP_TYPE_UINT16:
1199+
*i = obj.as.u16;
1200+
return true;
11821201
case CMP_TYPE_SINT32:
11831202
*i = obj.as.s32;
11841203
return true;
1204+
case CMP_TYPE_UINT32:
1205+
if (obj.as.u32 <= 2147483647) {
1206+
*i = obj.as.u32;
1207+
return true;
1208+
}
11851209
default:
11861210
ctx->error = INVALID_TYPE_ERROR;
11871211
return false;
@@ -1200,15 +1224,29 @@ bool cmp_read_long(cmp_ctx_t *ctx, int64_t *d) {
12001224
case CMP_TYPE_SINT8:
12011225
*d = obj.as.s8;
12021226
return true;
1227+
case CMP_TYPE_UINT8:
1228+
*d = obj.as.u8;
1229+
return true;
12031230
case CMP_TYPE_SINT16:
1204-
*d = be16(obj.as.s16);
1231+
*d = obj.as.s16;
1232+
return true;
1233+
case CMP_TYPE_UINT16:
1234+
*d = obj.as.u16;
12051235
return true;
12061236
case CMP_TYPE_SINT32:
1207-
*d = be32(obj.as.s32);
1237+
*d = obj.as.s32;
1238+
return true;
1239+
case CMP_TYPE_UINT32:
1240+
*d = obj.as.u32;
12081241
return true;
12091242
case CMP_TYPE_SINT64:
1210-
*d = be64(obj.as.s64);
1243+
*d = obj.as.s64;
12111244
return true;
1245+
case CMP_TYPE_UINT64:
1246+
if (obj.as.u64 <= 9223372036854775807) {
1247+
*d = obj.as.u64;
1248+
return true;
1249+
}
12121250
default:
12131251
ctx->error = INVALID_TYPE_ERROR;
12141252
return false;
@@ -1260,7 +1298,7 @@ bool cmp_read_u16(cmp_ctx_t *ctx, uint16_t *s) {
12601298
return false;
12611299
}
12621300

1263-
*s = be16(obj.as.u16);
1301+
*s = obj.as.u16;
12641302
return true;
12651303
}
12661304

@@ -1275,7 +1313,7 @@ bool cmp_read_u32(cmp_ctx_t *ctx, uint32_t *i) {
12751313
return false;
12761314
}
12771315

1278-
*i = be32(obj.as.u32);
1316+
*i = obj.as.u32;
12791317
return true;
12801318
}
12811319

@@ -1290,7 +1328,7 @@ bool cmp_read_u64(cmp_ctx_t *ctx, uint64_t *l) {
12901328
return false;
12911329
}
12921330

1293-
*l = be64(obj.as.u64);
1331+
*l = obj.as.u64;
12941332
return true;
12951333
}
12961334

@@ -1368,13 +1406,13 @@ bool cmp_read_ulong(cmp_ctx_t *ctx, uint64_t *u) {
13681406
*u = obj.as.u8;
13691407
return true;
13701408
case CMP_TYPE_UINT16:
1371-
*u = be16(obj.as.u16);
1409+
*u = obj.as.u16;
13721410
return true;
13731411
case CMP_TYPE_UINT32:
1374-
*u = be32(obj.as.u32);
1412+
*u = obj.as.u32;
13751413
return true;
13761414
case CMP_TYPE_UINT64:
1377-
*u = be64(obj.as.u64);
1415+
*u = obj.as.u64;
13781416
return true;
13791417
default:
13801418
ctx->error = INVALID_TYPE_ERROR;

0 commit comments

Comments
 (0)