Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
utils: generalize user/group name to uid/gid functions
strssndktn committed 6 months ago
commit 087ece7e4249d0317805bd8004fd618ecde074ff
parent 65408a1
3 files changed +57 -56
modified libpkg/pkg_add.c
@@ -246,56 +246,6 @@ ret:
	free(localconf);
}

-
static uid_t
-
get_uid_from_archive(struct archive_entry *ae)
-
{
-
	static char user_buffer[1024];
-
	const char *user;
-
	static struct passwd pwent;
-
	struct passwd *result;
-
	int err;
-

-
	user = archive_entry_uname(ae);
-
	if (pwent.pw_name != NULL && STREQ(user, pwent.pw_name))
-
		goto out;
-
	pwent.pw_name = NULL;
-
	err = getpwnam_r(user, &pwent, user_buffer, sizeof(user_buffer),
-
	    &result);
-
	if (err != 0) {
-
		pkg_emit_errno("getpwnam_r", user );
-
		return (0);
-
	}
-
	if (result == NULL)
-
		return (0);
-
out:
-
	return (pwent.pw_uid);
-
}
-

-
static gid_t
-
get_gid_from_archive(struct archive_entry *ae)
-
{
-
	static char group_buffer[1024];
-
	static struct group grent;
-
	struct group *result;
-
	const char *group;
-
	int err;
-

-
	group = archive_entry_gname(ae);
-
	if (grent.gr_name != NULL && STREQ(group, grent.gr_name))
-
		goto out;
-
	grent.gr_name = NULL;
-
	err = getgrnam_r(group, &grent, group_buffer, sizeof(group_buffer),
-
	    &result);
-
	if (err != 0) {
-
		pkg_emit_errno("getgrnam_r", group );
-
		return (0);
-
	}
-
	if (result == NULL)
-
		return (0);
-
out:
-
	return (grent.gr_gid);
-
}
-

static int
set_chflags(int fd, const char *path, u_long fflags)
{
@@ -511,8 +461,8 @@ do_extract_dir(struct pkg_add_context* context, struct archive *a __unused, stru
	}
	aest = archive_entry_stat(ae);
	d->perm = aest->st_mode;
-
	d->uid = get_uid_from_archive(ae);
-
	d->gid = get_gid_from_archive(ae);
+
	d->uid = get_uid_from_uname(archive_entry_uname(ae));
+
	d->gid = get_gid_from_gname(archive_entry_gname(ae));
	fill_timespec_buf(aest, d->time);
	archive_entry_fflags(ae, &d->fflags, &clear);

@@ -602,8 +552,8 @@ do_extract_symlink(struct pkg_add_context *context, struct archive *a __unused,

	aest = archive_entry_stat(ae);
	archive_entry_fflags(ae, &f->fflags, &clear);
-
	f->uid = get_uid_from_archive(ae);
-
	f->gid = get_gid_from_archive(ae);
+
	f->uid = get_uid_from_uname(archive_entry_uname(ae));
+
	f->gid = get_gid_from_gname(archive_entry_gname(ae));
	f->perm = aest->st_mode;
	fill_timespec_buf(aest, f->time);
	archive_entry_fflags(ae, &f->fflags, &clear);
@@ -848,8 +798,8 @@ do_extract_regfile(struct pkg_add_context *context, struct archive *a, struct ar
	aest = archive_entry_stat(ae);
	archive_entry_fflags(ae, &f->fflags, &clear);
	f->perm = aest->st_mode;
-
	f->uid = get_uid_from_archive(ae);
-
	f->gid = get_gid_from_archive(ae);
+
	f->uid = get_uid_from_uname(archive_entry_uname(ae));
+
	f->gid = get_gid_from_gname(archive_entry_gname(ae));
	fill_timespec_buf(aest, f->time);
	archive_entry_fflags(ae, &f->fflags, &clear);

modified libpkg/private/utils.h
@@ -103,4 +103,7 @@ int char_cmp(const void *a, const void *b);
const char *charv_search(charv_t *, const char *);
DEFINE_VEC_INSERT_SORTED_PROTO(charv_t, charv, char *);

+
uid_t get_uid_from_uname(const char *);
+
gid_t get_gid_from_gname(const char *);
+

#endif
modified libpkg/utils.c
@@ -49,6 +49,8 @@
#include <float.h>
#include <math.h>
#include <regex.h>
+
#include <pwd.h>
+
#include <grp.h>

#include <bsd_compat.h>

@@ -1136,3 +1138,49 @@ charv_search(charv_t *v, const char *el)
		return (NULL);
	return *res;
}
+

+
uid_t
+
get_uid_from_uname(const char *uname)
+
{
+
	static char user_buffer[1024];
+
	static struct passwd pwent;
+
	struct passwd *result;
+
	int err;
+

+
	if (pwent.pw_name != NULL && STREQ(uname, pwent.pw_name))
+
		goto out;
+
	pwent.pw_name = NULL;
+
	err = getpwnam_r(uname, &pwent, user_buffer, sizeof(user_buffer),
+
	    &result);
+
	if (err != 0) {
+
		pkg_emit_errno("getpwnam_r", uname);
+
		return (0);
+
	}
+
	if (result == NULL)
+
		return (0);
+
out:
+
	return (pwent.pw_uid);
+
}
+

+
gid_t
+
get_gid_from_gname(const char *gname)
+
{
+
	static char group_buffer[1024];
+
	static struct group grent;
+
	struct group *result;
+
	int err;
+

+
	if (grent.gr_name != NULL && STREQ(gname, grent.gr_name))
+
		goto out;
+
	grent.gr_name = NULL;
+
	err = getgrnam_r(gname, &grent, group_buffer, sizeof(group_buffer),
+
	    &result);
+
	if (err != 0) {
+
		pkg_emit_errno("getgrnam_r",gname);
+
		return (0);
+
	}
+
	if (result == NULL)
+
		return (0);
+
out:
+
	return (grent.gr_gid);
+
}