From 2500bee4e75f89270aef68221b832ff9ce748aae Mon Sep 17 00:00:00 2001 From: Samuel Thibault Date: Sun, 13 Mar 2016 23:26:59 +0100 Subject: Do not use the same index for ports and for new fds --- sysdeps/mach/hurd/recvmsg.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) (limited to 'sysdeps/mach/hurd/recvmsg.c') diff --git a/sysdeps/mach/hurd/recvmsg.c b/sysdeps/mach/hurd/recvmsg.c index 0200b1363e..dfd4145b60 100644 --- a/sysdeps/mach/hurd/recvmsg.c +++ b/sysdeps/mach/hurd/recvmsg.c @@ -41,6 +41,7 @@ __libc_recvmsg (int fd, struct msghdr *message, int flags) char *buf; int nfds, *opened_fds = NULL; int i, ii, j; + int newfds; error_t reauthenticate (mach_port_t port, mach_port_t *result) { @@ -163,6 +164,8 @@ __libc_recvmsg (int fd, struct msghdr *message, int flags) /* This counts how many ports we processed completely. */ i = 0; + /* This counts how many new fds we create. */ + newfds = 0; for (cmsg = CMSG_FIRSTHDR (message); cmsg; @@ -178,17 +181,19 @@ __libc_recvmsg (int fd, struct msghdr *message, int flags) for (j = 0; j < nfds; j++) { - err = reauthenticate (ports[i], &newports[i]); + err = reauthenticate (ports[i], &newports[newfds]); if (err) goto cleanup; - fds[j] = opened_fds[i] = _hurd_intern_fd (newports[i], fds[j], 0); + fds[j] = opened_fds[newfds] = _hurd_intern_fd (newports[newfds], + fds[j], 0); if (fds[j] == -1) { err = errno; - __mach_port_deallocate (__mach_task_self (), newports[i]); + __mach_port_deallocate (__mach_task_self (), newports[newfds]); goto cleanup; } i++; + newfds++; } } } @@ -205,7 +210,7 @@ cleanup: if (nports > 0) { ii = 0; - j = 0; + newfds = 0; for (cmsg = CMSG_FIRSTHDR (message); cmsg; cmsg = CMSG_NXTHDR (message, cmsg)) @@ -214,10 +219,10 @@ cleanup: { nfds = (cmsg->cmsg_len - CMSG_ALIGN (sizeof (struct cmsghdr))) / sizeof (int); - for (j = 0; j < nfds && ii < i; j++, ii++) + for (j = 0; j < nfds && ii < i; j++, ii++, newfds++) { - _hurd_fd_close (_hurd_fd_get (opened_fds[ii])); - __mach_port_deallocate (__mach_task_self (), newports[ii]); + _hurd_fd_close (_hurd_fd_get (opened_fds[newfds])); + __mach_port_deallocate (__mach_task_self (), newports[newfds]); __mach_port_deallocate (__mach_task_self (), ports[ii]); } } -- cgit v1.2.3