tar: -x -C symlink fix

* src/misc.c (chdir_do): Don't use O_NOFOLLOW when opening the
argument to -C.  This is for consistency with "tar -c -C FOO", and
matches the new documentation.
* tests/extrac14.at: New file.
* tests/Makefile.am (TESTSUITE_AT): Add it.
* tests/testsuite.at: Include it.
This commit is contained in:
Paul Eggert
2010-09-24 13:13:25 -07:00
parent 14efeb9f95
commit c5c196310e
4 changed files with 40 additions and 1 deletions

View File

@@ -736,7 +736,8 @@ chdir_do (int i)
{
if (! IS_ABSOLUTE_FILE_NAME (curr->name))
chdir_do (i - 1);
fd = openat (chdir_fd, curr->name, open_searchdir_flags);
fd = openat (chdir_fd, curr->name,
open_searchdir_flags & ~ O_NOFOLLOW);
if (fd < 0)
open_fatal (curr->name);

View File

@@ -80,6 +80,7 @@ TESTSUITE_AT = \
extrac11.at\
extrac12.at\
extrac13.at\
extrac14.at\
filerem01.at\
filerem02.at\
gzip.at\

36
tests/extrac14.at Normal file
View File

@@ -0,0 +1,36 @@
# 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 that 'tar -x -C FOO' follows FOO if FOO is a symbolic link.
AT_SETUP([extract -C symlink])
AT_KEYWORDS([extract extrac14])
AT_TAR_CHECK([
mkdir dest
ln -s dest symlink
echo foo >foo
tar -cf archive.tar foo &&
tar -xf archive.tar -C symlink &&
cmp foo dest/foo
],
[0],[],[],[],[],[gnu])
AT_CLEANUP

View File

@@ -152,6 +152,7 @@ m4_include([extrac10.at])
m4_include([extrac11.at])
m4_include([extrac12.at])
m4_include([extrac13.at])
m4_include([extrac14.at])
m4_include([label01.at])
m4_include([label02.at])