]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
pselect.c: Pass a pointer to SYSCALL_CANCEL [BZ #26606]
authorH.J. Lu <hjl.tools@gmail.com>
Sat, 12 Sep 2020 02:36:12 +0000 (19:36 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Tue, 15 Sep 2020 11:28:54 +0000 (04:28 -0700)
commit a92f4e6299fe0e3cb6f77e79de00817aece501ce
Author: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Date:   Mon Jul 6 13:27:12 2020 -0300

    linux: Add time64 pselect support

changed pselect.c to

     r = SYSCALL_CANCEL (pselect6_time64, nfds, readfds, writefds, exceptfds,
  timeout,
  ((__syscall_ulong_t[]){ (uintptr_t) sigmask,
  __NSIG_BYTES }));

which doesn't work with x32's ARGIFY and data passed to syscall isn't
initialized with sigmask and __NSIG_BYTES.  Change to

     __syscall_ulong_t data[2] =
{
  (uintptr_t) sigmask, __NSIG_BYTES
};
      r = SYSCALL_CANCEL (pselect6_time64, nfds, readfds, writefds, exceptfds,
  timeout, data);

fixes [BZ #26606].

sysdeps/unix/sysv/linux/pselect.c

index ed361210234e3cd8dc71a8d66da7bed53fab8c83..165b2b5e666478ed1d59db9f970e4f92be301764 100644 (file)
@@ -44,10 +44,13 @@ __pselect64 (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
   int r;
   if (supports_time64 ())
     {
+      /* NB: This is required by ARGIFY used in x32 internal_syscallN.  */
+      __syscall_ulong_t data[2] =
+       {
+         (uintptr_t) sigmask, __NSIG_BYTES
+       };
       r = SYSCALL_CANCEL (pselect6_time64, nfds, readfds, writefds, exceptfds,
-                         timeout,
-                         ((__syscall_ulong_t[]){ (uintptr_t) sigmask,
-                                                 __NSIG_BYTES }));
+                         timeout, data);
       if (r == 0 || errno != ENOSYS)
        return r;