Tar 1.23 hangs when trying to extract an already exisiting symlink when
using the -k (--keep-old-files) option.
The open() call in create_placeholder_file() fails because of the O_EXCL
bit, so create_placeholder_file() starts retrying the operation in a
tight loop because it does not seem to handle to return value
RECOVER_SKIP from maybe_recoverable().
The following patch solves the problem for me:
--- ../../tar-1.23-org/src/extract.c 2010-01-26 12:28:09.000000000 +0100
+++ ../../tar-1.23/src/extract.c 2010-03-25 10:36:24.256827175 +0100
@@ -888,7 +888,7 @@ create_placeholder_file (char *file_name
struct stat st;
while ((fd = open (file_name, O_WRONLY | O_CREAT | O_EXCL, 0)) < 0)
- if (! maybe_recoverable (file_name, interdir_made))
+ if (maybe_recoverable (file_name, interdir_made) != RECOVER_OK)
break;
if (fd < 0)
It seems that the new return value RECOVER_SKIP was newly added in 1.23.
Browsing through extract.c I noticed there might be more calls to
maybe_recoverable() where the return value is interpreted as a boolean and the
value EXTRACT_OK is not explicitly checked, so there might be more similar
problems in the code.
Ico
--
:wq
^X^Cy^K^X^C^C^C^C