diff options
Diffstat (limited to 'libc')
| -rw-r--r-- | libc/misc/dirent/opendir.c | 21 | ||||
| -rw-r--r-- | libc/misc/utmp/utent.c | 31 | ||||
| -rw-r--r-- | libc/pwd_grp/lckpwdf.c | 34 | 
3 files changed, 42 insertions, 44 deletions
| diff --git a/libc/misc/dirent/opendir.c b/libc/misc/dirent/opendir.c index fa07d0052..70b30658e 100644 --- a/libc/misc/dirent/opendir.c +++ b/libc/misc/dirent/opendir.c @@ -81,28 +81,31 @@ DIR *opendir(const char *name)  	}  # define O_DIRECTORY 0  #endif -	if ((fd = open(name, O_RDONLY|O_NDELAY|O_DIRECTORY)) < 0) +#ifndef O_CLOEXEC +# define O_CLOEXEC 0 +#endif +	fd = open(name, O_RDONLY|O_NDELAY|O_DIRECTORY|O_CLOEXEC); +	if (fd < 0)  		return NULL;  	/* Note: we should check to make sure that between the stat() and open()  	 * call, 'name' didnt change on us, but that's only if O_DIRECTORY isnt  	 * defined and since Linux has supported it for like ever, i'm not going  	 * to worry about it right now (if ever). */ -	if (fstat(fd, &statbuf) < 0) -		goto close_and_ret; - -	/* According to POSIX, directory streams should be closed when -	 * exec. From "Anna Pluzhnikov" <besp@midway.uchicago.edu>. -	 */ -	if (fcntl(fd, F_SETFD, FD_CLOEXEC) < 0) { +	if (fstat(fd, &statbuf) < 0) {  		int saved_errno; -close_and_ret:  		saved_errno = errno;  		close(fd);  		__set_errno(saved_errno);  		return NULL;  	} +	/* According to POSIX, directory streams should be closed when +	 * exec. From "Anna Pluzhnikov" <besp@midway.uchicago.edu>. +	 */ +	if (O_CLOEXEC == 0) +		fcntl(fd, F_SETFD, FD_CLOEXEC); +  	ptr = fd_to_DIR(fd, statbuf.st_blksize);  	if (!ptr) {  		close(fd); diff --git a/libc/misc/utmp/utent.c b/libc/misc/utmp/utent.c index f0700af21..7d8a2d3c1 100644 --- a/libc/misc/utmp/utent.c +++ b/libc/misc/utmp/utent.c @@ -34,24 +34,29 @@ static const char *static_ut_name = default_file_name;  static void __setutent(void)  {      if (static_fd < 0) { -	static_fd = open(static_ut_name, O_RDWR); +#ifndef O_CLOEXEC +# define O_CLOEXEC 0 +#endif +	static_fd = open(static_ut_name, O_RDWR | O_CLOEXEC);  	if (static_fd < 0) { -	    static_fd = open(static_ut_name, O_RDONLY); +	    static_fd = open(static_ut_name, O_RDONLY | O_CLOEXEC);  	    if (static_fd < 0) {  		return; /* static_fd remains < 0 */  	    }  	} -	/* Make sure the file will be closed on exec()  */ -	fcntl(static_fd, F_SETFD, FD_CLOEXEC); -	// thus far, {G,S}ETFD only has this single flag, -	// and setting it never fails. -	//int ret = fcntl(static_fd, F_GETFD, 0); -	//if (ret >= 0) { -	//    ret = fcntl(static_fd, F_SETFD, ret | FD_CLOEXEC); -	//} -	//if (ret < 0) { -	//    static_fd = -1; -	//} +	if (O_CLOEXEC == 0) { +	    /* Make sure the file will be closed on exec()  */ +	    fcntl(static_fd, F_SETFD, FD_CLOEXEC); +	    // thus far, {G,S}ETFD only has this single flag, +	    // and setting it never fails. +	    //int ret = fcntl(static_fd, F_GETFD, 0); +	    //if (ret >= 0) { +	    //    ret = fcntl(static_fd, F_SETFD, ret | FD_CLOEXEC); +	    //} +	    //if (ret < 0) { +	    //    static_fd = -1; +	    //} +	}  	return;      }      lseek(static_fd, 0, SEEK_SET); diff --git a/libc/pwd_grp/lckpwdf.c b/libc/pwd_grp/lckpwdf.c index c0c8f0d90..68c46e02c 100644 --- a/libc/pwd_grp/lckpwdf.c +++ b/libc/pwd_grp/lckpwdf.c @@ -28,17 +28,6 @@  #include <paths.h>  #include <shadow.h> -/* Experimentally off - libc_hidden_proto(memset) */ -/* libc_hidden_proto(open) */ -/* libc_hidden_proto(fcntl) */ -/* libc_hidden_proto(close) */ -/* libc_hidden_proto(sigfillset) */ -/* libc_hidden_proto(sigaction) */ -/* libc_hidden_proto(sigprocmask) */ -/* libc_hidden_proto(sigaddset) */ -/* libc_hidden_proto(sigemptyset) */ -/* libc_hidden_proto(alarm) */ -  /* How long to wait for getting the lock before returning with an error.  */  #define TIMEOUT 15 /* sec */ @@ -56,7 +45,6 @@ static void noop_handler (int __sig);  int  lckpwdf (void)  { -  int flags;    sigset_t saved_set;			/* Saved set of caught signals.  */    struct sigaction saved_act;		/* Saved signal action.  */    sigset_t new_set;			/* New set of caught signals.  */ @@ -72,16 +60,18 @@ lckpwdf (void)    /* Prevent problems caused by multiple threads.  */    __UCLIBC_MUTEX_LOCK(mylock); -  lock_fd = open (_PATH_PASSWD, O_WRONLY); +#ifndef O_CLOEXEC +# define O_CLOEXEC 0 +#endif +  lock_fd = open (_PATH_PASSWD, O_WRONLY | O_CLOEXEC);    if (lock_fd == -1) {      /* Cannot create lock file.  */ -	goto DONE; +    goto DONE;    } -    /* Make sure file gets correctly closed when process finished.  */ -  flags = fcntl (lock_fd, F_GETFD); -  flags |= FD_CLOEXEC; -  fcntl (lock_fd, F_SETFD, flags); +  if (O_CLOEXEC == 0) +    fcntl (lock_fd, F_SETFD, FD_CLOEXEC); +    /* Now we have to get exclusive write access.  Since multiple       process could try this we won't stop when it first fails.       Instead we set a timeout for the system call.  Once the timer @@ -91,7 +81,7 @@ lckpwdf (void)       It is important that we don't change the signal state.  We must       restore the old signal behaviour.  */ -  memset (&new_act, '\0', sizeof (struct sigaction)); +  memset (&new_act, '\0', sizeof (new_act));    new_act.sa_handler = noop_handler;    __sigfillset (&new_act.sa_mask); @@ -125,7 +115,7 @@ lckpwdf (void)    if (result < 0) {      close(lock_fd);      lock_fd = -1; -	goto DONE; +    goto DONE;    }    rv = 0; @@ -146,7 +136,7 @@ ulckpwdf (void)    else      {        /* Prevent problems caused by multiple threads.  */ -	  __UCLIBC_MUTEX_LOCK(mylock); +      __UCLIBC_MUTEX_LOCK(mylock);        result = close (lock_fd); @@ -154,7 +144,7 @@ ulckpwdf (void)        lock_fd = -1;        /* Clear mutex.  */ -	  __UCLIBC_MUTEX_UNLOCK(mylock); +      __UCLIBC_MUTEX_UNLOCK(mylock);      }    return result; | 
