X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=udev%2Fudev-util.c;h=3d5eb7657c40b812e14b6a395e5e8a0629930710;hp=3c2e2a508908a9be48f960ffc8c99b965fb82125;hb=10b2d011e70ddf9361c61f6147dc88f670d28abd;hpb=14f4025607e905cb230c6e5b32488e9f2d07a0d2 diff --git a/udev/udev-util.c b/udev/udev-util.c index 3c2e2a508..3d5eb7657 100644 --- a/udev/udev-util.c +++ b/udev/udev-util.c @@ -126,40 +126,54 @@ int util_unlink_secure(struct udev *udev, const char *filename) uid_t util_lookup_user(struct udev *udev, const char *user) { + char *endptr; + int buflen = sysconf(_SC_GETPW_R_SIZE_MAX); + char buf[buflen]; + struct passwd pwbuf; struct passwd *pw; - uid_t uid = 0; + uid_t uid; if (strcmp(user, "root") == 0) return 0; + uid = strtoul(user, &endptr, 10); + if (endptr[0] == '\0') + return uid; + errno = 0; - pw = getpwnam(user); - if (pw == NULL) { - if (errno == 0 || errno == ENOENT || errno == ESRCH) - err(udev, "specified user '%s' unknown\n", user); - else - err(udev, "error resolving user '%s': %m\n", user); - } else - uid = pw->pw_uid; - return uid; + getpwnam_r(user, &pwbuf, buf, buflen, &pw); + if (pw != NULL) + return pw->pw_uid; + if (errno == 0 || errno == ENOENT || errno == ESRCH) + err(udev, "specified user '%s' unknown\n", user); + else + err(udev, "error resolving user '%s': %m\n", user); + return 0; } extern gid_t util_lookup_group(struct udev *udev, const char *group) { + char *endptr; + int buflen = sysconf(_SC_GETGR_R_SIZE_MAX); + char buf[buflen]; + struct group grbuf; struct group *gr; gid_t gid = 0; if (strcmp(group, "root") == 0) return 0; + gid = strtoul(group, &endptr, 10); + if (endptr[0] == '\0') + return gid; + errno = 0; - gr = getgrnam(group); - if (gr == NULL) { - if (errno == 0 || errno == ENOENT || errno == ESRCH) - err(udev, "specified group '%s' unknown\n", group); - else - err(udev, "error resolving group '%s': %m\n", group); - } else - gid = gr->gr_gid; - return gid; + getgrnam_r(group, &grbuf, buf, buflen, &gr); + if (gr != NULL) + return gr->gr_gid; + if (errno == 0 || errno == ENOENT || errno == ESRCH) + err(udev, "specified group '%s' unknown\n", group); + else + err(udev, "error resolving group '%s': %m\n", group); + return 0; } /* handle "[/]" format */ @@ -430,7 +444,7 @@ int util_run_program(struct udev *udev, const char *command, char **envp, if (WEXITSTATUS(status) != 0) err = -1; } else { - err(udev, "'%s' abnormal exit\n", argv[0]); + err(udev, "'%s' abnormal exit\n", command); err = -1; } }