From f84583fe5d7899ab1504dc1d58a04742db4a3058 Mon Sep 17 00:00:00 2001 From: millert Date: Thu, 13 Sep 2018 12:33:43 +0000 Subject: [PATCH] Use the new libc uid_from_user() and gid_from_group() instead of the pax-specific functions in cache.c. OK guenther@ --- bin/pax/Makefile | 4 +- bin/pax/cache.c | 267 --------------------------------------------- bin/pax/extern.h | 11 +- bin/pax/options.c | 4 +- bin/pax/pax.c | 10 +- bin/pax/sel_subs.c | 12 +- bin/pax/tar.c | 29 ++--- 7 files changed, 25 insertions(+), 312 deletions(-) delete mode 100644 bin/pax/cache.c diff --git a/bin/pax/Makefile b/bin/pax/Makefile index 472c7d0887e..5dd36e21e3a 100644 --- a/bin/pax/Makefile +++ b/bin/pax/Makefile @@ -1,8 +1,8 @@ -# $OpenBSD: Makefile,v 1.12 2016/08/23 06:00:28 guenther Exp $ +# $OpenBSD: Makefile,v 1.13 2018/09/13 12:33:43 millert Exp $ WARNINGS=Yes PROG= pax -SRCS= ar_io.c ar_subs.c buf_subs.c cache.c cpio.c file_subs.c ftree.c\ +SRCS= ar_io.c ar_subs.c buf_subs.c cpio.c file_subs.c ftree.c\ gen_subs.c getoldopt.c options.c pat_rep.c pax.c sel_subs.c tables.c\ tar.c tty_subs.c MAN= pax.1 tar.1 cpio.1 diff --git a/bin/pax/cache.c b/bin/pax/cache.c deleted file mode 100644 index 8a2cd537952..00000000000 --- a/bin/pax/cache.c +++ /dev/null @@ -1,267 +0,0 @@ -/* $OpenBSD: cache.c,v 1.23 2016/08/26 04:08:18 guenther Exp $ */ -/* $NetBSD: cache.c,v 1.4 1995/03/21 09:07:10 cgd Exp $ */ - -/*- - * Copyright (c) 1992 Keith Muller. - * Copyright (c) 1992, 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Keith Muller of the University of California, San Diego. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include -#include -#include -#include -#include -#include -#include - -#include "pax.h" -#include "extern.h" - -/* - * Constants and data structures used to implement group and password file - * caches. Traditional passwd/group cache routines perform quite poorly with - * archives. The chances of hitting a valid lookup with an archive is quite a - * bit worse than with files already resident on the file system. These misses - * create a MAJOR performance cost. To address this problem, these routines - * cache both hits and misses. - * - * NOTE: name lengths must be as large as those stored in ANY PROTOCOL and - * as stored in the passwd and group files. CACHE SIZES MUST BE PRIME - */ -#define UNMLEN 32 /* >= user name found in any protocol */ -#define GNMLEN 32 /* >= group name found in any protocol */ -#define UNM_SZ 317 /* size of uid_name() cache */ -#define GNM_SZ 317 /* size of gid_name() cache */ -#define VALID 1 /* entry and name are valid */ -#define INVALID 2 /* entry valid, name NOT valid */ - -/* - * Node structures used in the user, group, uid, and gid caches. - */ - -typedef struct uidc { - int valid; /* is this a valid or a miss entry */ - char name[UNMLEN]; /* uid name */ - uid_t uid; /* cached uid */ -} UIDC; - -typedef struct gidc { - int valid; /* is this a valid or a miss entry */ - char name[GNMLEN]; /* gid name */ - gid_t gid; /* cached gid */ -} GIDC; - - -/* - * routines that control user, group, uid and gid caches (for the archive - * member print routine). - * IMPORTANT: - * these routines cache BOTH hits and misses, a major performance improvement - */ - -static int pwopn = 0; /* is password file open */ -static int gropn = 0; /* is group file open */ -static UIDC **usrtb = NULL; /* user name to uid cache */ -static GIDC **grptb = NULL; /* group name to gid cache */ - -/* - * usrtb_start - * creates an empty usrtb - * Return: - * 0 if ok, -1 otherwise - */ - -int -usrtb_start(void) -{ - static int fail = 0; - - if (usrtb != NULL) - return(0); - if (fail) - return(-1); - if ((usrtb = calloc(UNM_SZ, sizeof(UIDC *))) == NULL) { - ++fail; - paxwarn(1, "Unable to allocate memory for user name cache table"); - return(-1); - } - return(0); -} - -/* - * grptb_start - * creates an empty grptb - * Return: - * 0 if ok, -1 otherwise - */ - -int -grptb_start(void) -{ - static int fail = 0; - - if (grptb != NULL) - return(0); - if (fail) - return(-1); - if ((grptb = calloc(GNM_SZ, sizeof(GIDC *))) == NULL) { - ++fail; - paxwarn(1,"Unable to allocate memory for group name cache table"); - return(-1); - } - return(0); -} - -/* - * uid_name() - * caches the uid for a given user name. We use a simple hash table. - * Return - * the uid (if any) for a user name, or a -1 if no match can be found - */ - -int -uid_name(char *name, uid_t *uid) -{ - struct passwd *pw; - UIDC *ptr; - int namelen; - - /* - * return -1 for mangled names - */ - if (((namelen = strlen(name)) == 0) || (name[0] == '\0')) - return(-1); - if ((usrtb == NULL) && (usrtb_start() < 0)) - return(-1); - - /* - * look up in hash table, if found and valid return the uid, - * if found and invalid, return a -1 - */ - ptr = usrtb[st_hash(name, namelen, UNM_SZ)]; - if ((ptr != NULL) && (ptr->valid > 0) && !strcmp(name, ptr->name)) { - if (ptr->valid == INVALID) - return(-1); - *uid = ptr->uid; - return(0); - } - - if (!pwopn) { - setpassent(1); - ++pwopn; - } - - if (ptr == NULL) - ptr = usrtb[st_hash(name, namelen, UNM_SZ)] = - malloc(sizeof(UIDC)); - - /* - * no match, look it up, if no match store it as an invalid entry, - * or store the matching uid - */ - if (ptr == NULL) { - if ((pw = getpwnam(name)) == NULL) - return(-1); - *uid = pw->pw_uid; - return(0); - } - (void)strlcpy(ptr->name, name, sizeof(ptr->name)); - if ((pw = getpwnam(name)) == NULL) { - ptr->valid = INVALID; - return(-1); - } - ptr->valid = VALID; - *uid = ptr->uid = pw->pw_uid; - return(0); -} - -/* - * gid_name() - * caches the gid for a given group name. We use a simple hash table. - * Return - * the gid (if any) for a group name, or a -1 if no match can be found - */ - -int -gid_name(char *name, gid_t *gid) -{ - struct group *gr; - GIDC *ptr; - int namelen; - - /* - * return -1 for mangled names - */ - if (((namelen = strlen(name)) == 0) || (name[0] == '\0')) - return(-1); - if ((grptb == NULL) && (grptb_start() < 0)) - return(-1); - - /* - * look up in hash table, if found and valid return the uid, - * if found and invalid, return a -1 - */ - ptr = grptb[st_hash(name, namelen, GNM_SZ)]; - if ((ptr != NULL) && (ptr->valid > 0) && !strcmp(name, ptr->name)) { - if (ptr->valid == INVALID) - return(-1); - *gid = ptr->gid; - return(0); - } - - if (!gropn) { - setgroupent(1); - ++gropn; - } - if (ptr == NULL) - ptr = grptb[st_hash(name, namelen, GNM_SZ)] = - malloc(sizeof(GIDC)); - - /* - * no match, look it up, if no match store it as an invalid entry, - * or store the matching gid - */ - if (ptr == NULL) { - if ((gr = getgrnam(name)) == NULL) - return(-1); - *gid = gr->gr_gid; - return(0); - } - - (void)strlcpy(ptr->name, name, sizeof(ptr->name)); - if ((gr = getgrnam(name)) == NULL) { - ptr->valid = INVALID; - return(-1); - } - ptr->valid = VALID; - *gid = ptr->gid = gr->gr_gid; - return(0); -} diff --git a/bin/pax/extern.h b/bin/pax/extern.h index 5bc00d0761b..2d04bdcfc01 100644 --- a/bin/pax/extern.h +++ b/bin/pax/extern.h @@ -1,4 +1,4 @@ -/* $OpenBSD: extern.h,v 1.58 2017/09/12 17:11:11 otto Exp $ */ +/* $OpenBSD: extern.h,v 1.59 2018/09/13 12:33:43 millert Exp $ */ /* $NetBSD: extern.h,v 1.5 1996/03/26 23:54:16 mrg Exp $ */ /*- @@ -95,14 +95,6 @@ void cp_file(ARCHD *, int, int); int buf_fill(void); int buf_flush(int); -/* - * cache.c - */ -int usrtb_start(void); -int grptb_start(void); -int uid_name(char *, uid_t *); -int gid_name(char *, gid_t *); - /* * cpio.c */ @@ -301,7 +293,6 @@ int tar_id(char *, int); int tar_opt(void); int tar_rd(ARCHD *, char *); int tar_wr(ARCHD *); -int ustar_strd(void); int ustar_id(char *, int); int ustar_rd(ARCHD *, char *); int ustar_wr(ARCHD *); diff --git a/bin/pax/options.c b/bin/pax/options.c index d615e39cfbe..5db0948858c 100644 --- a/bin/pax/options.c +++ b/bin/pax/options.c @@ -1,4 +1,4 @@ -/* $OpenBSD: options.c,v 1.101 2016/12/26 23:43:52 krw Exp $ */ +/* $OpenBSD: options.c,v 1.102 2018/09/13 12:33:43 millert Exp $ */ /* $NetBSD: options.c,v 1.6 1996/03/26 23:54:18 mrg Exp $ */ /*- @@ -201,7 +201,7 @@ FSUB fsub[] = { tar_opt}, /* 5: POSIX USTAR */ - {"ustar", 10240, BLKMULT, 0, 1, BLKMULT, 0, ustar_id, ustar_strd, + {"ustar", 10240, BLKMULT, 0, 1, BLKMULT, 0, ustar_id, no_op, ustar_rd, tar_endrd, no_op, ustar_wr, tar_endwr, tar_trail, tar_opt}, diff --git a/bin/pax/pax.c b/bin/pax/pax.c index 91045afbfe5..f6b3634369a 100644 --- a/bin/pax/pax.c +++ b/bin/pax/pax.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pax.c,v 1.51 2017/12/08 17:04:14 deraadt Exp $ */ +/* $OpenBSD: pax.c,v 1.52 2018/09/13 12:33:43 millert Exp $ */ /* $NetBSD: pax.c,v 1.5 1996/03/26 23:54:20 mrg Exp $ */ /*- @@ -44,7 +44,9 @@ #include #include #include +#include #include +#include #include #include "pax.h" @@ -249,6 +251,12 @@ main(int argc, char **argv) tempbase = tempfile + tdlen; *tempbase++ = '/'; + /* + * keep passwd and group files open for faster lookups. + */ + setpassent(1); + setgroupent(1); + /* * parse options, determine operational mode, general init */ diff --git a/bin/pax/sel_subs.c b/bin/pax/sel_subs.c index 17200b5a48f..dbbb4ce4028 100644 --- a/bin/pax/sel_subs.c +++ b/bin/pax/sel_subs.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sel_subs.c,v 1.26 2016/08/26 04:20:38 guenther Exp $ */ +/* $OpenBSD: sel_subs.c,v 1.27 2018/09/13 12:33:43 millert Exp $ */ /* $NetBSD: sel_subs.c,v 1.5 1995/03/21 09:07:42 cgd Exp $ */ /*- @@ -133,7 +133,6 @@ usr_add(char *str) { u_int indx; USRT *pt; - struct passwd *pw; uid_t uid; /* @@ -156,11 +155,10 @@ usr_add(char *str) */ if ((str[0] == '\\') && (str[1] == '#')) ++str; - if ((pw = getpwnam(str)) == NULL) { + if (uid_from_user(str, &uid) < 0) { paxwarn(1, "Unable to find uid for user: %s", str); return(-1); } - uid = (uid_t)pw->pw_uid; } else uid = (uid_t)strtoul(str+1, NULL, 10); endpwent(); @@ -230,7 +228,6 @@ grp_add(char *str) { u_int indx; GRPT *pt; - struct group *gr; gid_t gid; /* @@ -245,7 +242,7 @@ grp_add(char *str) } /* - * figure out user spec + * figure out group spec */ if (str[0] != '#') { /* @@ -253,11 +250,10 @@ grp_add(char *str) */ if ((str[0] == '\\') && (str[1] == '#')) ++str; - if ((gr = getgrnam(str)) == NULL) { + if (gid_from_group(str, &gid) < 0) { paxwarn(1,"Cannot determine gid for group name: %s", str); return(-1); } - gid = (gid_t)gr->gr_gid; } else gid = (gid_t)strtoul(str+1, NULL, 10); endgrent(); diff --git a/bin/pax/tar.c b/bin/pax/tar.c index 5cd0702b7c2..a49a5e885fb 100644 --- a/bin/pax/tar.c +++ b/bin/pax/tar.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tar.c,v 1.66 2017/09/16 07:42:34 otto Exp $ */ +/* $OpenBSD: tar.c,v 1.67 2018/09/13 12:33:43 millert Exp $ */ /* $NetBSD: tar.c,v 1.5 1995/03/21 09:07:49 cgd Exp $ */ /*- @@ -665,21 +665,6 @@ tar_wr(ARCHD *arcn) * Routines for POSIX ustar */ -/* - * ustar_strd() - * initialization for ustar read - * Return: - * 0 if ok, -1 otherwise - */ - -int -ustar_strd(void) -{ - if ((usrtb_start() < 0) || (grptb_start() < 0)) - return(-1); - return(0); -} - /* * ustar_id() * determine if a block given to us is a valid ustar header. We have to @@ -813,10 +798,10 @@ reset: * the posix spec wants). */ hd->gname[sizeof(hd->gname) - 1] = '\0'; - if (Nflag || gid_name(hd->gname, &(arcn->sb.st_gid)) < 0) + if (Nflag || gid_from_group(hd->gname, &(arcn->sb.st_gid)) < 0) arcn->sb.st_gid = (gid_t)asc_ul(hd->gid, sizeof(hd->gid), OCT); hd->uname[sizeof(hd->uname) - 1] = '\0'; - if (Nflag || uid_name(hd->uname, &(arcn->sb.st_uid)) < 0) + if (Nflag || uid_from_user(hd->uname, &(arcn->sb.st_uid)) < 0) arcn->sb.st_uid = (uid_t)asc_ul(hd->uid, sizeof(hd->uid), OCT); /* @@ -921,8 +906,8 @@ int ustar_wr(ARCHD *arcn) { HD_USTAR *hd; - char *pt, *name; - char hdblk[sizeof(HD_USTAR)]; + const char *name; + char *pt, hdblk[sizeof(HD_USTAR)]; /* * check for those file system types ustar cannot store @@ -1051,7 +1036,7 @@ ustar_wr(ARCHD *arcn) */ if (ul_oct(arcn->sb.st_uid, hd->uid, sizeof(hd->uid), 3)) { if (uid_nobody == 0) { - if (uid_name("nobody", &uid_nobody) == -1) + if (uid_from_user("nobody", &uid_nobody) == -1) goto out; } if (uid_warn != arcn->sb.st_uid) { @@ -1065,7 +1050,7 @@ ustar_wr(ARCHD *arcn) } if (ul_oct(arcn->sb.st_gid, hd->gid, sizeof(hd->gid), 3)) { if (gid_nobody == 0) { - if (gid_name("nobody", &gid_nobody) == -1) + if (gid_from_group("nobody", &gid_nobody) == -1) goto out; } if (gid_warn != arcn->sb.st_gid) { -- 2.20.1