From 9f7467ea7e5fa3a31326d4eb8445baa10480743e Mon Sep 17 00:00:00 2001 From: Richard Kojedzinszky Date: Wed, 17 Jan 2024 20:48:02 +0100 Subject: [PATCH] libzfs: make userquota_propname_decode reentrant Signed-off-by: Richard Kojedzinszky --- lib/libzfs/libzfs_dataset.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/lib/libzfs/libzfs_dataset.c b/lib/libzfs/libzfs_dataset.c index 727efc5a91..41870a84d0 100644 --- a/lib/libzfs/libzfs_dataset.c +++ b/lib/libzfs/libzfs_dataset.c @@ -3170,6 +3170,9 @@ userquota_propname_decode(const char *propname, boolean_t zoned, boolean_t isproject; struct passwd *pw; struct group *gr; + struct passwd rpwd; + struct group rgrp; + char rgetbuf[1024]; domain[0] = '\0'; @@ -3195,11 +3198,15 @@ userquota_propname_decode(const char *propname, boolean_t zoned, cp = strchr(propname, '@') + 1; - if (isuser && (pw = getpwnam(cp)) != NULL) { + if (isuser && + getpwnam_r(cp, &rpwd, rgetbuf, sizeof (rgetbuf), &pw) == 0 && + pw != NULL) { if (zoned && getzoneid() == GLOBAL_ZONEID) return (ENOENT); *ridp = pw->pw_uid; - } else if (isgroup && (gr = getgrnam(cp)) != NULL) { + } else if (isgroup && + getgrnam_r(cp, &rgrp, rgetbuf, sizeof (rgetbuf), &gr) == 0 && + gr != NULL) { if (zoned && getzoneid() == GLOBAL_ZONEID) return (ENOENT); *ridp = gr->gr_gid;