Issue #5429: unaligned access in TextIOWrapper cookie parsing (segfaults on SPARC CPUs, and possibly others)

This commit is contained in:
Antoine Pitrou 2009-03-06 21:49:02 +00:00
parent 54d0df69c0
commit 2db74c2412
1 changed files with 10 additions and 10 deletions

View File

@ -1736,11 +1736,11 @@ TextIOWrapper_parseCookie(CookieStruct *cookie, PyObject *cookieObj)
} }
Py_DECREF(cookieLong); Py_DECREF(cookieLong);
cookie->start_pos = * (Py_off_t *)(buffer + OFF_START_POS); memcpy(&cookie->start_pos, buffer + OFF_START_POS, sizeof(cookie->start_pos));
cookie->dec_flags = * (int *) (buffer + OFF_DEC_FLAGS); memcpy(&cookie->dec_flags, buffer + OFF_DEC_FLAGS, sizeof(cookie->dec_flags));
cookie->bytes_to_feed = * (int *) (buffer + OFF_BYTES_TO_FEED); memcpy(&cookie->bytes_to_feed, buffer + OFF_BYTES_TO_FEED, sizeof(cookie->bytes_to_feed));
cookie->chars_to_skip = * (int *) (buffer + OFF_CHARS_TO_SKIP); memcpy(&cookie->chars_to_skip, buffer + OFF_CHARS_TO_SKIP, sizeof(cookie->chars_to_skip));
cookie->need_eof = * (char *) (buffer + OFF_NEED_EOF); memcpy(&cookie->need_eof, buffer + OFF_NEED_EOF, sizeof(cookie->need_eof));
return 0; return 0;
} }
@ -1750,11 +1750,11 @@ TextIOWrapper_buildCookie(CookieStruct *cookie)
{ {
unsigned char buffer[COOKIE_BUF_LEN]; unsigned char buffer[COOKIE_BUF_LEN];
* (Py_off_t *)(buffer + OFF_START_POS) = cookie->start_pos; memcpy(buffer + OFF_START_POS, &cookie->start_pos, sizeof(cookie->start_pos));
* (int *) (buffer + OFF_DEC_FLAGS) = cookie->dec_flags; memcpy(buffer + OFF_DEC_FLAGS, &cookie->dec_flags, sizeof(cookie->dec_flags));
* (int *) (buffer + OFF_BYTES_TO_FEED) = cookie->bytes_to_feed; memcpy(buffer + OFF_BYTES_TO_FEED, &cookie->bytes_to_feed, sizeof(cookie->bytes_to_feed));
* (int *) (buffer + OFF_CHARS_TO_SKIP) = cookie->chars_to_skip; memcpy(buffer + OFF_CHARS_TO_SKIP, &cookie->chars_to_skip, sizeof(cookie->chars_to_skip));
* (char *) (buffer + OFF_NEED_EOF) = cookie->need_eof; memcpy(buffer + OFF_NEED_EOF, &cookie->need_eof, sizeof(cookie->need_eof));
return _PyLong_FromByteArray(buffer, sizeof(buffer), IS_LITTLE_ENDIAN, 0); return _PyLong_FromByteArray(buffer, sizeof(buffer), IS_LITTLE_ENDIAN, 0);
} }