You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// 15-Oct-2016, as per [dataformats-binary#30], we got an edge case here
{
intv = _decode32Bits();
if (v < 0) {
_numberLong = ((long) v) + -1L;
_numTypesValid = NR_LONG;
} else {
_numberInt = -v - 1;
}
}
The cast of _numberLong = ((long) v) + -1L; does not adequately prevent overflow; if v is negative, it has to be adjusted to represent the uint32 value, and then negated:
case 2:
{
int v = _decode32Bits();
if (v < 0) {
long unsignedV = (long) v & 0xFFFFFFFFL;
_numberLong = -1L - unsignedV;
_numTypesValid = NR_LONG;
} else {
_numberInt = -v - 1;
}
}
break;
Similar adjustment is required for other sizes.
As a test case, deserializing 3A 9FF0947F should produce -2683344000; currently it results in -1611623298.
The text was updated successfully, but these errors were encountered:
In #30, parsing of positive integers was fixed for the case where the uint32 value overflows a java int:
jackson-dataformats-binary/cbor/src/main/java/com/fasterxml/jackson/dataformat/cbor/CBORParser.java
Lines 679 to 689 in d8f82c7
However, the parsing of negative numbers (major type 1) was not adjusted correctly:
jackson-dataformats-binary/cbor/src/main/java/com/fasterxml/jackson/dataformat/cbor/CBORParser.java
Lines 722 to 731 in d8f82c7
The cast of
_numberLong = ((long) v) + -1L;
does not adequately prevent overflow; if v is negative, it has to be adjusted to represent the uint32 value, and then negated:Similar adjustment is required for other sizes.
As a test case, deserializing
3A 9FF0947F
should produce-2683344000
; currently it results in-1611623298
.The text was updated successfully, but these errors were encountered: