From 00490ae3f351e07ed4cc2a94b11cba6a22f37311 Mon Sep 17 00:00:00 2001
From: Nick Kralevich <nnk@google.com>
Date: Tue, 3 Feb 2015 11:27:25 -0800
Subject: [PATCH] Ensure raw fchmod/fchmodat syscalls are hidden.

In https://android-review.googlesource.com/#/c/127908/5/libc/SYSCALLS.TXT@116
Elliott said:

  for LP64 these will be hidden. for LP32 we were cowards and left
  them all public for compatibility (though i don't think we ever
  dremeled to see whether it was needed). we don't have an easy
  way to recognize additions, though, so we can't prevent adding
  new turds.

Add a mechanism to prevent the adding of new turds, and use that
mechanism on the fchmod/fchmodat system calls.

Bug: 19233951
Change-Id: I98f98345970b631a379f348df57858f9fc3d57c0
---
 libc/SYSCALLS.TXT                                         | 4 ++--
 libc/arch-arm/syscalls/{__fchmod.S => ___fchmod.S}        | 5 +++--
 libc/arch-arm/syscalls/{__fchmodat.S => ___fchmodat.S}    | 5 +++--
 libc/arch-arm64/syscalls/{__fchmod.S => ___fchmod.S}      | 6 +++---
 libc/arch-arm64/syscalls/{__fchmodat.S => ___fchmodat.S}  | 6 +++---
 libc/arch-mips/syscalls/{__fchmod.S => ___fchmod.S}       | 5 +++--
 libc/arch-mips/syscalls/{__fchmodat.S => ___fchmodat.S}   | 5 +++--
 libc/arch-mips64/syscalls/{__fchmod.S => ___fchmod.S}     | 6 +++---
 libc/arch-mips64/syscalls/{__fchmodat.S => ___fchmodat.S} | 6 +++---
 libc/arch-x86/syscalls/{__fchmod.S => ___fchmod.S}        | 5 +++--
 libc/arch-x86/syscalls/{__fchmodat.S => ___fchmodat.S}    | 5 +++--
 libc/arch-x86_64/syscalls/{__fchmod.S => ___fchmod.S}     | 6 +++---
 libc/arch-x86_64/syscalls/{__fchmodat.S => ___fchmodat.S} | 6 +++---
 libc/bionic/fchmod.cpp                                    | 4 ++--
 libc/bionic/fchmodat.cpp                                  | 4 ++--
 libc/tools/gensyscalls.py                                 | 5 +++--
 16 files changed, 45 insertions(+), 38 deletions(-)
 rename libc/arch-arm/syscalls/{__fchmod.S => ___fchmod.S} (84%)
 rename libc/arch-arm/syscalls/{__fchmodat.S => ___fchmodat.S} (82%)
 rename libc/arch-arm64/syscalls/{__fchmod.S => ___fchmod.S} (81%)
 rename libc/arch-arm64/syscalls/{__fchmodat.S => ___fchmodat.S} (80%)
 rename libc/arch-mips/syscalls/{__fchmod.S => ___fchmod.S} (84%)
 rename libc/arch-mips/syscalls/{__fchmodat.S => ___fchmodat.S} (82%)
 rename libc/arch-mips64/syscalls/{__fchmod.S => ___fchmod.S} (87%)
 rename libc/arch-mips64/syscalls/{__fchmodat.S => ___fchmodat.S} (86%)
 rename libc/arch-x86/syscalls/{__fchmod.S => ___fchmod.S} (91%)
 rename libc/arch-x86/syscalls/{__fchmodat.S => ___fchmodat.S} (91%)
 rename libc/arch-x86_64/syscalls/{__fchmod.S => ___fchmod.S} (83%)
 rename libc/arch-x86_64/syscalls/{__fchmodat.S => ___fchmodat.S} (82%)

diff --git a/libc/SYSCALLS.TXT b/libc/SYSCALLS.TXT
index d68a00fd1..aae7de779 100644
--- a/libc/SYSCALLS.TXT
+++ b/libc/SYSCALLS.TXT
@@ -113,7 +113,7 @@ int         writev(int, const struct iovec*, int)  all
 int         __fcntl64:fcntl64(int, int, void*)  arm,mips,x86
 int         fcntl(int, int, void*)  arm64,mips64,x86_64
 int         flock(int, int)   all
-int         __fchmod:fchmod(int, mode_t)  all
+int         ___fchmod:fchmod(int, mode_t)  all
 int         dup(int)  all
 int         pipe2(int*, int) all
 int         dup3(int, int, int)   all
@@ -131,7 +131,7 @@ int __getdents64:getdents64(unsigned int, struct dirent*, unsigned int)   arm,ar
 
 int __openat:openat(int, const char*, int, mode_t) all
 int faccessat(int, const char*, int, int)  all
-int __fchmodat:fchmodat(int, const char*, mode_t)  all
+int ___fchmodat:fchmodat(int, const char*, mode_t)  all
 int fchownat(int, const char*, uid_t, gid_t, int)  all
 int fstatat64|fstatat:fstatat64(int, const char*, struct stat*, int)   arm,mips,x86
 int fstatat64|fstatat:newfstatat(int, const char*, struct stat*, int)  arm64,x86_64
diff --git a/libc/arch-arm/syscalls/__fchmod.S b/libc/arch-arm/syscalls/___fchmod.S
similarity index 84%
rename from libc/arch-arm/syscalls/__fchmod.S
rename to libc/arch-arm/syscalls/___fchmod.S
index ff888a17e..c6da4f89e 100644
--- a/libc/arch-arm/syscalls/__fchmod.S
+++ b/libc/arch-arm/syscalls/___fchmod.S
@@ -2,7 +2,7 @@
 
 #include <private/bionic_asm.h>
 
-ENTRY(__fchmod)
+ENTRY(___fchmod)
     mov     ip, r7
     ldr     r7, =__NR_fchmod
     swi     #0
@@ -11,4 +11,5 @@ ENTRY(__fchmod)
     bxls    lr
     neg     r0, r0
     b       __set_errno_internal
-END(__fchmod)
+END(___fchmod)
+.hidden ___fchmod
diff --git a/libc/arch-arm/syscalls/__fchmodat.S b/libc/arch-arm/syscalls/___fchmodat.S
similarity index 82%
rename from libc/arch-arm/syscalls/__fchmodat.S
rename to libc/arch-arm/syscalls/___fchmodat.S
index 4d10f00b8..91bbda5c0 100644
--- a/libc/arch-arm/syscalls/__fchmodat.S
+++ b/libc/arch-arm/syscalls/___fchmodat.S
@@ -2,7 +2,7 @@
 
 #include <private/bionic_asm.h>
 
-ENTRY(__fchmodat)
+ENTRY(___fchmodat)
     mov     ip, r7
     ldr     r7, =__NR_fchmodat
     swi     #0
@@ -11,4 +11,5 @@ ENTRY(__fchmodat)
     bxls    lr
     neg     r0, r0
     b       __set_errno_internal
-END(__fchmodat)
+END(___fchmodat)
+.hidden ___fchmodat
diff --git a/libc/arch-arm64/syscalls/__fchmod.S b/libc/arch-arm64/syscalls/___fchmod.S
similarity index 81%
rename from libc/arch-arm64/syscalls/__fchmod.S
rename to libc/arch-arm64/syscalls/___fchmod.S
index 05c67fc37..a143c65f0 100644
--- a/libc/arch-arm64/syscalls/__fchmod.S
+++ b/libc/arch-arm64/syscalls/___fchmod.S
@@ -2,7 +2,7 @@
 
 #include <private/bionic_asm.h>
 
-ENTRY(__fchmod)
+ENTRY(___fchmod)
     mov     x8, __NR_fchmod
     svc     #0
 
@@ -11,5 +11,5 @@ ENTRY(__fchmod)
     b.hi    __set_errno_internal
 
     ret
-END(__fchmod)
-.hidden __fchmod
+END(___fchmod)
+.hidden ___fchmod
diff --git a/libc/arch-arm64/syscalls/__fchmodat.S b/libc/arch-arm64/syscalls/___fchmodat.S
similarity index 80%
rename from libc/arch-arm64/syscalls/__fchmodat.S
rename to libc/arch-arm64/syscalls/___fchmodat.S
index 2406ea8e3..1ab3736ba 100644
--- a/libc/arch-arm64/syscalls/__fchmodat.S
+++ b/libc/arch-arm64/syscalls/___fchmodat.S
@@ -2,7 +2,7 @@
 
 #include <private/bionic_asm.h>
 
-ENTRY(__fchmodat)
+ENTRY(___fchmodat)
     mov     x8, __NR_fchmodat
     svc     #0
 
@@ -11,5 +11,5 @@ ENTRY(__fchmodat)
     b.hi    __set_errno_internal
 
     ret
-END(__fchmodat)
-.hidden __fchmodat
+END(___fchmodat)
+.hidden ___fchmodat
diff --git a/libc/arch-mips/syscalls/__fchmod.S b/libc/arch-mips/syscalls/___fchmod.S
similarity index 84%
rename from libc/arch-mips/syscalls/__fchmod.S
rename to libc/arch-mips/syscalls/___fchmod.S
index 9bc491c21..ac102ec93 100644
--- a/libc/arch-mips/syscalls/__fchmod.S
+++ b/libc/arch-mips/syscalls/___fchmod.S
@@ -2,7 +2,7 @@
 
 #include <private/bionic_asm.h>
 
-ENTRY(__fchmod)
+ENTRY(___fchmod)
     .set noreorder
     .cpload t9
     li v0, __NR_fchmod
@@ -16,4 +16,5 @@ ENTRY(__fchmod)
     j t9
     nop
     .set reorder
-END(__fchmod)
+END(___fchmod)
+.hidden ___fchmod
diff --git a/libc/arch-mips/syscalls/__fchmodat.S b/libc/arch-mips/syscalls/___fchmodat.S
similarity index 82%
rename from libc/arch-mips/syscalls/__fchmodat.S
rename to libc/arch-mips/syscalls/___fchmodat.S
index 07ea8f8b3..d581efa3b 100644
--- a/libc/arch-mips/syscalls/__fchmodat.S
+++ b/libc/arch-mips/syscalls/___fchmodat.S
@@ -2,7 +2,7 @@
 
 #include <private/bionic_asm.h>
 
-ENTRY(__fchmodat)
+ENTRY(___fchmodat)
     .set noreorder
     .cpload t9
     li v0, __NR_fchmodat
@@ -16,4 +16,5 @@ ENTRY(__fchmodat)
     j t9
     nop
     .set reorder
-END(__fchmodat)
+END(___fchmodat)
+.hidden ___fchmodat
diff --git a/libc/arch-mips64/syscalls/__fchmod.S b/libc/arch-mips64/syscalls/___fchmod.S
similarity index 87%
rename from libc/arch-mips64/syscalls/__fchmod.S
rename to libc/arch-mips64/syscalls/___fchmod.S
index 94dd0a1e7..7c16c54d1 100644
--- a/libc/arch-mips64/syscalls/__fchmod.S
+++ b/libc/arch-mips64/syscalls/___fchmod.S
@@ -2,7 +2,7 @@
 
 #include <private/bionic_asm.h>
 
-ENTRY(__fchmod)
+ENTRY(___fchmod)
     .set push
     .set noreorder
     li v0, __NR_fchmod
@@ -22,5 +22,5 @@ ENTRY(__fchmod)
     j t9
     move ra, t0
     .set pop
-END(__fchmod)
-.hidden __fchmod
+END(___fchmod)
+.hidden ___fchmod
diff --git a/libc/arch-mips64/syscalls/__fchmodat.S b/libc/arch-mips64/syscalls/___fchmodat.S
similarity index 86%
rename from libc/arch-mips64/syscalls/__fchmodat.S
rename to libc/arch-mips64/syscalls/___fchmodat.S
index 79f453f4c..50f108ebf 100644
--- a/libc/arch-mips64/syscalls/__fchmodat.S
+++ b/libc/arch-mips64/syscalls/___fchmodat.S
@@ -2,7 +2,7 @@
 
 #include <private/bionic_asm.h>
 
-ENTRY(__fchmodat)
+ENTRY(___fchmodat)
     .set push
     .set noreorder
     li v0, __NR_fchmodat
@@ -22,5 +22,5 @@ ENTRY(__fchmodat)
     j t9
     move ra, t0
     .set pop
-END(__fchmodat)
-.hidden __fchmodat
+END(___fchmodat)
+.hidden ___fchmodat
diff --git a/libc/arch-x86/syscalls/__fchmod.S b/libc/arch-x86/syscalls/___fchmod.S
similarity index 91%
rename from libc/arch-x86/syscalls/__fchmod.S
rename to libc/arch-x86/syscalls/___fchmod.S
index 7ad213e7e..119a69564 100644
--- a/libc/arch-x86/syscalls/__fchmod.S
+++ b/libc/arch-x86/syscalls/___fchmod.S
@@ -2,7 +2,7 @@
 
 #include <private/bionic_asm.h>
 
-ENTRY(__fchmod)
+ENTRY(___fchmod)
     pushl   %ebx
     .cfi_def_cfa_offset 8
     .cfi_rel_offset ebx, 0
@@ -23,4 +23,5 @@ ENTRY(__fchmod)
     popl    %ecx
     popl    %ebx
     ret
-END(__fchmod)
+END(___fchmod)
+.hidden ___fchmod
diff --git a/libc/arch-x86/syscalls/__fchmodat.S b/libc/arch-x86/syscalls/___fchmodat.S
similarity index 91%
rename from libc/arch-x86/syscalls/__fchmodat.S
rename to libc/arch-x86/syscalls/___fchmodat.S
index f03c03f41..b15bb6448 100644
--- a/libc/arch-x86/syscalls/__fchmodat.S
+++ b/libc/arch-x86/syscalls/___fchmodat.S
@@ -2,7 +2,7 @@
 
 #include <private/bionic_asm.h>
 
-ENTRY(__fchmodat)
+ENTRY(___fchmodat)
     pushl   %ebx
     .cfi_def_cfa_offset 8
     .cfi_rel_offset ebx, 0
@@ -28,4 +28,5 @@ ENTRY(__fchmodat)
     popl    %ecx
     popl    %ebx
     ret
-END(__fchmodat)
+END(___fchmodat)
+.hidden ___fchmodat
diff --git a/libc/arch-x86_64/syscalls/__fchmod.S b/libc/arch-x86_64/syscalls/___fchmod.S
similarity index 83%
rename from libc/arch-x86_64/syscalls/__fchmod.S
rename to libc/arch-x86_64/syscalls/___fchmod.S
index ba75f7487..7bccbefb4 100644
--- a/libc/arch-x86_64/syscalls/__fchmod.S
+++ b/libc/arch-x86_64/syscalls/___fchmod.S
@@ -2,7 +2,7 @@
 
 #include <private/bionic_asm.h>
 
-ENTRY(__fchmod)
+ENTRY(___fchmod)
     movl    $__NR_fchmod, %eax
     syscall
     cmpq    $-MAX_ERRNO, %rax
@@ -12,5 +12,5 @@ ENTRY(__fchmod)
     call    __set_errno_internal
 1:
     ret
-END(__fchmod)
-.hidden __fchmod
+END(___fchmod)
+.hidden ___fchmod
diff --git a/libc/arch-x86_64/syscalls/__fchmodat.S b/libc/arch-x86_64/syscalls/___fchmodat.S
similarity index 82%
rename from libc/arch-x86_64/syscalls/__fchmodat.S
rename to libc/arch-x86_64/syscalls/___fchmodat.S
index a8fae9525..483ec7d50 100644
--- a/libc/arch-x86_64/syscalls/__fchmodat.S
+++ b/libc/arch-x86_64/syscalls/___fchmodat.S
@@ -2,7 +2,7 @@
 
 #include <private/bionic_asm.h>
 
-ENTRY(__fchmodat)
+ENTRY(___fchmodat)
     movl    $__NR_fchmodat, %eax
     syscall
     cmpq    $-MAX_ERRNO, %rax
@@ -12,5 +12,5 @@ ENTRY(__fchmodat)
     call    __set_errno_internal
 1:
     ret
-END(__fchmodat)
-.hidden __fchmodat
+END(___fchmodat)
+.hidden ___fchmodat
diff --git a/libc/bionic/fchmod.cpp b/libc/bionic/fchmod.cpp
index 6e020b6be..ace8c6b47 100644
--- a/libc/bionic/fchmod.cpp
+++ b/libc/bionic/fchmod.cpp
@@ -33,11 +33,11 @@
 #include <unistd.h>
 #include <stdio.h>
 
-extern "C" int __fchmod(int, mode_t);
+extern "C" int ___fchmod(int, mode_t);
 
 int fchmod(int fd, mode_t mode) {
   int saved_errno = errno;
-  int result = __fchmod(fd, mode);
+  int result = ___fchmod(fd, mode);
 
   if ((result == 0) || (errno != EBADF)) {
     return result;
diff --git a/libc/bionic/fchmodat.cpp b/libc/bionic/fchmodat.cpp
index c28e15ac7..1f83c4b9b 100644
--- a/libc/bionic/fchmodat.cpp
+++ b/libc/bionic/fchmodat.cpp
@@ -34,7 +34,7 @@
 
 #include "private/ErrnoRestorer.h"
 
-extern "C" int __fchmodat(int, const char*, mode_t);
+extern "C" int ___fchmodat(int, const char*, mode_t);
 
 int fchmodat(int dirfd, const char* pathname, mode_t mode, int flags) {
   if ((flags & ~AT_SYMLINK_NOFOLLOW) != 0) {
@@ -63,5 +63,5 @@ int fchmodat(int dirfd, const char* pathname, mode_t mode, int flags) {
     return result;
   }
 
-  return __fchmodat(dirfd, pathname, mode);
+  return ___fchmodat(dirfd, pathname, mode);
 }
diff --git a/libc/tools/gensyscalls.py b/libc/tools/gensyscalls.py
index 4e240777a..7e11418db 100755
--- a/libc/tools/gensyscalls.py
+++ b/libc/tools/gensyscalls.py
@@ -286,8 +286,9 @@ def add_footer(pointer_length, stub, syscall):
     for alias in aliases:
         stub += function_alias % { "func" : syscall["func"], "alias" : alias }
 
-    # Use hidden visibility for any functions beginning with underscores.
-    if pointer_length == 64 and syscall["func"].startswith("__"):
+    # Use hidden visibility on LP64 for any functions beginning with underscores.
+    # Force hidden visibility for any functions which begin with 3 underscores
+    if (pointer_length == 64 and syscall["func"].startswith("__")) or syscall["func"].startswith("___"):
         stub += '.hidden ' + syscall["func"] + '\n'
 
     return stub