Bug 28531 - [x86] Cancelable syscall stubs fail to preserve 16-byte stack alignment
Summary: [x86] Cancelable syscall stubs fail to preserve 16-byte stack alignment
Status: RESOLVED OBSOLETE
Alias: None
Product: glibc
Classification: Unclassified
Component: libc (show other bugs)
Version: 2.22
: P2 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2021-11-03 11:15 UTC by Andreas Schwab
Modified: 2021-11-03 14:40 UTC (History)
4 users (show)

See Also:
Host: i?86-*-linux*
Target:
Build:
Last reconfirmed:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Andreas Schwab 2021-11-03 11:15:16 UTC
On function entry, stack alignment is 4 mod 16, and there are function calls without realigning the stack.

00000000 <__GI___nanosleep>:
   0:   65 83 3d 0c 00 00 00    cmpl   $0x0,%gs:0xc
   7:   00 
   8:   75 20                   jne    2a <__nanosleep_nocancel+0x20>

0000000a <__nanosleep_nocancel>:
   a:   89 da                   mov    %ebx,%edx
   c:   8b 4c 24 08             mov    0x8(%esp),%ecx
  10:   8b 5c 24 04             mov    0x4(%esp),%ebx
  14:   b8 a2 00 00 00          mov    $0xa2,%eax
  19:   65 ff 15 10 00 00 00    call   *%gs:0x10
  20:   89 d3                   mov    %edx,%ebx
  22:   3d 01 f0 ff ff          cmp    $0xfffff001,%eax
  27:   73 30                   jae    59 <__nanosleep_nocancel+0x4f>
  29:   c3                      ret    
  2a:   e8 fc ff ff ff          call   2b <__nanosleep_nocancel+0x21>
                        2b: R_386_PC32  __libc_enable_asynccancel

This is dormant on master, since there are no longer any cancelable syscalls that are implemented using the stubs.
Comment 1 H.J. Lu 2021-11-03 12:33:27 UTC
(In reply to Andreas Schwab from comment #0)
> 
> This is dormant on master, since there are no longer any cancelable syscalls
> that are implemented using the stubs.

What do you mean by dormant on master? Under what conditions, will it
come back?
Comment 2 Andreas Schwab 2021-11-03 13:03:09 UTC
Whenever a cancelable syscall is implemented using this stub.
Comment 3 H.J. Lu 2021-11-03 13:06:18 UTC
(In reply to Andreas Schwab from comment #2)
> Whenever a cancelable syscall is implemented using this stub.

Where is this stub defined on master branch?
Comment 4 H.J. Lu 2021-11-03 13:16:13 UTC
Do you have a testcase? I tried

diff --git a/nptl/cancellation.c b/nptl/cancellation.c
index 2bd31686fd..ca0b14abc3 100644
--- a/nptl/cancellation.c
+++ b/nptl/cancellation.c
@@ -22,6 +22,14 @@
 #include <futex-internal.h>
 
 
+static void
+check (void)
+{
+  char *sp = CURRENT_STACK_FRAME;
+  if ((((uintptr_t) sp) + sizeof (char *)) & (sizeof (char *) - 1))
+    asm ("hlt");
+}
+
 /* The next two functions are similar to pthread_setcanceltype() but
    more specialized for the use in the cancelable functions like write().
    They do not need to check parameters etc.  */
@@ -29,6 +37,7 @@ int
 attribute_hidden
 __pthread_enable_asynccancel (void)
 {
+  check ();
   struct pthread *self = THREAD_SELF;
   int oldval = THREAD_GETMEM (self, cancelhandling);

on release/2.22/master branch.  "hlt" was never triggered.
Comment 5 Andreas Schwab 2021-11-03 13:56:47 UTC
Sorry, I missed that the arch-dependent <sysdep-cancel.h> no longer exists on master.
Comment 6 Adhemerval Zanella 2021-11-03 14:19:46 UTC
(In reply to Andreas Schwab from comment #5)
> Sorry, I missed that the arch-dependent <sysdep-cancel.h> no longer exists
> on master.

Cancellable entrypoints are implemented solely with C from now on.  Is this really an issue?
Comment 7 Andreas Schwab 2021-11-03 14:35:04 UTC
Yes, this issue has ceased to exist in 2.27.
Comment 8 Andreas Schwab 2021-11-03 14:40:12 UTC
This problem only exists prior to 2.27, which is no longer maintained.