Explorar o código

Fix locking
-Erik

Eric Andersen %!s(int64=22) %!d(string=hai) anos
pai
achega
f6cfb61578

+ 123 - 103
libc/pwd_grp/__getgrent.c

@@ -18,11 +18,22 @@
  *
  */
 
+#include <features.h>
 #include <unistd.h>
 #include <stdlib.h>
 #include <string.h>
 #include "config.h"
 
+#ifdef __UCLIBC_HAS_THREADS__
+#include <pthread.h>
+static pthread_mutex_t mylock = PTHREAD_MUTEX_INITIALIZER;
+# define LOCK   pthread_mutex_lock(&mylock)
+# define UNLOCK pthread_mutex_unlock(&mylock);
+#else
+# define LOCK
+# define UNLOCK
+#endif
+
 /*
  * This is the core group-file read function.  It behaves exactly like
  * getgrent() except that it is passed a file descriptor.  getgrent()
@@ -31,130 +42,139 @@
 struct group *__getgrent(int grp_fd)
 {
 #ifdef GR_SCALE_DYNAMIC
-	static char *line_buff = NULL;
-	static char **members = NULL;
-	short line_index;
-	short buff_size;
+    static char *line_buff = NULL;
+    static char **members = NULL;
+    short line_index;
+    short buff_size;
 #else
-	static char line_buff[GR_MAX_LINE_LEN];
-	static char *members[GR_MAX_MEMBERS];
+    static char line_buff[GR_MAX_LINE_LEN];
+    static char *members[GR_MAX_MEMBERS];
 #endif
-	static struct group group;
-	register char *ptr;
-	char *field_begin;
-	short member_num;
-	char *endptr;
-	int line_len;
+    static struct group group;
+    register char *ptr;
+    char *field_begin;
+    short member_num;
+    char *endptr;
+    int line_len;
 
 
-	/* We use the restart label to handle malformatted lines */
-  restart:
+    LOCK;
+
+    /* We use the restart label to handle malformatted lines */
+restart:
 #ifdef GR_SCALE_DYNAMIC
-	line_index = 0;
-	buff_size = 256;
+    line_index = 0;
+    buff_size = 256;
 #endif
 
 #ifdef GR_SCALE_DYNAMIC
