passwd and store it in the cache so we can delref it on exit.
--HG--
branch : 1.7
return item->d.pw;
}
-/*
- * Take a uid in string form "#123" and return a faked up passwd struct.
- */
-struct passwd *
-sudo_fakepwnam(user, gid)
+static struct passwd *
+sudo_fakepwnamid(user, uid, gid)
const char *user;
+ uid_t uid;
gid_t gid;
{
struct cache_item *item;
item = emalloc(len);
zero_bytes(item, sizeof(*item) + sizeof(*pw));
pw = (struct passwd *) ((char *)item + sizeof(*item));
- pw->pw_uid = (uid_t) atoi(user + 1);
+ pw->pw_uid = uid;
pw->pw_gid = gid;
pw->pw_name = (char *)pw + sizeof(struct passwd);
memcpy(pw->pw_name, user, namelen + 1);
return pw;
}
+/*
+ * Take a uid in string form "#123" and return a faked up passwd struct.
+ */
+struct passwd *
+sudo_fakepwnam(user, gid)
+ const char *user;
+ gid_t gid;
+{
+ uid_t uid;
+
+ uid = (uid_t) atoi(user + 1);
+ return sudo_fakepwnamid(user, uid, gid);
+}
+
+/*
+ * Take a uid and gid and return a faked up passwd struct.
+ */
+struct passwd *
+sudo_fakepwuid(uid, gid)
+ uid_t uid;
+ gid_t gid;
+{
+ char user[MAX_UID_T_LEN + 1];
+
+ (void) snprintf(user, sizeof(user), "#%u", (unsigned int) uid);
+ return sudo_fakepwnamid(user, uid, gid);
+}
+
void
sudo_setpwent()
{
* Stash a local copy of the user's struct passwd.
*/
if ((sudo_user.pw = sudo_getpwuid(getuid())) == NULL) {
- /* Need to make a fake struct passwd for logging to work. */
- struct passwd pw;
- char pw_name[MAX_UID_T_LEN + 1];
-
- pw.pw_uid = getuid();
- (void) snprintf(pw_name, sizeof(pw_name), "%u",
- (unsigned int) pw.pw_uid);
- pw.pw_name = pw_name;
- sudo_user.pw = &pw;
+ uid_t uid = getuid();
+ gid_t gid = getgid();
/*
* If we are in -k/-K mode, just spew to stderr. It is not unusual for
* be run during reboot after the YP/NIS/NIS+/LDAP/etc daemon has died.
*/
if (sudo_mode == MODE_KILL || sudo_mode == MODE_INVALIDATE)
- errorx(1, "unknown uid: %s", pw_name);
- log_error(0, "unknown uid: %s", pw_name);
+ errorx(1, "unknown uid: %u", (unsigned int) uid);
+
+ /* Need to make a fake struct passwd for the call to log_error(). */
+ sudo_user.pw = sudo_fakepwuid(uid, gid);
+ log_error(0, "unknown uid: %u", (unsigned int) uid);
}
#ifdef HAVE_MBR_CHECK_MEMBERSHIP
mbr_uid_to_uuid(user_uid, user_uuid);
struct group *sudo_getgrgid __P((gid_t));
struct group *sudo_getgrnam __P((const char *));
struct passwd *sudo_fakepwnam __P((const char *, gid_t));
+struct passwd *sudo_fakepwuid __P((uid_t uid, gid_t gid));
struct passwd *sudo_getpwnam __P((const char *));
struct passwd *sudo_getpwuid __P((uid_t));
void sudo_endgrent __P((void));