--- rpm-4.4.2/scripts/find-debuginfo.sh.dbgpaths 2005-07-14 16:52:31.000000000 +0100 +++ rpm-4.4.2/scripts/find-debuginfo.sh 2006-09-07 11:27:08.000000000 +0100 @@ -13,6 +13,11 @@ echo -n > $SOURCEFILE +strip_to_debug() +{ + eu-strip --remove-comment -f "$1" "$2" || : +} + # Strip ELF binaries for f in `find $RPM_BUILD_ROOT ! -path "${debugdir}/*.debug" -type f \( -perm -0100 -or -perm -0010 -or -perm -0001 \) -exec file {} \; | \ sed -n -e 's/^\(.*\):[ ]*.*ELF.*, not stripped/\1/p'` @@ -35,16 +40,16 @@ mkdir -p "${debugdn}" if test -w "$f"; then - eu-strip -f "${debugfn}" "$f" || : + strip_to_debug "${debugfn}" "$f" else chmod u+w "$f" - eu-strip -f "${debugfn}" "$f" || : + strip_to_debug "${debugfn}" "$f" chmod u-w "$f" fi done mkdir -p ${RPM_BUILD_ROOT}/usr/src/debug -cat $SOURCEFILE | (cd $RPM_BUILD_DIR; LANG=C sort -z -u | cpio -pd0m ${RPM_BUILD_ROOT}/usr/src/debug) +cat $SOURCEFILE | (cd $RPM_BUILD_DIR; LANG=C sort -z -u | cpio -pd0mL ${RPM_BUILD_ROOT}/usr/src/debug) # stupid cpio creates new directories in mode 0700, fixup find ${RPM_BUILD_ROOT}/usr/src/debug -type d -print0 | xargs -0 chmod a+rx --- rpm-4.4.2/tools/debugedit.c.dbgpaths 2006-09-07 11:21:33.000000000 +0100 +++ rpm-4.4.2/tools/debugedit.c 2006-09-07 11:26:56.000000000 +0100 @@ -1,4 +1,4 @@ -/* Copyright (C) 2001, 2002, 2003 Red Hat, Inc. +/* Copyright (C) 2001, 2002, 2003, 2005 Red Hat, Inc. Written by Alexander Larsson , 2002 Based on code by Jakub Jelinek , 2001. @@ -343,13 +343,11 @@ #define IS_DIR_SEPARATOR(c) ((c)=='/') static char * -canonicalize_path (char *s, char *d) +canonicalize_path (const char *s, char *d) { char *rv = d; - char *sroot, *droot; - - if (d == 0) - rv = d = s; + const char *sroot; + char *droot; if (IS_DIR_SEPARATOR (*s)) { @@ -600,6 +598,7 @@ unsigned char *srcptr, *buf = NULL; size_t base_len = strlen (base_dir); size_t dest_len = strlen (dest_dir); + size_t shrank = 0; if (dest_len == base_len) abs_file_cnt = 0; @@ -611,27 +610,40 @@ } else ptr = srcptr = dir; + unsigned char *srcstart=srcptr; while (*srcptr != 0) { size_t len = strlen (srcptr) + 1; + const unsigned char *readptr = srcptr; if (*srcptr == '/' && has_prefix (srcptr, base_dir)) { - memcpy (ptr, dest_dir, dest_len); if (dest_len < base_len) - { - memmove (ptr + dest_len, srcptr + base_len, - len - base_len); - ptr += dest_len - base_len; ++abs_dir_cnt; + memcpy (ptr, dest_dir, dest_len); + ptr += dest_len; + readptr += base_len; } + srcptr += len; + + shrank += srcptr - readptr; + canonicalize_path (readptr, ptr); + len = strlen (ptr) + 1; + shrank -= len; + ptr += len; + elf_flagdata (debug_sections[DEBUG_STR].elf_data, ELF_C_SET, ELF_F_DIRTY); } - else if (ptr != srcptr) - memmove (ptr, srcptr, len); - srcptr += len; - ptr += len; + + if (shrank > 0) + { + if (--shrank == 0) + error (EXIT_FAILURE, 0, + "canonicalization unexpectedly shrank by one character"); + memset (ptr, 'X', shrank); + ptr += shrank; + *ptr++ = '\0'; } if (abs_dir_cnt + abs_file_cnt != 0)