-	line_buff = realloc(line_buff, buff_size);
-	while (1) {
-		if ((line_len = read(grp_fd, line_buff + line_index,
-							 buff_size - line_index)) <= 0)
-			return NULL;
-		field_begin = strchr(line_buff, '\n');
-		if (field_begin != NULL) {
-			lseek(grp_fd,
-				  (long) (1 + field_begin -
-						  (line_len + line_index + line_buff)), SEEK_CUR);
-			*field_begin = '\0';
-			if (*line_buff == '#' || *line_buff == ' '
-				|| *line_buff == '\n' || *line_buff == '\t')
-				goto restart;
-			break;
-		} else {				/* Allocate some more space */
-
-			line_index = buff_size;
-			buff_size += 256;
-			line_buff = realloc(line_buff, buff_size);
-		}
+    line_buff = realloc(line_buff, buff_size);
+    while (1) {
+	if ((line_len = read(grp_fd, line_buff + line_index,
+			buff_size - line_index)) <= 0) {
+	    UNLOCK;
+	    return NULL;
 	}
-#else
-	/* Read the line into the static buffer */
-	if ((line_len = read(grp_fd, line_buff, GR_MAX_LINE_LEN)) <= 0)
-		return NULL;
 	field_begin = strchr(line_buff, '\n');
-	if (field_begin != NULL)
-		lseek(grp_fd, (long) (1 + field_begin - (line_buff + line_len)),
-			  SEEK_CUR);
-	else {						/* The line is too long - skip it :-\ */
-
-		do {
-			if ((line_len = read(grp_fd, line_buff, GR_MAX_LINE_LEN)) <= 0)
-				return NULL;
-		} while (!(field_begin = strchr(line_buff, '\n')));
-		lseek(grp_fd, (long) ((field_begin - line_buff) - line_len + 1),
-			  SEEK_CUR);
+	if (field_begin != NULL) {
+	    lseek(grp_fd,
+		    (long) (1 + field_begin -
+			    (line_len + line_index + line_buff)), SEEK_CUR);
+	    *field_begin = '\0';
+	    if (*line_buff == '#' || *line_buff == ' '
+		    || *line_buff == '\n' || *line_buff == '\t')
 		goto restart;
+	    break;
+	} else {				/* Allocate some more space */
+
+	    line_index = buff_size;
+	    buff_size += 256;
+	    line_buff = realloc(line_buff, buff_size);
 	}
-	if (*line_buff == '#' || *line_buff == ' ' || *line_buff == '\n' ||
-		*line_buff == '\t')
-		goto restart;
-	*field_begin = '\0';
+    }
+#else
+    /* Read the line into the static buffer */
+    if ((line_len = read(grp_fd, line_buff, GR_MAX_LINE_LEN)) <= 0) {
+	UNLOCK;
+	return NULL;
+    }
+    field_begin = strchr(line_buff, '\n');
+    if (field_begin != NULL)
+	lseek(grp_fd, (long) (1 + field_begin - (line_buff + line_len)),
+		SEEK_CUR);
+    else {						/* The line is too long - skip it :-\ */
+
+	do {
+	    if ((line_len = read(grp_fd, line_buff, GR_MAX_LINE_LEN)) <= 0) {
+		UNLOCK;
+		return NULL;
+	    }
+	} while (!(field_begin = strchr(line_buff, '\n')));
+	lseek(grp_fd, (long) ((field_begin - line_buff) - line_len + 1),
+		SEEK_CUR);
+	goto restart;
+    }
+    if (*line_buff == '#' || *line_buff == ' ' || *line_buff == '\n' ||
+	    *line_buff == '\t')
+	goto restart;
+    *field_begin = '\0';
 #endif							/* GR_SCALE_DYNAMIC */
 
-	/* Now parse the line */
-	group.gr_name = line_buff;
-	ptr = strchr(line_buff, ':');
-	if (ptr == NULL)
-		goto restart;
-	*ptr++ = '\0';
+    /* Now parse the line */
+    group.gr_name = line_buff;
+    ptr = strchr(line_buff, ':');
+    if (ptr == NULL)
+	goto restart;
+    *ptr++ = '\0';
 
-	group.gr_passwd = ptr;
-	ptr = strchr(ptr, ':');
-	if (ptr == NULL)
-		goto restart;
-	*ptr++ = '\0';
+    group.gr_passwd = ptr;
+    ptr = strchr(ptr, ':');
+    if (ptr == NULL)
+	goto restart;
+    *ptr++ = '\0';
 
-	field_begin = ptr;
-	ptr = strchr(ptr, ':');
-	if (ptr == NULL)
-		goto restart;
-	*ptr++ = '\0';
+    field_begin = ptr;
+    ptr = strchr(ptr, ':');
+    if (ptr == NULL)
+	goto restart;
+    *ptr++ = '\0';
 
-	group.gr_gid = (gid_t) strtoul(field_begin, &endptr, 10);
-	if (*endptr != '\0')
-		goto restart;
+    group.gr_gid = (gid_t) strtoul(field_begin, &endptr, 10);
+    if (*endptr != '\0')
+	goto restart;
 
-	member_num = 0;
-	field_begin = ptr;
+    member_num = 0;
+    field_begin = ptr;
 
 #ifdef GR_SCALE_DYNAMIC
-	if (members != NULL)
-	    free(members);
-	members = (char **) malloc((member_num + 1) * sizeof(char *));
-	for ( ; field_begin && *field_begin != '\0'; field_begin = ptr) {
-	    if ((ptr = strchr(field_begin, ',')) != NULL)
-		*ptr++ = '\0';
-	    members[member_num++] = field_begin;
-	    members = (char **) realloc(members,
-		    (member_num + 1) * sizeof(char *));
-	}
-	members[member_num] = NULL;
+    if (members != NULL)
+	free(members);
+    members = (char **) malloc((member_num + 1) * sizeof(char *));
+    for ( ; field_begin && *field_begin != '\0'; field_begin = ptr) {
+	if ((ptr = strchr(field_begin, ',')) != NULL)
+	    *ptr++ = '\0';
+	members[member_num++] = field_begin;
+	members = (char **) realloc(members,
+		(member_num + 1) * sizeof(char *));
+    }
+    members[member_num] = NULL;
 
 #else
-	while ((ptr = strchr(ptr, ',')) != NULL) {
-		*ptr = '\0';
-		ptr++;
-		members[member_num] = field_begin;
-		field_begin = ptr;
-		member_num++;
-	}
-	if (*field_begin == '\0')
-		members[member_num] = NULL;
-	else {
-		members[member_num] = field_begin;
-		members[member_num + 1] = NULL;
-	}
+    while ((ptr = strchr(ptr, ',')) != NULL) {
+	*ptr = '\0';
+	ptr++;
+	members[member_num] = field_begin;
+	field_begin = ptr;
+	member_num++;
+    }
+    if (*field_begin == '\0')
+	members[member_num] = NULL;
+    else {
+	members[member_num] = field_begin;
+	members[member_num + 1] = NULL;
+    }
 #endif
-	group.gr_mem = members;
-	return &group;
+    group.gr_mem = members;
+    UNLOCK;
+    return &group;
 }

+ 21 - 24
libc/pwd_grp/__getspent_r.c

@@ -25,32 +25,29 @@
 
 int __getspent_r(struct spwd * spwd, char * line_buff, size_t buflen, int spwd_fd)
 {
-	char *endptr;
-	int line_len;
+    char *endptr;
+    int line_len;
 
-	/* We use the restart label to handle malformatted lines */
-  restart:
-	/* Read the shadow line into the static buffer using a minimal of
-	   syscalls. */
-	if ((line_len = read(spwd_fd, line_buff, buflen)) <= 0)
+    /* We use the restart label to handle malformatted lines */
+restart:
+    /* Read the shadow line into the buffer using a minimum of syscalls. */
+    if ((line_len = read(spwd_fd, line_buff, buflen)) <= 0)
+	return -1;
+    endptr = strchr(line_buff, '\n');
+    if (endptr != NULL)
+	lseek(spwd_fd, (long) (1 + endptr - (line_buff + line_len)), SEEK_CUR);
+    else {
+	/* The line is too long - skip it. :-\ */
+	do {
+	    if ((line_len = read(spwd_fd, line_buff, buflen)) <= 0)
 		return -1;
-	endptr = strchr(line_buff, '\n');
-	if (endptr != NULL)
-		lseek(spwd_fd, (long) (1 + endptr - (line_buff + line_len)),
-			  SEEK_CUR);
-	else {						/* The line is too long - skip it. :-\ */
+	} while (!(endptr = strchr(line_buff, '\n')));
+	lseek(spwd_fd, (long) (endptr - line_buff) - line_len + 1, SEEK_CUR);
+	goto restart;
+    }
 
-		do {
-			if ((line_len = read(spwd_fd, line_buff, buflen)) <= 0)
-				return -1;
-		} while (!(endptr = strchr(line_buff, '\n')));
-		lseek(spwd_fd, (long) (endptr - line_buff) - line_len + 1,
-			  SEEK_CUR);
-		goto restart;
-	}
+    if (__sgetspent_r(line_buff, spwd, line_buff, buflen) < 0)
+	goto restart;
 
-	if (__sgetspent_r(line_buff, spwd, line_buff, buflen) < 0)
-		goto restart;
-
-	return 0;
+    return 0;
 }

+ 14 - 0
libc/pwd_grp/fgetpwent.c

@@ -18,10 +18,21 @@
  *
  */
 
+#include <features.h>
 #include <errno.h>
 #include <stdio.h>
 #include "config.h"
 
+#ifdef __UCLIBC_HAS_THREADS__
+#include <pthread.h>
+static pthread_mutex_t mylock = PTHREAD_MUTEX_INITIALIZER;
+# define LOCK   pthread_mutex_lock(&mylock)
+# define UNLOCK pthread_mutex_unlock(&mylock);
+#else
+# define LOCK
+# define UNLOCK
+#endif
+
 int fgetpwent_r (FILE *file, struct passwd *password,
 	char *buff, size_t buflen, struct passwd **crap)
 {
@@ -37,8 +48,11 @@ struct passwd *fgetpwent(FILE * file)
     static char line_buff[PWD_BUFFER_SIZE];
     static struct passwd pwd;
 
+    LOCK;
     if (fgetpwent_r(file, &pwd, line_buff, sizeof(line_buff), NULL) != -1) {
+	UNLOCK;
 	return &pwd;
     }
+    UNLOCK;
     return NULL;
 }

+ 25 - 11
libc/pwd_grp/fgetspent.c

@@ -17,27 +17,41 @@
  *
  */
 
+#include <features.h>
 #include <errno.h>
 #include <stdio.h>
 #include "config.h"
 
+#ifdef __UCLIBC_HAS_THREADS__
+#include <pthread.h>
+static pthread_mutex_t mylock = PTHREAD_MUTEX_INITIALIZER;
+# define LOCK   pthread_mutex_lock(&mylock)
+# define UNLOCK pthread_mutex_unlock(&mylock);
+#else
+# define LOCK
+# define UNLOCK
+#endif
+
 int fgetspent_r (FILE *file, struct spwd *spwd,
 	char *buff, size_t buflen, struct spwd **crap)
 {
-	if (file == NULL) {
-		__set_errno(EINTR);
-		return -1;
-	}
-	return(__getspent_r(spwd, buff, buflen, fileno(file)));
+    if (file == NULL) {
+	__set_errno(EINTR);
+	return -1;
+    }
+    return(__getspent_r(spwd, buff, buflen, fileno(file)));
 }
 
 struct spwd *fgetspent(FILE * file)
 {
-	static char line_buff[PWD_BUFFER_SIZE];
-	static struct spwd spwd;
+    static char line_buff[PWD_BUFFER_SIZE];
+    static struct spwd spwd;
 
-	if (fgetspent_r(file, &spwd, line_buff, sizeof(line_buff), NULL) != -1) {
-		return &spwd;
-	}
-	return NULL;
+    LOCK;
+    if (fgetspent_r(file, &spwd, line_buff, sizeof(line_buff), NULL) != -1) {
+	UNLOCK;
+	return &spwd;
+    }
+    UNLOCK;
+    return NULL;
 }

+ 14 - 0
libc/pwd_grp/getpwnam.c

@@ -18,6 +18,7 @@
  *
  */
 
+#include <features.h>
 #include <unistd.h>
 #include <string.h>
 #include <errno.h>
@@ -25,6 +26,16 @@
 #include <paths.h>
 #include "config.h"
 
+#ifdef __UCLIBC_HAS_THREADS__
+#include <pthread.h>
+static pthread_mutex_t mylock = PTHREAD_MUTEX_INITIALIZER;
+# define LOCK   pthread_mutex_lock(&mylock)
+# define UNLOCK pthread_mutex_unlock(&mylock);
+#else       
+# define LOCK
+# define UNLOCK
+#endif      
+
 int getpwnam_r (const char *name, struct passwd *password,
 	char *buff, size_t buflen, struct passwd **crap)
 {
@@ -53,9 +64,12 @@ struct passwd *getpwnam(const char *name)
     static char line_buff[PWD_BUFFER_SIZE];
     static struct passwd pwd;
 
+    LOCK;
     if (getpwnam_r(name, &pwd, line_buff, sizeof(line_buff), NULL) != -1) {
+	UNLOCK;
 	return &pwd;
     }
+    UNLOCK;
     return NULL;
 }
 

+ 14 - 0
libc/pwd_grp/getpwuid.c

@@ -18,12 +18,23 @@
  *
  */
 
+#include <features.h>
 #include <stdlib.h>
 #include <unistd.h>
 #include <fcntl.h>
 #include <paths.h>
 #include "config.h"
 
+#ifdef __UCLIBC_HAS_THREADS__
+#include <pthread.h>
+static pthread_mutex_t mylock = PTHREAD_MUTEX_INITIALIZER;
+# define LOCK   pthread_mutex_lock(&mylock)
+# define UNLOCK pthread_mutex_unlock(&mylock);
+#else       
+# define LOCK
+# define UNLOCK
+#endif      
+
 int getpwuid_r (uid_t uid, struct passwd *password,
 	char *buff, size_t buflen, struct passwd **crap)
 {
@@ -48,9 +59,12 @@ struct passwd *getpwuid(uid_t uid)
     static char line_buff[PWD_BUFFER_SIZE];
     static struct passwd pwd;
 
+    LOCK;
     if (getpwuid_r(uid, &pwd, line_buff,  sizeof(line_buff), NULL) != -1) {
+	UNLOCK;
 	return &pwd;
     }
+    UNLOCK;
     return NULL;
 }
 

+ 14 - 0
libc/pwd_grp/getspnam.c

@@ -17,12 +17,23 @@
  *
  */
 
+#include <features.h>
 #include <unistd.h>
 #include <string.h>
 #include <errno.h>
 #include <fcntl.h>
 #include "config.h"
 
+#ifdef __UCLIBC_HAS_THREADS__
+#include <pthread.h>
+static pthread_mutex_t mylock = PTHREAD_MUTEX_INITIALIZER;
+# define LOCK   pthread_mutex_lock(&mylock)
+# define UNLOCK pthread_mutex_unlock(&mylock);
+#else       
+# define LOCK
+# define UNLOCK
+#endif      
+
 int getspnam_r (const char *name, struct spwd *spwd,
 	char *buff, size_t buflen, struct spwd **crap)
 {
@@ -51,9 +62,12 @@ struct spwd *getspnam(const char *name)
     static char line_buff[PWD_BUFFER_SIZE];
     static struct spwd spwd;
 
+    LOCK;
     if (getspnam_r(name, &spwd, line_buff,  sizeof(line_buff), NULL) != -1) {
+	UNLOCK;
 	return &spwd;
     }
+    UNLOCK;
     return NULL;
 }
 

+ 14 - 0
libc/pwd_grp/getspuid.c

@@ -17,11 +17,22 @@
  *
  */
 
+#include <features.h>
 #include <stdlib.h>
 #include <unistd.h>
 #include <fcntl.h>
 #include "config.h"
 
+#ifdef __UCLIBC_HAS_THREADS__
+#include <pthread.h>
+static pthread_mutex_t mylock = PTHREAD_MUTEX_INITIALIZER;
+# define LOCK   pthread_mutex_lock(&mylock)
+# define UNLOCK pthread_mutex_unlock(&mylock);
+#else       
+# define LOCK
+# define UNLOCK
+#endif      
+
 int getspuid_r (uid_t uid, struct spwd *spwd,
 	char *buff, size_t buflen, struct spwd **crap)
 {
@@ -39,9 +50,12 @@ struct spwd *getspuid(uid_t uid)
     static char line_buff[PWD_BUFFER_SIZE];
     static struct spwd spwd;
 
+    LOCK;
     if (getspuid_r(uid, &spwd, line_buff, sizeof(line_buff), NULL) != -1) {
+	UNLOCK;
 	return &spwd;
     }
+    UNLOCK;
     return NULL;
 }
 

+ 26 - 9
libc/pwd_grp/grent.c

@@ -24,30 +24,47 @@
  * in together.
  */
 
+#include <features.h>
 #include <unistd.h>
 #include <fcntl.h>
 #include <paths.h>
 #include "config.h"
 
+#ifdef __UCLIBC_HAS_THREADS__
+#include <pthread.h>
+static pthread_mutex_t mylock = PTHREAD_MUTEX_INITIALIZER;
+# define LOCK   pthread_mutex_lock(&mylock)
+# define UNLOCK pthread_mutex_unlock(&mylock);
+#else       
+# define LOCK
+# define UNLOCK
+#endif      
+
 static int grp_fd = -1;
 
 void setgrent(void)
 {
-	if (grp_fd != -1)
-		close(grp_fd);
-	grp_fd = open(_PATH_GROUP, O_RDONLY);
+    LOCK;
+    if (grp_fd != -1)
+	close(grp_fd);
+    grp_fd = open(_PATH_GROUP, O_RDONLY);
+    UNLOCK;
 }
 
 void endgrent(void)
 {
-	if (grp_fd != -1)
-		close(grp_fd);
-	grp_fd = -1;
+    LOCK;
+    if (grp_fd != -1)
+	close(grp_fd);
+    grp_fd = -1;
+    UNLOCK;
 }
 
 struct group *getgrent(void)
 {
-	if (grp_fd == -1)
-		return NULL;
-	return __getgrent(grp_fd);
+    LOCK;
+    if (grp_fd == -1)
+	return NULL;
+    return __getgrent(grp_fd);
+    UNLOCK;
 }

+ 27 - 27
libc/pwd_grp/initgroups.c

@@ -27,49 +27,49 @@
 
 int initgroups(__const char *user, gid_t gid)
 {
-	register struct group *group;
+    register struct group *group;
 
 #ifndef GR_DYNAMIC_GROUP_LIST
-	gid_t group_list[GR_MAX_GROUPS];
+    gid_t group_list[GR_MAX_GROUPS];
 #else
-	gid_t *group_list = NULL;
+    gid_t *group_list = NULL;
 #endif
-	register char **tmp_mem;
-	int num_groups;
-	int grp_fd;
+    register char **tmp_mem;
+    int num_groups;
+    int grp_fd;
 
 
-	if ((grp_fd = open(_PATH_GROUP, O_RDONLY)) < 0)
-		return -1;
+    if ((grp_fd = open(_PATH_GROUP, O_RDONLY)) < 0)
+	return -1;
 
-	num_groups = 0;
+    num_groups = 0;
 #ifdef GR_DYNAMIC_GROUP_LIST
-	group_list = (gid_t *) realloc(group_list, 1);
+    group_list = (gid_t *) realloc(group_list, 1);
 #endif
-	group_list[num_groups] = gid;
+    group_list[num_groups] = gid;
 #ifndef GR_DYNAMIC_GROUP_LIST
-	while (num_groups < GR_MAX_GROUPS &&
-		   (group = __getgrent(grp_fd)) != NULL)
+    while (num_groups < GR_MAX_GROUPS &&
+	    (group = __getgrent(grp_fd)) != NULL)
 #else
 	while ((group = __getgrent(grp_fd)) != NULL)
 #endif
 	{
-		if (group->gr_gid != gid);
-		{
-			tmp_mem = group->gr_mem;
-			while (*tmp_mem != NULL) {
-				if (!strcmp(*tmp_mem, user)) {
-					num_groups++;
+	    if (group->gr_gid != gid);
+	    {
+		tmp_mem = group->gr_mem;
+		while (*tmp_mem != NULL) {
+		    if (!strcmp(*tmp_mem, user)) {
+			num_groups++;
 #ifdef GR_DYNAMIC_GROUP_LIST
-					group_list = (gid_t *) realloc(group_list, num_groups *
-						sizeof(gid_t *));
+			group_list = (gid_t *) realloc(group_list, num_groups *
+				sizeof(gid_t *));
 #endif
-					group_list[num_groups-1] = group->gr_gid;
-				}
-				tmp_mem++;
-			}
+			group_list[num_groups-1] = group->gr_gid;
+		    }
+		    tmp_mem++;
 		}
+	    }
 	}
-	close(grp_fd);
-	return setgroups(num_groups, group_list);
+    close(grp_fd);
+    return setgroups(num_groups, group_list);
 }

+ 24 - 2
libc/pwd_grp/lckpwdf.c

@@ -18,6 +18,7 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
+#include <features.h>
 #include <fcntl.h>
 #include <signal.h>
 #include <string.h>
@@ -25,6 +26,16 @@
 #include <sys/file.h>
 #include <paths.h>
 
+#ifdef __UCLIBC_HAS_THREADS__
+#include <pthread.h>
+static pthread_mutex_t mylock = PTHREAD_MUTEX_INITIALIZER;
+# define LOCK   pthread_mutex_lock(&mylock)
+# define UNLOCK pthread_mutex_unlock(&mylock);
+#else       
+# define LOCK
+# define UNLOCK
+#endif      
+
 /* How long to wait for getting the lock before returning with an
    error.  */
 #define TIMEOUT 15 /* sec */
@@ -50,10 +61,14 @@ int lckpwdf (void)
 	/* Still locked by own process.  */
 	return -1;
 
+    LOCK;
+
     lock_fd = open (_PATH_PASSWD, O_WRONLY);
-    if (lock_fd == -1)
+    if (lock_fd == -1) {
 	/* Cannot create lock file.  */
+	UNLOCK;
 	return -1;
+    }
 
     /* Make sure file gets correctly closed when process finished.  */
     flags = fcntl (lock_fd, F_GETFD, 0);
@@ -61,6 +76,7 @@ int lckpwdf (void)
 	/* Cannot get file flags.  */
 	close(lock_fd);
 	lock_fd = -1;
+	UNLOCK;
 	return -1;
     }
     flags |= FD_CLOEXEC;		/* Close on exit.  */
@@ -68,6 +84,7 @@ int lckpwdf (void)
 	/* Cannot set new flags.  */
 	close(lock_fd);
 	lock_fd = -1;
+	UNLOCK;
 	return -1;
     }
 
