(__makecontext): Handle more than 6 args correctly. Based on a patch by Masahide...
authorAndreas Jaeger <aj@suse.de>
Sat, 5 Jun 2004 07:54:40 +0000 (07:54 +0000)
committerAndreas Jaeger <aj@suse.de>
Sat, 5 Jun 2004 07:54:40 +0000 (07:54 +0000)
sysdeps/unix/sysv/linux/x86_64/makecontext.c

index b112994..c763556 100644 (file)
@@ -58,11 +58,11 @@ __makecontext (ucontext_t *ucp, void (*func) (void), int argc, ...)
 
   /* Generate room on stack for parameter if needed and uc_link.  */
   sp = (long *) ((long) ucp->uc_stack.ss_sp + ucp->uc_stack.ss_size);
-  sp -= (argc > 6 ? argc : 0) + 1;
+  sp -= (argc > 6 ? argc - 6 : 0) + 1;
   /* Align stack and make space for trampoline address.  */
   sp = (long *) ((((long) sp) & -16L) - 8);
 
-  idx_uc_link = (argc > 6 ? argc : 0) + 1;
+  idx_uc_link = (argc > 6 ? argc - 6 : 0) + 1;
 
   /* Setup context ucp.  */
   /* Address to jump to.  */
@@ -100,7 +100,7 @@ __makecontext (ucontext_t *ucp, void (*func) (void), int argc, ...)
        break;
       default:
        /* Put value on stack.  */
-       sp[8 + (i - 5)] = va_arg (ap, int);
+       sp[(i - 5)] = va_arg (ap, int);
        break;
       }
   va_end (ap);