From e6cbf971242e424264711f9ffad57eee7f6d6f67 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Tue, 21 Mar 2017 16:46:37 +0100 Subject: [PATCH] debugedit: Fix off-by-one adding DW_FORM_string replacement slashes. We would put one too many slashes in between the new dest_dir and file name part of the replacement of a DW_FORM_string in the .debug_info. If there was file part then we would overwrite the first character of the name. If there was no file part at all then this would overwrite the zero terminator and cause a crash reading the rest of the data. A crash did happen while building the docker package on fedora s390x. https://bugzilla.redhat.com/show_bug.cgi?id=1434347 The reason neither issue would normally trigger is because if we do detect that the dest_dir is larger than the base_dir we refuse to replace anything. Signed-off-by: Mark Wielaard --- tools/debugedit.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/tools/debugedit.c b/tools/debugedit.c index 0f37316..b618dce 100644 --- a/tools/debugedit.c +++ b/tools/debugedit.c @@ -1507,12 +1507,16 @@ edit_attributes (DSO *dso, unsigned char *ptr, struct abbrev_tag *t, int phase) comp_dir, base_dir, dest_dir); else { - /* Add one or more slashes in between to - fill up all space (replacement must be - of the same length). */ + /* Add zero (if no file part), one or more + slashes in between the new dest_dir and the + file name to fill up all space (replacement + DW_FORM_string must be of the same length). + We don't need to copy the old file name (if + any) or the zero terminator, because those + are already at the end of the string. */ memcpy (ptr, dest_dir, dest_len); memset (ptr + dest_len, '/', - orig_len - new_len + 1); + orig_len - new_len); } } } -- 1.8.3.1