Skip to content

Commit 3708552

Browse files
committed
Fix pandas-dev#54391: Invalid pointer aliasing in SAS7BDAT parser
1 parent 92d1d6a commit 3708552

File tree

1 file changed

+11
-6
lines changed

1 file changed

+11
-6
lines changed

pandas/_libs/byteswap.pyx

+11-6
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,14 @@ from libc.stdint cimport (
1010
uint32_t,
1111
uint64_t,
1212
)
13+
from libc.string cimport memcpy
1314

1415

1516
def read_float_with_byteswap(bytes data, Py_ssize_t offset, bint byteswap):
1617
assert offset + 4 < len(data)
1718
cdef:
1819
const char *data_ptr = data
19-
float res = (<float*>(data_ptr + offset))[0]
20+
float res = (<float *>(data_ptr + offset))[0]
2021
if byteswap:
2122
res = _byteswap_float(res)
2223
return res
@@ -26,7 +27,7 @@ def read_double_with_byteswap(bytes data, Py_ssize_t offset, bint byteswap):
2627
assert offset + 8 < len(data)
2728
cdef:
2829
const char *data_ptr = data
29-
double res = (<double*>(data_ptr + offset))[0]
30+
double res = (<double *>(data_ptr + offset))[0]
3031
if byteswap:
3132
res = _byteswap_double(res)
3233
return res
@@ -82,12 +83,16 @@ cdef extern from *:
8283

8384

8485
cdef float _byteswap_float(float num):
85-
cdef uint32_t *intptr = <uint32_t *>&num
86-
intptr[0] = _byteswap4(intptr[0])
86+
cdef uint32_t num_uint
87+
memcpy(&num_uint, &num, sizeof(float))
88+
num_uint = _byteswap4(num_uint)
89+
memcpy(&num, &num_uint, sizeof(uint32_t))
8790
return num
8891

8992

9093
cdef double _byteswap_double(double num):
91-
cdef uint64_t *intptr = <uint64_t *>&num
92-
intptr[0] = _byteswap8(intptr[0])
94+
cdef uint64_t num_uint
95+
memcpy(&num_uint, &num, sizeof(double))
96+
num_uint = _byteswap8(num_uint)
97+
memcpy(&num, &num_uint, sizeof(uint64_t))
9398
return num

0 commit comments

Comments
 (0)