mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
Issue #17073: Fix some integer overflows in sqlite3 module.
This commit is contained in:
parent
3fd4ab356d
commit
3cf96ac248
8 changed files with 196 additions and 61 deletions
|
@ -104,3 +104,69 @@ int _pysqlite_seterror(sqlite3* db, sqlite3_stmt* st)
|
|||
return errorcode;
|
||||
}
|
||||
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
# define IS_LITTLE_ENDIAN 0
|
||||
#else
|
||||
# define IS_LITTLE_ENDIAN 1
|
||||
#endif
|
||||
|
||||
PyObject *
|
||||
_pysqlite_long_from_int64(sqlite3_int64 value)
|
||||
{
|
||||
#ifdef HAVE_LONG_LONG
|
||||
# if SIZEOF_LONG_LONG < 8
|
||||
if (value > PY_LLONG_MAX || value < PY_LLONG_MIN) {
|
||||
return _PyLong_FromByteArray(&value, sizeof(value),
|
||||
IS_LITTLE_ENDIAN, 1 /* signed */);
|
||||
}
|
||||
# endif
|
||||
# if SIZEOF_LONG < SIZEOF_LONG_LONG
|
||||
if (value > LONG_MAX || value < LONG_MIN)
|
||||
return PyLong_FromLongLong(value);
|
||||
# endif
|
||||
#else
|
||||
# if SIZEOF_LONG < 8
|
||||
if (value > LONG_MAX || value < LONG_MIN) {
|
||||
return _PyLong_FromByteArray(&value, sizeof(value),
|
||||
IS_LITTLE_ENDIAN, 1 /* signed */);
|
||||
}
|
||||
# endif
|
||||
#endif
|
||||
return PyLong_FromLong(value);
|
||||
}
|
||||
|
||||
sqlite3_int64
|
||||
_pysqlite_long_as_int64(PyObject * py_val)
|
||||
{
|
||||
int overflow;
|
||||
#ifdef HAVE_LONG_LONG
|
||||
PY_LONG_LONG value = PyLong_AsLongLongAndOverflow(py_val, &overflow);
|
||||
#else
|
||||
long value = PyLong_AsLongAndOverflow(py_val, &overflow);
|
||||
#endif
|
||||
if (value == -1 && PyErr_Occurred())
|
||||
return -1;
|
||||
if (!overflow) {
|
||||
#ifdef HAVE_LONG_LONG
|
||||
# if SIZEOF_LONG_LONG > 8
|
||||
if (-0x8000000000000000LL <= value && value <= 0x7FFFFFFFFFFFFFFFLL)
|
||||
# endif
|
||||
#else
|
||||
# if SIZEOF_LONG > 8
|
||||
if (-0x8000000000000000L <= value && value <= 0x7FFFFFFFFFFFFFFFL)
|
||||
# endif
|
||||
#endif
|
||||
return value;
|
||||
}
|
||||
else if (sizeof(value) < sizeof(sqlite3_int64)) {
|
||||
sqlite3_int64 int64val;
|
||||
if (_PyLong_AsByteArray((PyLongObject *)py_val,
|
||||
(unsigned char *)&int64val, sizeof(int64val),
|
||||
IS_LITTLE_ENDIAN, 1 /* signed */) >= 0) {
|
||||
return int64val;
|
||||
}
|
||||
}
|
||||
PyErr_SetString(PyExc_OverflowError,
|
||||
"Python int too large to convert to SQLite INTEGER");
|
||||
return -1;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue