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
This commit is contained in:
Nick Kralevich 2015-02-03 11:27:25 -08:00
parent d57bf449fe
commit 00490ae3f3
16 changed files with 45 additions and 38 deletions

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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;

View file

@ -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);
}

View file

@ -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