Hi - The following patch for PR34309 makes trybots happy.
>From cc48c9150681d91235a623e0c8fc41d7340eb25a Mon Sep 17 00:00:00 2001 From: "Frank Ch. Eigler" <[email protected]> Date: Wed, 24 Jun 2026 14:31:17 -0400 Subject: [PATCH] PR34309: debuginfod: support relative source paths for reproducible builds From: Frank Ch. Eigler <[email protected]> Relaxed constraint checks in debuginfod-client and debuginfod-find to allow relative source filenames (e.g. those starting with '.' or normal filenames), supporting binaries built with options like -fdebug-prefix-map as one way to produce reproducible builds. Note that such paths will not generally be resolvable by debuginfod within packages, nor if debuginfod's startup PWD is different from the build tree. This is a niche function only. Added tests/testfile-debug-map{.c,.bz2} compiled with -fdebug-prefix-map and tests/run-debuginfod-debug-map.sh to verify. Signed-off-By: Frank Ch. Eigler <[email protected]> Signed-off-by: Frank Ch. Eigler <[email protected]> --- debuginfod/debuginfod-client.c | 6 ++- debuginfod/debuginfod-find.c | 4 +- tests/Makefile.am | 6 ++- tests/run-debuginfod-debug-map.sh | 69 ++++++++++++++++++++++++++++++ tests/testfile-debug-map.bz2 | Bin 0 -> 2645 bytes tests/testfile-debug-map.c | 1 + 6 files changed, 81 insertions(+), 5 deletions(-) create mode 100755 tests/run-debuginfod-debug-map.sh create mode 100755 tests/testfile-debug-map.bz2 create mode 100644 tests/testfile-debug-map.c diff --git a/debuginfod/debuginfod-client.c b/debuginfod/debuginfod-client.c index 04c4a0eb509b..d9915719a271 100644 --- a/debuginfod/debuginfod-client.c +++ b/debuginfod/debuginfod-client.c @@ -1923,7 +1923,7 @@ debuginfod_query_server_by_buildid (debuginfod_client *c, { if (vfd >= 0) dprintf (vfd, "checking filename\n"); - if (filename[0] != '/') // must start with / + if (filename[0] == '\0') // must not be empty { rc = -EINVAL; goto out; @@ -2182,7 +2182,9 @@ debuginfod_query_server_by_buildid (debuginfod_client *c, size_t escaped_strlen = 0; if (filename) { - escaped_string = curl_easy_escape(&target_handle, filename+1, 0); + escaped_string = curl_easy_escape(&target_handle, + filename[0] == '/' ? filename+1 : filename, + 0); if (!escaped_string) { rc = -ENOMEM; diff --git a/debuginfod/debuginfod-find.c b/debuginfod/debuginfod-find.c index d96c92af24f2..5d492b269533 100644 --- a/debuginfod/debuginfod-find.c +++ b/debuginfod/debuginfod-find.c @@ -247,9 +247,9 @@ main(int argc, char** argv) &cache_name); else if (strcmp(argv[remaining], "source") == 0) { - if (remaining+2 == argc || argv[remaining+2][0] != '/') + if (remaining+2 >= argc || argv[remaining+2][0] == '\0') { - fprintf(stderr, "If FILETYPE is \"source\" then absolute /FILENAME must be given\n"); + fprintf(stderr, "If FILETYPE is \"source\" then FILENAME must be given\n"); return 1; } rc = debuginfod_find_source(client, diff --git a/tests/Makefile.am b/tests/Makefile.am index 30a7b6cabce9..d3ecd35bbf42 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -299,7 +299,8 @@ TESTS += run-srcfiles-self.sh \ run-debuginfod-client-profile.sh \ run-debuginfod-find-metadata.sh \ run-debuginfod-longsource.sh \ - run-debuginfod-homesite.sh + run-debuginfod-homesite.sh \ + run-debuginfod-debug-map.sh if LZMA TESTS += run-debuginfod-seekable.sh endif @@ -641,6 +642,9 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh run-ar.sh \ run-debuginfod-find-metadata.sh \ run-debuginfod-longsource.sh \ run-debuginfod-homesite.sh \ + run-debuginfod-debug-map.sh \ + testfile-debug-map.bz2 \ + testfile-debug-map.c \ debuginfod-rpms/fedora30/hello2-1.0-2.src.rpm \ debuginfod-rpms/fedora30/hello2-1.0-2.x86_64.rpm \ debuginfod-rpms/fedora30/hello2-debuginfo-1.0-2.x86_64.rpm \ diff --git a/tests/run-debuginfod-debug-map.sh b/tests/run-debuginfod-debug-map.sh new file mode 100755 index 000000000000..046dad419735 --- /dev/null +++ b/tests/run-debuginfod-debug-map.sh @@ -0,0 +1,69 @@ +#!/usr/bin/env bash +# +# Copyright (C) 2026 Red Hat, Inc. +# This file is part of elfutils. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# elfutils is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +. $srcdir/debuginfod-subr.sh + +set -x +unset VALGRIND_CMD + +# set base to a unique multiple of 100 not used in any other 'run-debuginfod-*' test +base=12100 +get_ports + +DB=${PWD}/.debuginfod_tmp.sqlite +tempfiles $DB +export DEBUGINFOD_CACHE_PATH=${PWD}/.client_cache + +# Copy the source file to the current directory so that debuginfod can index it +# since the binary was compiled with -fdebug-prefix-map=$(pwd)=. +# Therefore, DWARF points to the relative path testfile-debug-map.c in the cwd. +cp ${abs_srcdir}/testfile-debug-map.c . +tempfiles testfile-debug-map.c + +# Unpack the test binary +testfiles testfile-debug-map + +# Run debuginfod on current directory (in file/directory mode, scanning .) +env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../debuginfod/debuginfod $VERBOSE -F -p $PORT1 -d $DB -t0 -g0 . > vlog$PORT1 2>&1 & +PID1=$! +tempfiles vlog$PORT1 +errfiles vlog$PORT1 + +wait_ready $PORT1 'ready' 1 +wait_ready $PORT1 'thread_work_total{role="traverse"}' 1 +wait_ready $PORT1 'thread_work_pending{role="scan"}' 0 +wait_ready $PORT1 'thread_busy{role="scan"}' 0 + +# Check that we can find the source file via debuginfod-find using relative pathnames! +# The build ID of testfile-debug-map is 4c1385643bcb37d365c59001932e908171c9f2dd. +# We test with both a relative path name starting with . and a plain relative path name. +export DEBUGINFOD_URLS="http://127.0.0.1:$PORT1/" + +# Test finding with relative path starting with '.' +filename1=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find source 4c1385643bcb37d365c59001932e908171c9f2dd ./testfile-debug-map.c` +cmp $filename1 testfile-debug-map.c + +# Test finding with relative path starting with filename +filename2=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find source 4c1385643bcb37d365c59001932e908171c9f2dd testfile-debug-map.c` +cmp $filename2 testfile-debug-map.c + +kill $PID1 +wait $PID1 +PID1=0 + +exit 0 diff --git a/tests/testfile-debug-map.bz2 b/tests/testfile-debug-map.bz2 new file mode 100755 index 0000000000000000000000000000000000000000..5bd7890ec87278599f169ac162a52394a9515be4 GIT binary patch literal 2645 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 D;tR~9 literal 0 HcmV?d00001 diff --git a/tests/testfile-debug-map.c b/tests/testfile-debug-map.c new file mode 100644 index 000000000000..76e8197013aa --- /dev/null +++ b/tests/testfile-debug-map.c @@ -0,0 +1 @@ +int main() { return 0; } -- 2.54.0
