diff options
author | Jan Tojnar <jtojnar@gmail.com> | 2019-12-10 00:46:21 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-12-10 00:46:21 +0100 |
commit | 6b73d29775213361370f003fa4476bcf94572c28 (patch) | |
tree | 523a7938954636609aab4a5ac0b86ac2cdb92284 /pkgs | |
parent | a17878168edd14d67b94bfe351c5155f7a82a63c (diff) | |
parent | b6e37c31460c44560644c366b60f1ffe64300dde (diff) | |
download | nixpkgs-6b73d29775213361370f003fa4476bcf94572c28.tar nixpkgs-6b73d29775213361370f003fa4476bcf94572c28.tar.gz nixpkgs-6b73d29775213361370f003fa4476bcf94572c28.tar.bz2 nixpkgs-6b73d29775213361370f003fa4476bcf94572c28.tar.lz nixpkgs-6b73d29775213361370f003fa4476bcf94572c28.tar.xz nixpkgs-6b73d29775213361370f003fa4476bcf94572c28.tar.zst nixpkgs-6b73d29775213361370f003fa4476bcf94572c28.zip |
Merge pull request #73266 from demin-dmitriy/fix-libredirect-open-bug
libredirect: fix argument forwarding in `open*` functions
Diffstat (limited to 'pkgs')
-rw-r--r-- | pkgs/build-support/libredirect/libredirect.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/pkgs/build-support/libredirect/libredirect.c b/pkgs/build-support/libredirect/libredirect.c index 8e8da00b02a..d31b7551e94 100644 --- a/pkgs/build-support/libredirect/libredirect.c +++ b/pkgs/build-support/libredirect/libredirect.c @@ -59,6 +59,11 @@ static const char * rewrite(const char * path, char * buf) return path; } +static int open_needs_mode(int flags) +{ + return (flags & O_CREAT) || (flags & O_TMPFILE) == O_TMPFILE; +} + /* The following set of Glibc library functions is very incomplete - it contains only what we needed for programs in Nixpkgs. Just add more functions as needed. */ @@ -67,7 +72,7 @@ int open(const char * path, int flags, ...) { int (*open_real) (const char *, int, mode_t) = dlsym(RTLD_NEXT, "open"); mode_t mode = 0; - if (flags & O_CREAT) { + if (open_needs_mode(flags)) { va_list ap; va_start(ap, flags); mode = va_arg(ap, mode_t); @@ -81,7 +86,7 @@ int open64(const char * path, int flags, ...) { int (*open64_real) (const char *, int, mode_t) = dlsym(RTLD_NEXT, "open64"); mode_t mode = 0; - if (flags & O_CREAT) { + if (open_needs_mode(flags)) { va_list ap; va_start(ap, flags); mode = va_arg(ap, mode_t); @@ -95,7 +100,7 @@ int openat(int dirfd, const char * path, int flags, ...) { int (*openat_real) (int, const char *, int, mode_t) = dlsym(RTLD_NEXT, "openat"); mode_t mode = 0; - if (flags & O_CREAT) { + if (open_needs_mode(flags)) { va_list ap; va_start(ap, flags); mode = va_arg(ap, mode_t); @@ -140,9 +145,9 @@ int stat(const char * path, struct stat * st) return __stat_real(rewrite(path, buf), st); } -int * access(const char * path, int mode) +int access(const char * path, int mode) { - int * (*access_real) (const char *, int mode) = dlsym(RTLD_NEXT, "access"); + int (*access_real) (const char *, int mode) = dlsym(RTLD_NEXT, "access"); char buf[PATH_MAX]; return access_real(rewrite(path, buf), mode); } |