summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Wielaard <mark@klomp.org>2017-04-21 17:33:26 +0200
committerPanu Matilainen <pmatilai@redhat.com>2018-03-28 13:24:31 +0300
commit5345bd0110a5cf2edbbd3bf5c2d1c7c421ef600d (patch)
treee84b979dcb15592c398324c9d0d8e89dd0473c50
parentff9a099d217fafdbbd68e4a055bc6579556a2c5b (diff)
downloadrpm-5345bd0110a5cf2edbbd3bf5c2d1c7c421ef600d.tar.gz
debugedit: Only output comp_dir under build dir (once).
The fix for rhbz#444310 (commit c1a5eb - Include empty CU current dirs) was a little greedy. It would also include comp_dirs outside the build root. Those are unnecessary and we don't have a good way to store them. Such dirs (e.g. /tmp) would then show up at the root of /usr/src/debug. Fix this by including only comp_dirs under base_dir. Also only output all dirs once (during phase zero) and don't output empty dirs (which was harmless but would produce a warning from cpio). This still includes all empty dirs from the original rhbz#444310 nodir testcase and it is an alternative fix for rhbz#641022 (commit c707ab). Both fixes are necessary in case of an unexpected mode for a directory actually in the build root that we want to include in the source list. Signed-off-by: Mark Wielaard <mark@klomp.org> Backported from commit e795899780337dea751d85db8f381eff3fe75275
-rw-r--r--tools/debugedit.c34
1 files changed, 18 insertions, 16 deletions
diff --git a/tools/debugedit.c b/tools/debugedit.c
index cf89312fa..c19a04b4b 100644
--- a/tools/debugedit.c
+++ b/tools/debugedit.c
@@ -926,27 +926,29 @@ edit_attributes (DSO *dso, unsigned char *ptr, struct abbrev_tag *t, int phase)
/* Ensure the CU current directory will exist even if only empty. Source
filenames possibly located in its parent directories refer relatively to
it and the debugger (GDB) cannot safely optimize out the missing
- CU current dir subdirectories. */
- if (comp_dir && list_file_fd != -1)
+ CU current dir subdirectories. Only do this once in phase one. And
+ only do this for dirs under our build/base_dir. Don't output the
+ empty string (in case the comp_dir == base_dir). */
+ if (phase == 0 && base_dir && comp_dir && list_file_fd != -1)
{
char *p;
size_t size;
- if (base_dir && has_prefix (comp_dir, base_dir))
- p = comp_dir + strlen (base_dir);
- else if (dest_dir && has_prefix (comp_dir, dest_dir))
- p = comp_dir + strlen (dest_dir);
- else
- p = comp_dir;
-
- size = strlen (p) + 1;
- while (size > 0)
+ if (has_prefix (comp_dir, base_dir))
{
- ssize_t ret = write (list_file_fd, p, size);
- if (ret == -1)
- break;
- size -= ret;
- p += ret;
+ char *p = comp_dir + strlen (base_dir);
+ if (p[0] != '\0')
+ {
+ size_t size = strlen (p) + 1;
+ while (size > 0)
+ {
+ ssize_t ret = write (list_file_fd, p, size);
+ if (ret == -1)
+ break;
+ size -= ret;
+ p += ret;
+ }
+ }
}
}