I'm resending the patch which is now little bit extended.

Note that I don't think that there is any race condition during signal arrival. sigstat() doesn't any unlink...

Petr
>From ea69905b614ad97d9705e764fdbec01ddbc39f70 Mon Sep 17 00:00:00 2001
From: Petr Sumbera <[email protected]>
Date: Tue, 10 Aug 2010 16:03:45 +0200
Subject: child process may want to have linkdir privilege restored

---
 src/extract.c |    3 ---
 src/system.c  |    8 ++++++++
 2 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/src/extract.c b/src/extract.c
index 9897e82..886c8da 100644
--- a/src/extract.c
+++ b/src/extract.c
@@ -1271,9 +1271,6 @@ extract_archive (void)
 
   fatal_exit_hook = extract_finish;
 
-  /* Try to disable the ability to unlink a directory.  */
-  priv_set_remove_linkdir ();
-
   set_next_block_after (current_header);
 
   if (!current_stat_info.file_name[0]
diff --git a/src/system.c b/src/system.c
index 345cc07..fcb7949 100644
--- a/src/system.c
+++ b/src/system.c
@@ -20,6 +20,7 @@
 #include <system.h>
 
 #include "common.h"
+#include <priv-set.h> 
 #include <rmt.h>
 #include <signal.h>
 
@@ -695,6 +696,8 @@ sys_exec_command (char *file_name, int typechar, struct 
tar_stat_info *st)
   xdup2 (p[PREAD], STDIN_FILENO);
   xclose (p[PWRITE]);
 
+  priv_set_restore_linkdir();
+
   stat_to_env (file_name, typechar, st);
 
   argv[0] = "/bin/sh";
@@ -811,6 +814,8 @@ sys_exec_info_script (const char **archive_name, int 
volume_number)
 
   xclose (p[PREAD]);
 
+  priv_set_restore_linkdir();
+
   argv[0] = "/bin/sh";
   argv[1] = "-c";
   argv[2] = (char *) info_script_option;
@@ -858,6 +863,9 @@ sys_exec_checkpoint_script (const char *script_name,
   setenv ("TAR_FORMAT",
          archive_format_string (current_format == DEFAULT_FORMAT ?
                                 archive_format : current_format), 1);
+
+  priv_set_restore_linkdir();
+
   argv[0] = "/bin/sh";
   argv[1] = "-c";
   argv[2] = (char *) script_name;
-- 
1.5.6.5

Reply via email to