summaryrefslogtreecommitdiffstats
path: root/Modules/socketmodule.c
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2023-07-27 20:52:39 (GMT)
committerGitHub <noreply@github.com>2023-07-27 20:52:39 (GMT)
commit5daf19d763826a977a596b6fbc035ee03c0deafc (patch)
treeb76616d7e6f31895c49be68cb3ace056803b7e0c /Modules/socketmodule.c
parentc580527d9230212e8f8d697a18b86120109aa653 (diff)
downloadcpython-5daf19d763826a977a596b6fbc035ee03c0deafc.zip
cpython-5daf19d763826a977a596b6fbc035ee03c0deafc.tar.gz
cpython-5daf19d763826a977a596b6fbc035ee03c0deafc.tar.bz2
[3.12] gh-104432: Use `memcpy()` to avoid misaligned loads (GH-104433) (#107355)
gh-104432: Use `memcpy()` to avoid misaligned loads (GH-104433) Fix potential unaligned memory access on C APIs involving returned sequences of `char *` pointers within the :mod:`grp` and :mod:`socket` modules. These were revealed using a ``-fsaniziter=alignment`` build on ARM macOS. (cherry picked from commit f01e4cedba1a17d321664834bb255d9d04ad16ce) Co-authored-by: Christopher Chavez <chrischavez@gmx.us>
Diffstat (limited to 'Modules/socketmodule.c')
-rw-r--r--Modules/socketmodule.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c
index a86aaed..1ae7ab7 100644
--- a/Modules/socketmodule.c
+++ b/Modules/socketmodule.c
@@ -5783,9 +5783,15 @@ gethost_common(socket_state *state, struct hostent *h, struct sockaddr *addr,
/* SF #1511317: h_aliases can be NULL */
if (h->h_aliases) {
- for (pch = h->h_aliases; *pch != NULL; pch++) {
+ for (pch = h->h_aliases; ; pch++) {
int status;
- tmp = PyUnicode_FromString(*pch);
+ char *host_alias;
+ // pch can be misaligned
+ memcpy(&host_alias, pch, sizeof(host_alias));
+ if (host_alias == NULL) {
+ break;
+ }
+ tmp = PyUnicode_FromString(host_alias);
if (tmp == NULL)
goto err;
@@ -5797,8 +5803,14 @@ gethost_common(socket_state *state, struct hostent *h, struct sockaddr *addr,
}
}
- for (pch = h->h_addr_list; *pch != NULL; pch++) {
+ for (pch = h->h_addr_list; ; pch++) {
int status;
+ char *host_address;
+ // pch can be misaligned
+ memcpy(&host_address, pch, sizeof(host_address));
+ if (host_address == NULL) {
+ break;
+ }
switch (af) {
@@ -5810,7 +5822,7 @@ gethost_common(socket_state *state, struct hostent *h, struct sockaddr *addr,
#ifdef HAVE_SOCKADDR_SA_LEN
sin.sin_len = sizeof(sin);
#endif
- memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
+ memcpy(&sin.sin_addr, host_address, sizeof(sin.sin_addr));
tmp = make_ipv4_addr(&sin);
if (pch == h->h_addr_list && alen >= sizeof(sin))
@@ -5827,7 +5839,7 @@ gethost_common(socket_state *state, struct hostent *h, struct sockaddr *addr,
#ifdef HAVE_SOCKADDR_SA_LEN
sin6.sin6_len = sizeof(sin6);
#endif
- memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
+ memcpy(&sin6.sin6_addr, host_address, sizeof(sin6.sin6_addr));
tmp = make_ipv6_addr(&sin6);
if (pch == h->h_addr_list && alen >= sizeof(sin6))