fix some more O_CLOEXEC/SOCK_CLOEXEC issues
[musl] / src / thread / sem_open.c
index 809925d..2e900eb 100644 (file)
@@ -71,13 +71,13 @@ sem_t *sem_open(const char *name, int flags, ...)
                        errno = EINVAL;
                        return SEM_FAILED;
                }
-               sem_init(&newsem, 0, value);
+               sem_init(&newsem, 1, value);
                clock_gettime(CLOCK_REALTIME, &ts);
                snprintf(tmp, sizeof(tmp), "/dev/shm/%p-%p-%d-%d",
                        &name, name, (int)getpid(), (int)ts.tv_nsec);
-               tfd = open(tmp, O_CREAT|O_EXCL|O_RDWR, mode);
+               tfd = open(tmp, O_CREAT|O_EXCL|O_RDWR|O_CLOEXEC, mode);
                if (tfd<0) return SEM_FAILED;
-               dir = open("/dev/shm", O_DIRECTORY|O_RDONLY);
+               dir = open("/dev/shm", O_DIRECTORY|O_RDONLY|O_CLOEXEC);
                if (dir<0 || write(tfd,&newsem,sizeof newsem)!=sizeof newsem) {
                        if (dir >= 0) close(dir);
                        close(tfd);
@@ -93,7 +93,7 @@ sem_t *sem_open(const char *name, int flags, ...)
 
        for (;;) {
                if (!(flags & O_EXCL)) {
-                       fd = shm_open(name, flags&~O_CREAT, mode);
+                       fd = shm_open(name, flags&~O_CREAT, 0);
                        if (fd >= 0 || errno != ENOENT) {
                                if (flags & O_CREAT) {
                                        close(dir);