Mercurial > cpython-lru_cache-weakref
diff Objects/floatobject.c @ 35987:8eda1a58a490 legacy-trunk
Fix bug
[ 1346144 ] Segfaults from unaligned loads in floatobject.c
by using memcpy and not just blinding casting char* to double*.
Thanks to Rune Holm for the report.
| author | Michael W. Hudson <mwh@python.net> |
|---|---|
| date | Mon, 05 Dec 2005 00:27:49 +0000 |
| parents | cf7a849ce61f |
| children | 9541369b0dca |
line wrap: on
line diff
--- a/Objects/floatobject.c Sun Dec 04 20:25:23 2005 +0000 +++ b/Objects/floatobject.c Mon Dec 05 00:27:49 2005 +0000 @@ -1631,20 +1631,24 @@ return x; } else { + float x; + if ((float_format == ieee_little_endian_format && !le) || (float_format == ieee_big_endian_format && le)) { - char buf[8]; + char buf[4]; char *d = &buf[3]; int i; for (i = 0; i < 4; i++) { *d-- = *p++; } - return *(float*)&buf[0]; + memcpy(&x, buf, 4); } else { - return *(float*)p; + memcpy(&x, p, 4); } + + return x; } } @@ -1722,6 +1726,8 @@ return x; } else { + double x; + if ((double_format == ieee_little_endian_format && !le) || (double_format == ieee_big_endian_format && le)) { char buf[8]; @@ -1731,10 +1737,12 @@ for (i = 0; i < 8; i++) { *d-- = *p++; } - return *(double*)&buf[0]; + memcpy(&x, buf, 8); } else { - return *(double*)p; + memcpy(&x, p, 8); } + + return x; } }
