acl-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] libacl: use getpwnam_r and getgrnam_r in acl_from_text.c


From: Pavel Simovec
Subject: [PATCH] libacl: use getpwnam_r and getgrnam_r in acl_from_text.c
Date: Mon, 11 Sep 2023 14:25:12 +0200

---
 libacl/acl_from_text.c | 61 +++++++++++++++++++++++++++++++++++-------
 1 file changed, 51 insertions(+), 10 deletions(-)

diff --git a/libacl/acl_from_text.c b/libacl/acl_from_text.c
index 2617cbb..975ce5f 100644
--- a/libacl/acl_from_text.c
+++ b/libacl/acl_from_text.c
@@ -23,6 +23,7 @@
 #include <string.h>
 #include <pwd.h>
 #include <grp.h>
+#include <unistd.h>
 #include "libacl.h"
 #include "misc.h"
 
@@ -145,22 +146,52 @@ get_id(const char *token, id_t *id_p)
        return 0;
 }
 
+static char *
+allocate_buffer(char **buffer, size_t *bufsize, int type)
+{
+       if (!*bufsize) {
+               long typesize = sysconf(type);
+               *bufsize = typesize;
+               if (typesize <= 0)
+                       *bufsize = 16384;
+               *buffer = malloc(*bufsize);
+               return *buffer;
+       }
+       *bufsize *= 2;
+       char *newbuffer=realloc(*buffer, *bufsize);
+       if (!newbuffer) {
+               free(*buffer);
+               return NULL;
+       }
+       *buffer=newbuffer;
+       return *buffer;
+}
 
 static int
 get_uid(const char *token, uid_t *uid_p)
 {
-       struct passwd *passwd;
+       struct passwd passwd;
+       struct passwd *result;
+       char *buffer;
+       size_t bufsize = 0;
 
        if (get_id(token, uid_p) == 0)
                return 0;
-       errno = 0;
-       passwd = getpwnam(token);
-       if (passwd) {
-               *uid_p = passwd->pw_uid;
+
+       do {
+               if(!allocate_buffer(&buffer, &bufsize, _SC_GETPW_R_SIZE_MAX))
+                       return -1;
+               errno = 0;
+       } while (getpwnam_r(token, &passwd, buffer, bufsize, &result) && 
!result && errno == ERANGE);
+
+       if (result) {
+               *uid_p = passwd.pw_uid;
+               free(buffer);
                return 0;
        }
        if (errno == 0)
                errno = EINVAL;
+       free(buffer);
        return -1;
 }
 
@@ -168,18 +199,28 @@ get_uid(const char *token, uid_t *uid_p)
 static int
 get_gid(const char *token, gid_t *gid_p)
 {
-       struct group *group;
+       struct group group;
+       struct group *result;
+       char *buffer;
+       size_t bufsize = 0;
 
        if (get_id(token, (uid_t *)gid_p) == 0)
                return 0;
-       errno = 0;
-       group = getgrnam(token);
-       if (group) {
-               *gid_p = group->gr_gid;
+
+       do {
+               if(!allocate_buffer(&buffer, &bufsize, _SC_GETGR_R_SIZE_MAX))
+                       return -1;
+               errno = 0;
+       } while (getgrnam_r(token, &group, buffer, bufsize, &result) && !result 
&& errno == ERANGE);
+
+       if (result) {
+               *gid_p = group.gr_gid;
+               free(buffer);
                return 0;
        }
        if (errno == 0)
                errno = EINVAL;
+       free(buffer);
        return -1;
 }
 
-- 
2.42.0




reply via email to

[Prev in Thread] Current Thread [Next in Thread]