[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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [PATCH] libacl: use getpwnam_r and getgrnam_r in acl_from_text.c,
Pavel Simovec <=