tar: no need to report getcwd error if never using the result

* src/misc.c (struct wd): Rename 'saved' to 'err', with new semantics.
(chdir_arg, chdir_do): Adjust to new semantics.  Do not report an
error merely because save_cwd fails; report an error only if
save_cwd's result is needed later.
* tests/extrac09.at: New file, to test for bug that was fixed.
* tests/testsuite.at: Include it.
* tests/Makefile.am (TESTSUITE_AT): Add it.
This commit is contained in:
Paul R. Eggert
2010-07-18 12:20:47 -07:00
committed by Paul Eggert
parent 427b3b8c79
commit 8c662c9f29
4 changed files with 69 additions and 15 deletions
+21 -15
View File
@@ -640,8 +640,15 @@ set_file_atime (int fd, char const *file, struct timespec const timespec[2])
/* A description of a working directory. */
struct wd
{
/* The directory's name. */
char const *name;
int saved;
/* A negative value if no attempt has been made to save the
directory, 0 if it was saved successfully, and a positive errno
value if it was not saved successfully. */
int err;
/* The saved version of the directory, if SAVED == 1. */
struct saved_cwd saved_cwd;
};
@@ -680,7 +687,7 @@ chdir_arg (char const *dir)
if (! wd_count)
{
wd[wd_count].name = ".";
wd[wd_count].saved = 0;
wd[wd_count].err = -1;
wd_count++;
}
}
@@ -697,7 +704,7 @@ chdir_arg (char const *dir)
}
wd[wd_count].name = dir;
wd[wd_count].saved = 0;
wd[wd_count].err = -1;
return wd_count++;
}
@@ -713,12 +720,11 @@ chdir_do (int i)
struct wd *prev = &wd[previous];
struct wd *curr = &wd[i];
if (! prev->saved)
if (prev->err < 0)
{
int err = 0;
prev->saved = 1;
prev->err = 0;
if (save_cwd (&prev->saved_cwd) != 0)
err = errno;
prev->err = errno;
else if (0 <= prev->saved_cwd.desc)
{
/* Make sure we still have at least one descriptor available. */
@@ -733,20 +739,20 @@ chdir_do (int i)
prev->saved_cwd.desc = -1;
prev->saved_cwd.name = xgetcwd ();
if (! prev->saved_cwd.name)
err = errno;
prev->err = errno;
}
else
err = errno;
prev->err = errno;
}
if (err)
FATAL_ERROR ((0, err, _("Cannot save working directory")));
}
if (curr->saved)
if (0 <= curr->err)
{
if (restore_cwd (&curr->saved_cwd))
FATAL_ERROR ((0, 0, _("Cannot change working directory")));
int err = curr->err;
if (err == 0 && restore_cwd (&curr->saved_cwd) != 0)
err = errno;
if (err)
FATAL_ERROR ((0, err, _("Cannot restore working directory")));
}
else
{