@@ -89,6 +106,7 @@ int lckpwdf (void)
 	/* Cannot install signal handler.  */
 	close(lock_fd);
 	lock_fd = -1;
+	UNLOCK;
 	return -1;
     }
 
@@ -99,6 +117,7 @@ int lckpwdf (void)
 	sigaction (SIGALRM, &saved_act, NULL);
 	close(lock_fd);
 	lock_fd = -1;
+	UNLOCK;
 	return -1;
     }
 
@@ -126,9 +145,11 @@ int lckpwdf (void)
     if (result < 0) {
 	close(lock_fd);
 	lock_fd = -1;
+	UNLOCK;
 	return -1;
     }
 
+    UNLOCK;
     return 0;
 }
 
@@ -142,10 +163,11 @@ int ulckpwdf (void)
 	result = -1;
     }
     else {
+	LOCK;
 	result = close (lock_fd);
-
 	/* Mark descriptor as unused.  */
 	lock_fd = -1;
+	UNLOCK;
     }
 
     return result;

+ 21 - 0
libc/pwd_grp/pwent.c

@@ -18,6 +18,7 @@
  *
  */
 
+#include <features.h>
 #include <unistd.h>
 #include <stdlib.h>
 #include <errno.h>
@@ -25,6 +26,16 @@
 #include <paths.h>
 #include "config.h"
 
+#ifdef __UCLIBC_HAS_THREADS__
+#include <pthread.h>
+static pthread_mutex_t mylock = PTHREAD_MUTEX_INITIALIZER;
+# define LOCK   pthread_mutex_lock(&mylock)
+# define UNLOCK pthread_mutex_unlock(&mylock);
+#else       
+# define LOCK
+# define UNLOCK
+#endif      
+
 /*
  * setpwent(), endpwent(), and getpwent() are included in the same object
  * file, since one cannot be used without the other two, so it makes sense to
@@ -36,25 +47,32 @@ static int pw_fd = -1;
 
 void setpwent(void)
 {
+    LOCK;
     if (pw_fd != -1)
 	close(pw_fd);
 
     pw_fd = open(_PATH_PASSWD, O_RDONLY);
+    UNLOCK;
 }
 
 void endpwent(void)
 {
+    LOCK;
     if (pw_fd != -1)
 	close(pw_fd);
     pw_fd = -1;
+    UNLOCK;
 }
 
 int getpwent_r (struct passwd *password, char *buff, 
 	size_t buflen, struct passwd **crap)
 {
+    LOCK;
     if (pw_fd != -1 && __getpwent_r(password, buff, buflen, pw_fd) != -1) {
+	UNLOCK;
 	return 0;
     }
+    UNLOCK;
     return -1;
 }
 
@@ -62,9 +80,12 @@ struct passwd *getpwent(void)
 {
     static char line_buff[PWD_BUFFER_SIZE];
     static struct passwd pwd;
+    LOCK;
     if (getpwent_r(&pwd, line_buff, sizeof(line_buff), NULL) != -1) {
+	UNLOCK;
 	return &pwd;
     }
+    UNLOCK;
     return NULL;
 }
 

+ 14 - 0
libc/pwd_grp/sgetspent.c

@@ -17,10 +17,21 @@
  *
  */
 
