summary refs log tree commit diff
path: root/pkgs
diff options
context:
space:
mode:
authorJan Tojnar <jtojnar@gmail.com>2019-12-10 00:46:21 +0100
committerGitHub <noreply@github.com>2019-12-10 00:46:21 +0100
commit6b73d29775213361370f003fa4476bcf94572c28 (patch)
tree523a7938954636609aab4a5ac0b86ac2cdb92284 /pkgs
parenta17878168edd14d67b94bfe351c5155f7a82a63c (diff)
parentb6e37c31460c44560644c366b60f1ffe64300dde (diff)
downloadnixpkgs-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.c15
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);
 }