Browse Source

change uid_t, gid_t, and id_t to unsigned types

this change is both to fix one of the remaining type (and thus C++
ABI) mismatches with glibc/LSB and to allow use of the full range of
uid and gid values, if so desired.

passwd/group access functions were not prepared to deal with unsigned
values, so they too have been fixed with this commit.
Rich Felker 11 năm trước cách đây
mục cha
commit
648c3b4e18

+ 3 - 3
arch/arm/bits/alltypes.h.sh

@@ -70,9 +70,9 @@ STRUCT timeval { time_t tv_sec; int tv_usec; };
 STRUCT timespec { time_t tv_sec; long tv_nsec; };
 
 TYPEDEF int pid_t;
-TYPEDEF int id_t;
-TYPEDEF int uid_t;
-TYPEDEF int gid_t;
+TYPEDEF unsigned id_t;
+TYPEDEF unsigned uid_t;
+TYPEDEF unsigned gid_t;
 TYPEDEF int key_t;
 
 TYPEDEF struct __pthread * pthread_t;

+ 3 - 3
arch/i386/bits/alltypes.h.sh

@@ -84,9 +84,9 @@ STRUCT timeval { time_t tv_sec; int tv_usec; };
 STRUCT timespec { time_t tv_sec; long tv_nsec; };
 
 TYPEDEF int pid_t;
-TYPEDEF int id_t;
-TYPEDEF int uid_t;
-TYPEDEF int gid_t;
+TYPEDEF unsigned id_t;
+TYPEDEF unsigned uid_t;
+TYPEDEF unsigned gid_t;
 TYPEDEF int key_t;
 
 TYPEDEF struct __pthread * pthread_t;

+ 3 - 3
arch/microblaze/bits/alltypes.h.sh

@@ -70,9 +70,9 @@ STRUCT timeval { time_t tv_sec; int tv_usec; };
 STRUCT timespec { time_t tv_sec; long tv_nsec; };
 
 TYPEDEF int pid_t;
-TYPEDEF int id_t;
-TYPEDEF int uid_t;
-TYPEDEF int gid_t;
+TYPEDEF unsigned id_t;
+TYPEDEF unsigned uid_t;
+TYPEDEF unsigned gid_t;
 TYPEDEF int key_t;
 
 TYPEDEF struct __pthread * pthread_t;

+ 3 - 3
arch/mips/bits/alltypes.h.sh

@@ -70,9 +70,9 @@ STRUCT timeval { time_t tv_sec; int tv_usec; };
 STRUCT timespec { time_t tv_sec; long tv_nsec; };
 
 TYPEDEF int pid_t;
-TYPEDEF int id_t;
-TYPEDEF int uid_t;
-TYPEDEF int gid_t;
+TYPEDEF unsigned id_t;
+TYPEDEF unsigned uid_t;
+TYPEDEF unsigned gid_t;
 TYPEDEF int key_t;
 
 TYPEDEF struct __pthread * pthread_t;

+ 3 - 3
arch/powerpc/bits/alltypes.h.sh

@@ -70,9 +70,9 @@ STRUCT timeval { time_t tv_sec; int tv_usec; };
 STRUCT timespec { time_t tv_sec; long tv_nsec; };
 
 TYPEDEF int pid_t;
-TYPEDEF int id_t;
-TYPEDEF int uid_t;
-TYPEDEF int gid_t;
+TYPEDEF unsigned id_t;
+TYPEDEF unsigned uid_t;
+TYPEDEF unsigned gid_t;
 TYPEDEF int key_t;
 
 TYPEDEF struct __pthread * pthread_t;

+ 3 - 3
arch/x86_64/bits/alltypes.h.sh

@@ -70,9 +70,9 @@ STRUCT timeval { time_t tv_sec; long tv_usec; };
 STRUCT timespec { time_t tv_sec; long tv_nsec; };
 
 TYPEDEF int pid_t;
-TYPEDEF int id_t;
-TYPEDEF unsigned int uid_t;
-TYPEDEF unsigned int gid_t;
+TYPEDEF unsigned id_t;
+TYPEDEF unsigned uid_t;
+TYPEDEF unsigned gid_t;
 TYPEDEF int key_t;
 
 TYPEDEF struct __pthread * pthread_t;

+ 9 - 2
src/passwd/getgrent_a.c

@@ -1,6 +1,13 @@
 #include "pwf.h"
 #include <pthread.h>
 
+static unsigned atou(char **s)
+{
+	unsigned x;
+	for (x=0; **s-'0'<10U; ++*s) x=10*x+(**s-'0');
+	return x;
+}
+
 struct group *__getgrent_a(FILE *f, struct group *gr, char **line, size_t *size, char ***mem, size_t *nmem)
 {
 	ssize_t l;
@@ -24,8 +31,8 @@ struct group *__getgrent_a(FILE *f, struct group *gr, char **line, size_t *size,
 		*s++ = 0; gr->gr_passwd = s;
 		if (!(s = strchr(s, ':'))) continue;
 
-		*s++ = 0; gr->gr_gid = atoi(s);
-		if (!(s = strchr(s, ':'))) continue;
+		*s++ = 0; gr->gr_gid = atou(&s);
+		if (*s != ':') continue;
 
 		*s++ = 0; mems = s;
 		break;

+ 11 - 4
src/passwd/getpwent_a.c

@@ -1,6 +1,13 @@
 #include "pwf.h"
 #include <pthread.h>
 
+static unsigned atou(char **s)
+{
+	unsigned x;
+	for (x=0; **s-'0'<10U; ++*s) x=10*x+(**s-'0');
+	return x;
+}
+
 struct passwd *__getpwent_a(FILE *f, struct passwd *pw, char **line, size_t *size)
 {
 	ssize_t l;
@@ -23,11 +30,11 @@ struct passwd *__getpwent_a(FILE *f, struct passwd *pw, char **line, size_t *siz
 		*s++ = 0; pw->pw_passwd = s;
 		if (!(s = strchr(s, ':'))) continue;
 
-		*s++ = 0; pw->pw_uid = atoi(s);
-		if (!(s = strchr(s, ':'))) continue;
+		*s++ = 0; pw->pw_uid = atou(&s);
+		if (*s != ':') continue;
 
-		*s++ = 0; pw->pw_gid = atoi(s);
-		if (!(s = strchr(s, ':'))) continue;
+		*s++ = 0; pw->pw_gid = atou(&s);
+		if (*s != ':') continue;
 
 		*s++ = 0; pw->pw_gecos = s;
 		if (!(s = strchr(s, ':'))) continue;