Module Name: src Committed By: perry Date: Tue Apr 7 19:52:35 UTC 2009
Modified Files: src/bin/pax: extern.h file_subs.c options.c pat_rep.c pax.h Log Message: Fixes from christos for pr-41167 XXX -X is still broken, but that wasn't part of this PR. To generate a diff of this commit: cvs rdiff -u -r1.55 -r1.56 src/bin/pax/extern.h cvs rdiff -u -r1.61 -r1.62 src/bin/pax/file_subs.c cvs rdiff -u -r1.103 -r1.104 src/bin/pax/options.c cvs rdiff -u -r1.28 -r1.29 src/bin/pax/pat_rep.c cvs rdiff -u -r1.29 -r1.30 src/bin/pax/pax.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/bin/pax/extern.h diff -u src/bin/pax/extern.h:1.55 src/bin/pax/extern.h:1.56 --- src/bin/pax/extern.h:1.55 Sun Feb 24 20:42:46 2008 +++ src/bin/pax/extern.h Tue Apr 7 19:52:35 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: extern.h,v 1.55 2008/02/24 20:42:46 joerg Exp $ */ +/* $NetBSD: extern.h,v 1.56 2009/04/07 19:52:35 perry Exp $ */ /*- * Copyright (c) 1992 Keith Muller. @@ -216,7 +216,7 @@ * pat_rep.c */ int rep_add(char *); -int pat_add(char *, char *); +int pat_add(char *, char *, int); void pat_chk(void); int pat_sel(ARCHD *); int pat_match(ARCHD *); Index: src/bin/pax/file_subs.c diff -u src/bin/pax/file_subs.c:1.61 src/bin/pax/file_subs.c:1.62 --- src/bin/pax/file_subs.c:1.61 Thu Jan 10 04:24:51 2008 +++ src/bin/pax/file_subs.c Tue Apr 7 19:52:35 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: file_subs.c,v 1.61 2008/01/10 04:24:51 tls Exp $ */ +/* $NetBSD: file_subs.c,v 1.62 2009/04/07 19:52:35 perry Exp $ */ /*- * Copyright (c) 1992 Keith Muller. @@ -42,7 +42,7 @@ #if 0 static char sccsid[] = "@(#)file_subs.c 8.1 (Berkeley) 5/31/93"; #else -__RCSID("$NetBSD: file_subs.c,v 1.61 2008/01/10 04:24:51 tls Exp $"); +__RCSID("$NetBSD: file_subs.c,v 1.62 2009/04/07 19:52:35 perry Exp $"); #endif #endif /* not lint */ @@ -275,15 +275,9 @@ /* * We may be running as root, so we have to be sure that link target - * is not a directory, so we lstat and check + * is not a directory, so we lstat and check. XXX: This is still racy. */ - if (lstat(arcn->ln_name, &sb) < 0) { - syswarn(1, errno, "Cannot link to %s from %s", arcn->ln_name, - arcn->name); - return -1; - } - - if (S_ISDIR(sb.st_mode)) { + if (lstat(arcn->ln_name, &sb) != -1 && S_ISDIR(sb.st_mode)) { tty_warn(1, "A hard link to the directory %s is not allowed", arcn->ln_name); return -1; Index: src/bin/pax/options.c diff -u src/bin/pax/options.c:1.103 src/bin/pax/options.c:1.104 --- src/bin/pax/options.c:1.103 Sat Feb 14 08:10:06 2009 +++ src/bin/pax/options.c Tue Apr 7 19:52:35 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: options.c,v 1.103 2009/02/14 08:10:06 lukem Exp $ */ +/* $NetBSD: options.c,v 1.104 2009/04/07 19:52:35 perry Exp $ */ /*- * Copyright (c) 1992 Keith Muller. @@ -42,7 +42,7 @@ #if 0 static char sccsid[] = "@(#)options.c 8.2 (Berkeley) 4/18/94"; #else -__RCSID("$NetBSD: options.c,v 1.103 2009/02/14 08:10:06 lukem Exp $"); +__RCSID("$NetBSD: options.c,v 1.104 2009/04/07 19:52:35 perry Exp $"); #endif #endif /* not lint */ @@ -692,7 +692,7 @@ case LIST: case EXTRACT: for (; optind < argc; optind++) - if (pat_add(argv[optind], NULL) < 0) + if (pat_add(argv[optind], NULL, NOGLOB_MTCH) < 0) pax_usage(); break; case COPY: @@ -1234,7 +1234,7 @@ free(str); continue; } - if (pat_add(str, dir) < 0) + if (pat_add(str, dir, NOGLOB_MTCH) < 0) tar_usage(); sawpat = 1; } @@ -1254,7 +1254,7 @@ break; chdname = *argv++; havechd++; - } else if (pat_add(*argv++, chdname) < 0) + } else if (pat_add(*argv++, chdname, 0) < 0) tar_usage(); else sawpat = 1; @@ -1642,7 +1642,7 @@ cpio_usage(); } while ((str = getline(fp)) != NULL) { - pat_add(str, NULL); + pat_add(str, NULL, 0); } fclose(fp); if (getline_error) { @@ -1781,7 +1781,7 @@ case LIST: case EXTRACT: for (; optind < argc; optind++) - if (pat_add(argv[optind], 0) < 0) + if (pat_add(argv[optind], NULL, 0) < 0) cpio_usage(); break; case COPY: Index: src/bin/pax/pat_rep.c diff -u src/bin/pax/pat_rep.c:1.28 src/bin/pax/pat_rep.c:1.29 --- src/bin/pax/pat_rep.c:1.28 Sun Feb 24 20:42:46 2008 +++ src/bin/pax/pat_rep.c Tue Apr 7 19:52:35 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: pat_rep.c,v 1.28 2008/02/24 20:42:46 joerg Exp $ */ +/* $NetBSD: pat_rep.c,v 1.29 2009/04/07 19:52:35 perry Exp $ */ /*- * Copyright (c) 1992 Keith Muller. @@ -42,7 +42,7 @@ #if 0 static char sccsid[] = "@(#)pat_rep.c 8.2 (Berkeley) 4/18/94"; #else -__RCSID("$NetBSD: pat_rep.c,v 1.28 2008/02/24 20:42:46 joerg Exp $"); +__RCSID("$NetBSD: pat_rep.c,v 1.29 2009/04/07 19:52:35 perry Exp $"); #endif #endif /* not lint */ @@ -75,7 +75,7 @@ static int rep_name(char *, size_t, int *, int); static int tty_rename(ARCHD *); static int fix_path(char *, int *, char *, int); -static int fn_match(char *, char *, char **); +static int fn_match(char *, char *, char **, int); static char * range_match(char *, int); static int checkdotdot(const char *); static int resub(regex_t *, regmatch_t *, char *, char *, char *, char *); @@ -236,7 +236,7 @@ */ int -pat_add(char *str, char *chdn) +pat_add(char *str, char *chdn, int flags) { PATTERN *pt; @@ -262,7 +262,7 @@ pt->pend = NULL; pt->plen = strlen(str); pt->fow = NULL; - pt->flgs = 0; + pt->flgs = flags; pt->chdname = chdn; if (pathead == NULL) { pattail = pathead = pt; @@ -471,7 +471,8 @@ if ((arcn->name[pt->plen] == '/') && (strncmp(pt->pstr, arcn->name, pt->plen) == 0)) break; - } else if (fn_match(pt->pstr, arcn->name, &pt->pend) == 0) + } else if (fn_match(pt->pstr, arcn->name, &pt->pend, + pt->flgs & NOGLOB_MTCH) == 0) break; pt = pt->fow; } @@ -509,7 +510,7 @@ */ static int -fn_match(char *pattern, char *string, char **pend) +fn_match(char *pattern, char *string, char **pend, int noglob) { char c; char test; @@ -537,10 +538,14 @@ *pend = string; return 0; case '?': + if (noglob) + goto regular; if ((test = *string++) == '\0') return (-1); break; case '*': + if (noglob) + goto regular; c = *pattern; /* * Collapse multiple *'s. @@ -558,12 +563,14 @@ * General case, use recursion. */ while ((test = *string) != '\0') { - if (!fn_match(pattern, string, pend)) + if (!fn_match(pattern, string, pend, noglob)) return (0); ++string; } return (-1); case '[': + if (noglob) + goto regular; /* * range match */ @@ -573,6 +580,7 @@ break; case '\\': default: + regular: if (c != *string++) return (-1); break; Index: src/bin/pax/pax.h diff -u src/bin/pax/pax.h:1.29 src/bin/pax/pax.h:1.30 --- src/bin/pax/pax.h:1.29 Sat Feb 14 08:10:06 2009 +++ src/bin/pax/pax.h Tue Apr 7 19:52:35 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: pax.h,v 1.29 2009/02/14 08:10:06 lukem Exp $ */ +/* $NetBSD: pax.h,v 1.30 2009/04/07 19:52:35 perry Exp $ */ /*- * Copyright (c) 1992 Keith Muller. @@ -89,6 +89,7 @@ int flgs; /* processing/state flags */ #define MTCH 0x1 /* pattern has been matched */ #define DIR_MTCH 0x2 /* pattern matched a directory */ +#define NOGLOB_MTCH 0x4 /* non-globbing match */ struct pattern *fow; /* next pattern */ } PATTERN;