diff options
author | Antoine Pitrou <solipsis@pitrou.net> | 2012-09-20 18:56:47 (GMT) |
---|---|---|
committer | Antoine Pitrou <solipsis@pitrou.net> | 2012-09-20 18:56:47 (GMT) |
commit | ca8aa4acf6755dd012706e1e38fb737ae83ab5c6 (patch) | |
tree | 310b20a536a99dd80657e2d22e07bb1466d0a895 /Include | |
parent | 1c47222a256f2977dcbb36c05dce7a5ae8e6ae06 (diff) | |
download | cpython-ca8aa4acf6755dd012706e1e38fb737ae83ab5c6.zip cpython-ca8aa4acf6755dd012706e1e38fb737ae83ab5c6.tar.gz cpython-ca8aa4acf6755dd012706e1e38fb737ae83ab5c6.tar.bz2 |
Issue #15144: Fix possible integer overflow when handling pointers as integer values, by using Py_uintptr_t instead of size_t.
Patch by Serhiy Storchaka.
Diffstat (limited to 'Include')
-rw-r--r-- | Include/objimpl.h | 9 | ||||
-rw-r--r-- | Include/pymacro.h | 14 |
2 files changed, 17 insertions, 6 deletions
diff --git a/Include/objimpl.h b/Include/objimpl.h index b1a624c..3d5f509 100644 --- a/Include/objimpl.h +++ b/Include/objimpl.h @@ -181,12 +181,9 @@ PyAPI_FUNC(PyVarObject *) _PyObject_NewVar(PyTypeObject *, Py_ssize_t); #endif #define _PyObject_VAR_SIZE(typeobj, nitems) \ - (size_t) \ - ( ( (typeobj)->tp_basicsize + \ - (nitems)*(typeobj)->tp_itemsize + \ - (SIZEOF_VOID_P - 1) \ - ) & ~(SIZEOF_VOID_P - 1) \ - ) + _Py_SIZE_ROUND_UP((typeobj)->tp_basicsize + \ + (nitems)*(typeobj)->tp_itemsize, \ + SIZEOF_VOID_P) #define PyObject_NEW(type, typeobj) \ ( (type *) PyObject_Init( \ diff --git a/Include/pymacro.h b/Include/pymacro.h index 1dc0c61..ce1cbef 100644 --- a/Include/pymacro.h +++ b/Include/pymacro.h @@ -52,4 +52,18 @@ #define PyDoc_STR(str) "" #endif +/* Below "a" is a power of 2. */ +/* Round down size "n" to be a multiple of "a". */ +#define _Py_SIZE_ROUND_DOWN(n, a) ((size_t)(n) & ~(size_t)((a) - 1)) +/* Round up size "n" to be a multiple of "a". */ +#define _Py_SIZE_ROUND_UP(n, a) (((size_t)(n) + \ + (size_t)((a) - 1)) & ~(size_t)((a) - 1)) +/* Round pointer "p" down to the closest "a"-aligned address <= "p". */ +#define _Py_ALIGN_DOWN(p, a) ((void *)((Py_uintptr_t)(p) & ~(Py_uintptr_t)((a) - 1))) +/* Round pointer "p" up to the closest "a"-aligned address >= "p". */ +#define _Py_ALIGN_UP(p, a) ((void *)(((Py_uintptr_t)(p) + \ + (Py_uintptr_t)((a) - 1)) & ~(Py_uintptr_t)((a) - 1))) +/* Check if pointer "p" is aligned to "a"-bytes boundary. */ +#define _Py_IS_ALIGNED(p, a) (!((Py_uintptr_t)(p) & (Py_uintptr_t)((a) - 1))) + #endif /* Py_PYMACRO_H */ |