[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Bug-tar] [PATCH] tar: fix -x --overwrite bug (no --dereference, ! O_NOF
From: |
Paul Eggert |
Subject: |
[Bug-tar] [PATCH] tar: fix -x --overwrite bug (no --dereference, ! O_NOFOLLOW) |
Date: |
Tue, 26 Oct 2010 18:04:10 -0700 |
User-agent: |
Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.11) Gecko/20101006 Thunderbird/3.1.5 |
I pushed this.
-----
This bug was discovered on Solaris 8. On older hosts lacking
O_NOFOLLOW, tar -x --overwrite (without --dereference) follows
symbolic links, causing the "extract over symlinks" test to fail.
* src/extract.c (open_output_file): If O_NOFOLLOW is needed but
does not work, check for a symlink separately.
---
src/extract.c | 14 ++++++++++++++
1 files changed, 14 insertions(+), 0 deletions(-)
diff --git a/src/extract.c b/src/extract.c
index 98236ac..44233b9 100644
--- a/src/extract.c
+++ b/src/extract.c
@@ -864,6 +864,20 @@ open_output_file (char const *file_name, int typeflag,
mode_t mode,
}
}
+ /* If O_NOFOLLOW is needed but does not work, check for a symlink
+ separately. There's a race condition, but that cannot be avoided
+ on hosts lacking O_NOFOLLOW. */
+ if (! O_NOFOLLOW && overwriting_old_files && ! dereference_option)
+ {
+ struct stat st;
+ if (fstatat (chdir_fd, file_name, &st, AT_SYMLINK_NOFOLLOW) == 0
+ && S_ISLNK (st.st_mode))
+ {
+ errno = ELOOP;
+ return -1;
+ }
+ }
+
fd = openat (chdir_fd, file_name, openflag, mode);
if (0 <= fd)
{
--
1.7.2
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Bug-tar] [PATCH] tar: fix -x --overwrite bug (no --dereference, ! O_NOFOLLOW),
Paul Eggert <=