Without this change, if tar tried to extract a file A/B/C, noticed that A/B didn't exist, attempted to mkdir A/B, and the mkdir failed, it did not diagnose the mkdir failure, but simply reported the failure to open A/B/C. This sometimes led to confusion because it wasn't clear what tar was trying to do, in particular that tar tried to mkdir A/B. With this patch, tar issues two diagnostics in this case: one for A/B and the other for A/B/C. Problem reported by Hauke Laging in <http://lists.gnu.org/archive/html/bug-tar/2010-10/msg00020.html>. * gnulib.modules: Remove faccessat. * src/extract.c (make_directories): New arg INTERDIR_MADE. Diagnose mkdir failure. Return 0 on success, nonzero on failure, as opposed to nonzero iff some directory was created. All callers changed. Simplify the code when mkdir fails, by checking whether the desired file exists unless errno==EEXIST: this is more robust. * tests/extrac15.at: New test, to check this. * tests/Makefile.am (TESTSUITE_AT): Add it. * tests/testsuite.at: Include it.
45 lines
1.3 KiB
Plaintext
45 lines
1.3 KiB
Plaintext
# Process this file with autom4te to create testsuite. -*- Autotest -*-
|
|
|
|
# Test suite for GNU tar.
|
|
# Copyright (C) 2010 Free Software Foundation, Inc.
|
|
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 3, or (at your option)
|
|
# any later version.
|
|
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
# written by Paul Eggert
|
|
|
|
# Check diagnostic of 'tar -x a/b/c' when b cannot be created.
|
|
|
|
AT_SETUP([extract parent mkdir failure])
|
|
AT_KEYWORDS([extract extrac15])
|
|
|
|
AT_TAR_CHECK([
|
|
AT_UNPRIVILEGED_PREREQ
|
|
|
|
mkdir src src/a src/a/b dest dest/a
|
|
touch src/a/b/c
|
|
chmod a-w dest/a
|
|
|
|
tar -cf archive.tar -C src a/b/c &&
|
|
if tar -xf archive.tar -C dest a/b/c
|
|
then (exit 1)
|
|
else (exit 0)
|
|
fi
|
|
],
|
|
[0],[],[tar: a/b: Cannot mkdir: Permission denied
|
|
tar: a/b/c: Cannot open: No such file or directory
|
|
tar: Exiting with failure status due to previous errors
|
|
],[],[],[gnu])
|
|
|
|
AT_CLEANUP
|