From 084c8c66276ff27072f5b898b4aa8f7153d1464b Mon Sep 17 00:00:00 2001 From: nectar Date: Mon, 27 Jul 1998 18:40:09 +0000 Subject: fixed: tar will extract file even if -C command fails tar now exits with new exit code EX_BADDIR after a failed chdir() in name_next(), name_match(), and name_from_list(). PR: bin/2394 Submitted by: Satoshi Asami --- gnu/usr.bin/tar/tar.c | 20 +++++++++++++++----- gnu/usr.bin/tar/tar.h | 1 + 2 files changed, 16 insertions(+), 5 deletions(-) (limited to 'gnu') diff --git a/gnu/usr.bin/tar/tar.c b/gnu/usr.bin/tar/tar.c index c71202b..7b813e5 100644 --- a/gnu/usr.bin/tar/tar.c +++ b/gnu/usr.bin/tar/tar.c @@ -924,8 +924,10 @@ tryagain: } if (q) { - if (chdir (p) < 0) + if (chdir (p) < 0) { msg_perror ("Can't chdir to %s", p); + exit(EX_BADDIR); + } q = 0; goto tryagain; } @@ -1152,8 +1154,10 @@ again: return 1; if (nlp->fake) { - if (nlp->change_dir && chdir (nlp->change_dir)) + if (nlp->change_dir && chdir (nlp->change_dir)) { msg_perror ("Can't change to directory %s", nlp->change_dir); + exit(EX_BADDIR); + } namelist = 0; return 1; } @@ -1175,8 +1179,10 @@ again: free ((void *) namelist); namelist = 0; } - if (nlp->change_dir && chdir (nlp->change_dir)) + if (nlp->change_dir && chdir (nlp->change_dir)) { msg_perror ("Can't change to directory %s", nlp->change_dir); + exit(EX_BADDIR); + } return 1; /* We got a match */ } continue; @@ -1194,8 +1200,10 @@ again: free ((void *) namelist); namelist = 0; } - if (nlp->change_dir && chdir (nlp->change_dir)) + if (nlp->change_dir && chdir (nlp->change_dir)) { msg_perror ("Can't change to directory %s", nlp->change_dir); + exit(EX_BADDIR); + } if (f_fast_read) { if (strcmp(p, nlp->name) == 0) { /* remove the current entry, since we found a match */ @@ -1361,8 +1369,10 @@ name_from_list () { gnu_list_name->found++; if (gnu_list_name->change_dir) - if (chdir (gnu_list_name->change_dir) < 0) + if (chdir (gnu_list_name->change_dir) < 0) { msg_perror ("can't chdir to %s", gnu_list_name->change_dir); + exit(EX_BADDIR); + } return gnu_list_name->name; } return (char *) 0; diff --git a/gnu/usr.bin/tar/tar.h b/gnu/usr.bin/tar/tar.h index 72b190c..90cf392 100644 --- a/gnu/usr.bin/tar/tar.h +++ b/gnu/usr.bin/tar/tar.h @@ -151,6 +151,7 @@ union record #define EX_BADVOL 5 /* Special error code means Tape volume doesn't match the one specified on the command line */ +#define EX_BADDIR 6 /* bad directory name */ /* * Global variables -- cgit v1.1