s[1] = (int)(c_value & 0xff);
len = 2;
}
- else {
+ else if (c_value < 0x7fffffffL) {
s[0] = LONG_BINGET;
s[1] = (int)(c_value & 0xff);
s[2] = (int)((c_value >> 8) & 0xff);
s[4] = (int)((c_value >> 24) & 0xff);
len = 5;
}
+ else { /* unlikely */
+ PyErr_SetString(PicklingError,
+ "memo id too large for LONG_BINGET");
+ return -1;
+ }
}
if (self->write_func(self, s, len) < 0)
goto finally;
}
else {
- if (p >= 256) {
+ if (p < 256) {
+ c_str[0] = BINPUT;
+ c_str[1] = p;
+ len = 2;
+ }
+ else if (p < 0x7fffffffL) {
c_str[0] = LONG_BINPUT;
c_str[1] = (int)(p & 0xff);
c_str[2] = (int)((p >> 8) & 0xff);
c_str[4] = (int)((p >> 24) & 0xff);
len = 5;
}
- else {
- c_str[0] = BINPUT;
- c_str[1] = p;
- len = 2;
+ else { /* unlikely */
+ PyErr_SetString(PicklingError,
+ "memo id too large for LONG_BINPUT");
+ goto finally;
}
}
c_str[1] = size;
len = 2;
}
- else if (size <= INT_MAX) {
+ else if (size <= 0x7fffffffL) {
c_str[0] = BINSTRING;
for (i = 1; i < 5; i++)
c_str[i] = (int)(size >> ((i - 1) * 8));
len = 5;
}
- else
+ else {
+ PyErr_SetString(PyExc_OverflowError,
+ "cannot serialize a string larger than 2 GiB");
return -1; /* string too large */
+ }
if (self->write_func(self, c_str, len) < 0)
return -1;
if ((size = PyString_Size(repr)) < 0)
goto err;
- if (size > INT_MAX)
- return -1; /* string too large */
+ if (size > 0x7fffffffL) {
+ PyErr_SetString(PyExc_OverflowError,
+ "cannot serialize a Unicode string larger than 2 GiB");
+ goto err; /* string too large */
+ }
c_str[0] = BINUNICODE;
for (i = 1; i < 5; i++)