chantra / rpms / rpm

Forked from rpms/rpm 2 years ago
Clone
648606
commit c707ab26362e795d3f9dba4eb87dc7ed99a28bcb
648606
Author: Robin Lee <cheeselee@fedoraproject.org>
648606
Date:   Sat Apr 8 21:21:39 2017 +0800
648606
648606
    Fix non-standard inherented modes of directories in debuginfo
648606
    
648606
    In case that binary compiled from source generated in /tmp, a
648606
    /usr/src/debug/tmp directory will be created with the same mode as
648606
    /tmp, a.k.a 777, which should be avoided.
648606
    
648606
    Fixes: rhbz#641022
648606
648606
diff --git a/scripts/find-debuginfo.sh b/scripts/find-debuginfo.sh
648606
old mode 100644
648606
new mode 100755
648606
index 547dbd9..6f38e19
648606
--- a/scripts/find-debuginfo.sh
648606
+++ b/scripts/find-debuginfo.sh
648606
@@ -396,9 +396,10 @@
648606
   mkdir -p "${RPM_BUILD_ROOT}/usr/src/debug"
648606
   LC_ALL=C sort -z -u "$SOURCEFILE" | grep -E -v -z '(<internal>|<built-in>)$' |
648606
   (cd "$RPM_BUILD_DIR"; cpio -pd0mL "${RPM_BUILD_ROOT}/usr/src/debug")
648606
-  # stupid cpio creates new directories in mode 0700, fixup
648606
+  # stupid cpio creates new directories in mode 0700,
648606
+  # and non-standard modes may be inherented from original directories, fixup
648606
   find "${RPM_BUILD_ROOT}/usr/src/debug" -type d -print0 |
648606
-  xargs --no-run-if-empty -0 chmod a+rx
648606
+  xargs --no-run-if-empty -0 chmod 0755
648606
 fi
648606
 
648606
 if [ -d "${RPM_BUILD_ROOT}/usr/lib" -o -d "${RPM_BUILD_ROOT}/usr/src" ]; then
648606
648606
commit e795899780337dea751d85db8f381eff3fe75275
648606
Author: Mark Wielaard <mark@klomp.org>
648606
Date:   Fri Apr 21 17:33:26 2017 +0200
648606
648606
    debugedit: Only output comp_dir under build dir (once).
648606
    
648606
    The fix for rhbz#444310 (commit c1a5eb - Include empty CU current dirs)
648606
    was a little greedy. It would also include comp_dirs outside the build
648606
    root. Those are unnecessary and we don't have a good way to store them.
648606
    Such dirs (e.g. /tmp) would then show up at the root of /usr/src/debug.
648606
    
648606
    Fix this by including only comp_dirs under base_dir. Also only output
648606
    all dirs once (during phase zero) and don't output empty dirs (which
648606
    was harmless but would produce a warning from cpio).
648606
    
648606
    This still includes all empty dirs from the original rhbz#444310
648606
    nodir testcase and it is an alternative fix for rhbz#641022
648606
    (commit c707ab).
648606
    
648606
    Both fixes are necessary in case of an unexpected mode for a directory
648606
    actually in the build root that we want to include in the source list.
648606
    
648606
    Signed-off-by: Mark Wielaard <mark@klomp.org>
648606
648606
diff --git a/tools/debugedit.c b/tools/debugedit.c
648606
index 8444e03..bf11513 100644
648606
--- a/tools/debugedit.c
648606
+++ b/tools/debugedit.c
648606
@@ -926,27 +926,27 @@
648606
   /* Ensure the CU current directory will exist even if only empty.  Source
648606
      filenames possibly located in its parent directories refer relatively to
648606
      it and the debugger (GDB) cannot safely optimize out the missing
648606
-     CU current dir subdirectories.  */
648606
-  if (comp_dir && list_file_fd != -1)
648606
+     CU current dir subdirectories.  Only do this once in phase one. And
648606
+     only do this for dirs under our build/base_dir.  Don't output the
648606
+     empty string (in case the comp_dir == base_dir).  */
648606
+  if (phase == 0 && base_dir && comp_dir && list_file_fd != -1)
648606
     {
648606
-      char *p;
648606
-      size_t size;
648606
 
648606
-      if (base_dir && has_prefix (comp_dir, base_dir))
648606
-	p = comp_dir + strlen (base_dir);
648606
-      else if (dest_dir && has_prefix (comp_dir, dest_dir))
648606
-	p = comp_dir + strlen (dest_dir);
648606
-      else
648606
-	p = comp_dir;
648606
-
648606
-      size = strlen (p) + 1;
648606
-      while (size > 0)
648606
+      if (has_prefix (comp_dir, base_dir))
648606
 	{
648606
-	  ssize_t ret = write (list_file_fd, p, size);
648606
-	  if (ret == -1)
648606
-	    break;
648606
-	  size -= ret;
648606
-	  p += ret;
648606
+	  char *p = comp_dir + strlen (base_dir);
648606
+	  if (p[0] != '\0')
648606
+	    {
648606
+	      size_t size = strlen (p) + 1;
648606
+	      while (size > 0)
648606
+		{
648606
+		  ssize_t ret = write (list_file_fd, p, size);
648606
+		  if (ret == -1)
648606
+		    break;
648606
+		  size -= ret;
648606
+		  p += ret;
648606
+		}
648606
+	    }
648606
 	}
648606
     }
648606