+#include <features.h>
 #include <errno.h>
 #include <stdio.h>
 #include "config.h"
 
+#ifdef __UCLIBC_HAS_THREADS__
+#include <pthread.h>
+static pthread_mutex_t mylock = PTHREAD_MUTEX_INITIALIZER;
+# define LOCK   pthread_mutex_lock(&mylock)
+# define UNLOCK pthread_mutex_unlock(&mylock);
+#else       
+# define LOCK
+# define UNLOCK
+#endif      
+
 int sgetspent_r (const char *string, struct spwd *spwd,
 	char *buff, size_t buflen, struct spwd **crap)
 {
@@ -32,8 +43,11 @@ struct spwd *sgetspent(const char *string)
     static char line_buff[PWD_BUFFER_SIZE];
     static struct spwd spwd;
 
+    LOCK;
     if (sgetspent_r(string, &spwd, line_buff, sizeof(line_buff), NULL) != -1) {
+	UNLOCK;
 	return &spwd;
     }
+    UNLOCK;
     return NULL;
 }

+ 21 - 1
libc/pwd_grp/spent.c

@@ -17,12 +17,23 @@
  *
  */
 
+#include <features.h>
 #include <unistd.h>
 #include <stdlib.h>
 #include <errno.h>
 #include <fcntl.h>
 #include "config.h"
 
