-
Type:
Bug
-
Resolution: Done
-
Priority:
Major - P3
-
Affects Version/s: None
-
Component/s: None
-
None
-
None
-
None
-
None
-
None
-
None
-
None
-
None
When looking at how phongo handles int64 issues, I ran into the following code in WriteResult.c:
} else if (BSON_ITER_HOLDS_INT64(&outer)) {
int64_t val = bson_iter_int64(&outer);
#if SIZEOF_LONG == 4
if (val > INT_MAX) {
add_index_long(writeresult->upsertedIds, index, (double)val);
} else
#endif
add_index_long(return_value, index, val);
}
The case for where SIZEOF_LONG is 4, seems broken if val > INT_MAX. Not only does it use add_index_long with a double value, but you can also not just cast int64 to double, as double only has 53bits precision (and not 64), resulting in potential dataloss.