8000 [3.11] gh-104432: Use `memcpy()` to avoid misaligned loads (GH-104433) by miss-islington · Pull Request #107356 · python/cpython · GitHub
[go: up one dir, main page]

Skip to content

[3.11] gh-104432: Use memcpy() to avoid misaligned loads (GH-104433) #107356

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jul 28, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
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. Patch by
Christopher Chavez.
10 changes: 8 additions & 2 deletions Modules/grpmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -65,8 +65,14 @@ mkgrent(PyObject *module, struct group *p)
Py_DECREF(v);
return NULL;
}
for (member = p->gr_mem; *member != NULL; member++) {
PyObject *x = PyUnicode_DecodeFSDefault(*member);
for (member = p->gr_mem; ; member++) {
char *group_member;
// member can be misaligned
memcpy(&group_member, member, sizeof(group_member));
if (group_member == NULL) {
break;
}
PyObject *x = PyUnicode_DecodeFSDefault(group_member);
if (x == NULL || PyList_Append(w, x) != 0) {
Py_XDECREF(x);
Py_DECREF(w);
Expand Down
22 changes: 17 additions & 5 deletions Modules/socketmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -5657,9 +5657,15 @@ gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)

/* 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;

Expand All @@ -5671,8 +5677,14 @@ gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
}
}

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) {

Expand All @@ -5684,7 +5696,7 @@ gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
#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))
Expand All @@ -5701,7 +5713,7 @@ gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
#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))
Expand Down
0