diff options
Diffstat (limited to 'contrib/tar')
-rw-r--r-- | contrib/tar/src/extract.c | 11 | ||||
-rw-r--r-- | contrib/tar/src/misc.c | 7 |
2 files changed, 17 insertions, 1 deletions
diff --git a/contrib/tar/src/extract.c b/contrib/tar/src/extract.c index e4924837d934..3032da06ceb3 100644 --- a/contrib/tar/src/extract.c +++ b/contrib/tar/src/extract.c @@ -1026,10 +1026,19 @@ extract_archive (void) { struct stat st1, st2; int e; + size_t skiplinkcrud; + + if (absolute_names_option) + skiplinkcrud = 0; + else { + skiplinkcrud = FILESYSTEM_PREFIX_LEN (current_link_name); + while (ISSLASH (current_link_name[skiplinkcrud])) + skiplinkcrud++; + } /* MSDOS does not implement links. However, djgpp's link() actually copies the file. */ - status = link (current_link_name, CURRENT_FILE_NAME); + status = link (current_link_name + skiplinkcrud, CURRENT_FILE_NAME); if (status == 0) { diff --git a/contrib/tar/src/misc.c b/contrib/tar/src/misc.c index 10851fe3bd94..8ece9c6ffd3f 100644 --- a/contrib/tar/src/misc.c +++ b/contrib/tar/src/misc.c @@ -216,6 +216,13 @@ contains_dot_dot (char const *name) return 0; } while (! ISSLASH (*p)); + + do + { + if (! *p++) + return 0; + } + while ( ISSLASH (*p)); } } |