+#ifdef __UCLIBC_HAS_THREADS__
+#include <pthread.h>
+static pthread_mutex_t mylock = PTHREAD_MUTEX_INITIALIZER;
+# define LOCK   pthread_mutex_lock(&mylock)
+# define UNLOCK pthread_mutex_unlock(&mylock);
+#else       
+# define LOCK
+# define UNLOCK
+#endif      
+
 /*
  * setspent(), endspent(), and getspent() are included in the same object
  * file, since one cannot be used without the other two, so it makes sense to
@@ -34,25 +45,31 @@ static int spwd_fd = -1;
 
 void setspent(void)
 {
+    LOCK;
     if (spwd_fd != -1)
 	close(spwd_fd);
-
     spwd_fd = open(_PATH_SHADOW, O_RDONLY);
+    UNLOCK;
 }
 
 void endspent(void)
 {
+    LOCK;
     if (spwd_fd != -1)
 	close(spwd_fd);
     spwd_fd = -1;
+    UNLOCK;
 }
 
 int getspent_r (struct spwd *spwd, char *buff, 
 	size_t buflen, struct spwd **crap)
 {
+    LOCK;
     if (spwd_fd != -1 && __getspent_r(spwd, buff, buflen, spwd_fd) != -1) {
+	UNLOCK;
 	return 0;
     }
+    UNLOCK;
     return -1;
 }
 
@@ -61,9 +78,12 @@ struct spwd *getspent(void)
     static char line_buff[PWD_BUFFER_SIZE];
     static struct spwd spwd;
 
+    LOCK;
     if (getspent_r(&spwd, line_buff, sizeof(line_buff), NULL) != -1) {
+	UNLOCK;
 	return &spwd;
     }
+    UNLOCK;
     return NULL;
 }