OSDN Git Service

Use the MAX_ERRNO constant.
authorElliott Hughes <enh@google.com>
Fri, 3 Jan 2014 00:23:24 +0000 (16:23 -0800)
committerElliott Hughes <enh@google.com>
Fri, 3 Jan 2014 00:23:24 +0000 (16:23 -0800)
If you're going to hardcode a constant, you could at least try to
get the constant right...

Change-Id: I886a2593357d1c4dfd6c42649c63e8a35c15a441

libc/arch-x86/bionic/syscall.S
libc/arch-x86/bionic/vfork.S

index 4452da4..0178f41 100644 (file)
@@ -10,8 +10,7 @@
  *     %ebp: arg5                -   callee save
  */
 
-#include <asm/unistd.h>
-#include <machine/asm.h>
+#include <private/bionic_asm.h>
 
 ENTRY(syscall)
     # Push the callee save registers.
@@ -34,7 +33,7 @@ ENTRY(syscall)
     int     $0x80
 
     # Error?
-    cmpl    $-4095, %eax
+    cmpl    $-MAX_ERRNO, %eax
     jb      1f
     # Yes, so set errno.
     negl    %eax
index 7b62449..ec6f6ca 100644 (file)
@@ -1,22 +1,45 @@
-#include <machine/asm.h>
-#include <asm/unistd.h>
-
-/* Get rid of the stack modifications (popl/ret) after vfork() success.
- * vfork is VERY sneaky. One has to be very careful about what can be done
- * between a successful vfork and a a subsequent execve()
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
  */
 
+#include <private/bionic_asm.h>
+
+// This custom code preserves the return address across the system call.
+
 ENTRY(vfork)
-    /* grab the return address */
-    popl    %ecx
-    movl    $__NR_vfork, %eax
-    int     $0x80
-    cmpl    $-129, %eax
-    jb      1f
-    negl    %eax
-    pushl   %eax
-    call    __set_errno
-    orl     $-1, %eax
+  popl    %ecx  // Grab the return address.
+  movl    $__NR_vfork, %eax
+  int     $0x80
+  cmpl    $-MAX_ERRNO, %eax
+  jb      1f
+  negl    %eax
+  pushl   %eax
+  call    __set_errno
+  orl     $-1, %eax
 1:
-    jmp     *%ecx
+    jmp     *%ecx  // Jump to the stored return address.
 END(vfork)