mirror of
https://github.com/json-c/json-c.git
synced 2026-09-07 08:36:50 +08:00
Merge pull request #933 from dxbjavid/int-inc-int64min-overflow
fix signed overflow negating INT64_MIN in json_object_int_inc
This commit is contained in:
+3
-3
@@ -1122,14 +1122,14 @@ int json_object_int_inc(struct json_object *jso, int64_t val)
|
|||||||
{
|
{
|
||||||
jsoint->cint.c_uint64 = UINT64_MAX;
|
jsoint->cint.c_uint64 = UINT64_MAX;
|
||||||
}
|
}
|
||||||
else if (val < 0 && jsoint->cint.c_uint64 < (uint64_t)(-val))
|
else if (val < 0 && jsoint->cint.c_uint64 < (0 - (uint64_t)val))
|
||||||
{
|
{
|
||||||
jsoint->cint.c_int64 = (int64_t)jsoint->cint.c_uint64 + val;
|
jsoint->cint.c_int64 = (int64_t)jsoint->cint.c_uint64 + val;
|
||||||
jsoint->cint_type = json_object_int_type_int64;
|
jsoint->cint_type = json_object_int_type_int64;
|
||||||
}
|
}
|
||||||
else if (val < 0 && jsoint->cint.c_uint64 >= (uint64_t)(-val))
|
else if (val < 0 && jsoint->cint.c_uint64 >= (0 - (uint64_t)val))
|
||||||
{
|
{
|
||||||
jsoint->cint.c_uint64 -= (uint64_t)(-val);
|
jsoint->cint.c_uint64 -= (0 - (uint64_t)val);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -68,6 +68,17 @@ int main(int argc, char **argv)
|
|||||||
assert(json_object_get_uint64(tmp) == 0);
|
assert(json_object_get_uint64(tmp) == 0);
|
||||||
json_object_put(tmp);
|
json_object_put(tmp);
|
||||||
printf("UINT64 ADD UNDERFLOW PASSED\n");
|
printf("UINT64 ADD UNDERFLOW PASSED\n");
|
||||||
|
// Decrement by INT64_MIN: -val would overflow int64_t, so the magnitude
|
||||||
|
// has to be taken in unsigned space.
|
||||||
|
tmp = json_object_new_uint64(100);
|
||||||
|
json_object_int_inc(tmp, INT64_MIN);
|
||||||
|
assert(json_object_get_int64(tmp) == INT64_MIN + 100);
|
||||||
|
json_object_put(tmp);
|
||||||
|
tmp = json_object_new_uint64(UINT64_MAX);
|
||||||
|
json_object_int_inc(tmp, INT64_MIN);
|
||||||
|
assert(json_object_get_uint64(tmp) == (uint64_t)INT64_MAX);
|
||||||
|
json_object_put(tmp);
|
||||||
|
printf("UINT64 ADD INT64_MIN PASSED\n");
|
||||||
|
|
||||||
printf("PASSED\n");
|
printf("PASSED\n");
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -7,4 +7,5 @@ INT64 ADD UNDERFLOW PASSED
|
|||||||
UINT64 ADD PASSED
|
UINT64 ADD PASSED
|
||||||
UINT64 ADD OVERFLOW PASSED
|
UINT64 ADD OVERFLOW PASSED
|
||||||
UINT64 ADD UNDERFLOW PASSED
|
UINT64 ADD UNDERFLOW PASSED
|
||||||
|
UINT64 ADD INT64_MIN PASSED
|
||||||
PASSED
|
PASSED
|
||||||
|
|||||||
Reference in New Issue
Block a user