PATCH: PR27783: debuginfod: fetch default DEBUGINFOD_URLS from systemwide file

Frank Ch. Eigler fche@redhat.com
Thu Apr 29 16:13:48 GMT 2021


Hi -

This change was suggested by fedora fesco folks, to make it easier for
for auxiliary system daemons to use debuginfod by default.


commit 4db2eba32aaed7d567f5ebea6b2eb7a6dc4b4b36
Author: Frank Ch. Eigler <fche@redhat.com>
Date:   Thu Apr 29 11:49:14 2021 -0400

    PR27783 debuginfod: fetch default DEBUGINFOD_URLS from systemwide file
    
    Introduce use of a systemwide config file /etc/debuginfod_urls for a
    fallback default for an unset $DEBUGINFOD_URLS.  $DEBUGINFOD_URLS_FILE
    overrides the default location of that file, which is probably mainly
    useful for testing.  Deprecate the similar /etc/profile.d/debuginfod*
    mechanism that affected only login shells.
    
    OTOH, setting ANY of the following to be an empty string will disable
    debuginfod-client capability:
    - env var $DEBUGINFOD_URLS
    - env var $DEBUGINFOD_URLS_FILE
    - the file named by $DEBUGINFOD_URLS_FILE
    
    Signed-off-by: Frank Ch. Eigler <fche@redhat.com>

diff --git a/ChangeLog b/ChangeLog
index e18746fb9771..4057e19a87ed 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2021-04-29  Frank Ch. Eigler <fche@redhat.com>
+
+	PR27783
+	* configure.ac (enable-debuginfod-urls): Tweak AC_CONFIG_FILE.
+
 2021-03-30  Frank Ch. Eigler  <fche@redhat.com>
 
 	* configure.ac: Look for pthread_setname_np.
diff --git a/NEWS b/NEWS
index 038c6019f572..5f4b0992b629 100644
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,8 @@
 Version 0.184
 
+debuginfod-client: DEBUGINFOD_URLS_FILE (default /etc/debuginfod_urls)
+                   is consulted for DEBUGINFOD_URLS if that is unset.
+
 debuginfod: Use libarchive's bsdtar as the .deb-family file unpacker.
 
 Version 0.183
diff --git a/config/ChangeLog b/config/ChangeLog
index 0e179cbc673b..ab13c4a80586 100644
--- a/config/ChangeLog
+++ b/config/ChangeLog
@@ -1,3 +1,12 @@
+2021-04-29  Frank Ch. Eigler <fche@redhat.com>
+
+	PR27783
+	* profile.*: Drop these.
+	* debuginfod_urls.in: New file.
+	* elfutils.spec.in: Adjust accordingly.
+	* debuginfod.sysconfig: Add blurb to unset upstream links by default.
+	* Makefile.am: dist it.
+
 2021-02-17  Timm Bäder  <tbaeder@redhat.com>
 
 	* eu.am (NO_PACKED_NOT_ALIGNED_WARNING): New variable.
diff --git a/config/Makefile.am b/config/Makefile.am
index a66f54904991..1b6cdcc8fa8b 100644
--- a/config/Makefile.am
+++ b/config/Makefile.am
@@ -30,7 +30,7 @@
 ##
 EXTRA_DIST = elfutils.spec.in known-dwarf.awk 10-default-yama-scope.conf \
 	     libelf.pc.in libdw.pc.in libdebuginfod.pc.in \
-	     debuginfod.service debuginfod.sysconfig profile.sh.in profile.csh.in
+	     debuginfod.service debuginfod.sysconfig debuginfod_urls.in
 
 pkgconfigdir = $(libdir)/pkgconfig
 pkgconfig_DATA = libelf.pc libdw.pc
@@ -38,11 +38,10 @@ if LIBDEBUGINFOD
 pkgconfig_DATA += libdebuginfod.pc
 
 install-data-local:
-	$(INSTALL_DATA) profile.sh -D $(DESTDIR)$(sysconfdir)/profile.d/debuginfod.sh
-	$(INSTALL_DATA) profile.csh -D $(DESTDIR)$(sysconfdir)/profile.d/debuginfod.csh
+	$(INSTALL_DATA) debuginfod_urls -D $(DESTDIR)$(sysconfdir)/debuginfod_urls
 
 uninstall-local:
-	rm -f $(DESTDIR)$(sysconfdir)/profile.d/debuginfod.sh $(DESTDIR)$(sysconfdir)/profile.d/debuginfod.csh
+	rm -f $(DESTDIR)$(sysconfdir)/debuginfod_urls
 endif
 
 if MAINTAINER_MODE
diff --git a/config/debuginfod.sysconfig b/config/debuginfod.sysconfig
index 446038742bae..bb0c84f3d4d5 100644
--- a/config/debuginfod.sysconfig
+++ b/config/debuginfod.sysconfig
@@ -8,7 +8,10 @@ DEBUGINFOD_PATHS="-t43200 -F -R /usr/lib/debug /usr/bin /usr/libexec /usr/sbin /
 # prefer reliability/durability over performance
 #DEBUGINFOD_PRAGMAS="-D 'pragma synchronous=full;'"
 
-# upstream debuginfods
+# set it to empty to avoid accidental recursive reference
+DEBUGINFOD_URLS=""
+DEBUGINFOD_URLS_FILE=""
+# or specify upstream debuginfods
 #DEBUGINFOD_URLS="http://secondhost:8002 http://thirdhost:8002"
 #DEBUGINFOD_TIMEOUT="5"
 #DEBUGINFOD_CACHE_DIR=""
diff --git a/config/debuginfod_urls.in b/config/debuginfod_urls.in
new file mode 100644
index 000000000000..5a5fa815d2e9
--- /dev/null
+++ b/config/debuginfod_urls.in
@@ -0,0 +1 @@
+@DEBUGINFOD_URLS@
diff --git a/config/elfutils.spec.in b/config/elfutils.spec.in
index 9df92b3815e7..ba06480c71c1 100644
--- a/config/elfutils.spec.in
+++ b/config/elfutils.spec.in
@@ -298,7 +298,7 @@ fi
 %{_libdir}/libdebuginfod.so.*
 %{_bindir}/debuginfod-find
 %{_mandir}/man1/debuginfod-find.1*
-%config(noreplace) %{_sysconfdir}/profile.d/*
+%config(noreplace) %{_sysconfdir}/debuginfod_urls
   
 %files debuginfod-client-devel
 %defattr(-,root,root)
diff --git a/config/profile.csh.in b/config/profile.csh.in
deleted file mode 100644
index 0a2d6d162019..000000000000
--- a/config/profile.csh.in
+++ /dev/null
@@ -1,11 +0,0 @@
-if ("@DEBUGINFOD_URLS@" != "") then
-	if ($?DEBUGINFOD_URLS) then
-		if ($%DEBUGINFOD_URLS) then
-			setenv DEBUGINFOD_URLS "$DEBUGINFOD_URLS @DEBUGINFOD_URLS@"
-		else
-			setenv DEBUGINFOD_URLS "@DEBUGINFOD_URLS@"
-		endif
-	else
-		setenv DEBUGINFOD_URLS "@DEBUGINFOD_URLS@"
-	endif
-endif
diff --git a/config/profile.sh.in b/config/profile.sh.in
deleted file mode 100644
index aa228a0dcd16..000000000000
--- a/config/profile.sh.in
+++ /dev/null
@@ -1,4 +0,0 @@
-if [ -n "@DEBUGINFOD_URLS@" ]; then
-	DEBUGINFOD_URLS="${DEBUGINFOD_URLS-}${DEBUGINFOD_URLS:+ }@DEBUGINFOD_URLS@"
-	export DEBUGINFOD_URLS
-fi
diff --git a/configure.ac b/configure.ac
index ad046bc27ac1..1ce280513e73 100644
--- a/configure.ac
+++ b/configure.ac
@@ -781,10 +781,10 @@ AS_IF([test "x$enable_debuginfod" != "xno"], [
 AS_IF([test "x$enable_debuginfod" != "xno"],AC_DEFINE([ENABLE_DEBUGINFOD],[1],[Build debuginfod]))
 AM_CONDITIONAL([DEBUGINFOD],[test "x$enable_debuginfod" = "xyes"])
 
-dnl for /etc/profile.d/elfutils.{csh,sh}
+dnl for /etc/debuginfod_urls
 default_debuginfod_urls=""
 AC_ARG_ENABLE(debuginfod-urls,
-            [AS_HELP_STRING([--enable-debuginfod-urls@<:@=URLS@:>@],[add URLS to profile.d DEBUGINFOD_URLS])],
+            [AS_HELP_STRING([--enable-debuginfod-urls@<:@=URLS@:>@],[set systemwide default DEBUGINFOD_URLS])],
             [if test "x${enableval}" = "xyes";
              then default_debuginfod_urls="https://debuginfod.elfutils.org/";
              elif test "x${enableval}" != "xno"; then
@@ -792,7 +792,7 @@ AC_ARG_ENABLE(debuginfod-urls,
              fi],
             [default_debuginfod_urls=""])
 AC_SUBST(DEBUGINFOD_URLS, $default_debuginfod_urls)                
-AC_CONFIG_FILES([config/profile.sh config/profile.csh])
+AC_CONFIG_FILES([config/debuginfod_urls])
 
 AC_OUTPUT
 
diff --git a/debuginfod/ChangeLog b/debuginfod/ChangeLog
index 3909100903cb..20744497e383 100644
--- a/debuginfod/ChangeLog
+++ b/debuginfod/ChangeLog
@@ -1,3 +1,12 @@
+2021-04-29  Frank Ch. Eigler <fche@redhat.com>
+
+	PR27783
+	* debuginfod-client.c (xstr_readfile, xstr_readline): New helpers.
+	(debuginfod_begin): In absence of $DEBUGINFOD_URLS, read
+	$DEBUGINFOD_URLS_FILE for default urls.
+	* Makefile.am (CFLAGS): Pass $SYSCONFDIR.
+	* debuginfod.h (DEBUGINFOD_URLS_FILE_ENV_VAR): New variable.
+
 2021-04-26  Frank Ch. Eigler <fche@redhat.com>
 
 	PR27571
diff --git a/debuginfod/Makefile.am b/debuginfod/Makefile.am
index 3adb27559c9c..0b61f4b1cb69 100644
--- a/debuginfod/Makefile.am
+++ b/debuginfod/Makefile.am
@@ -80,6 +80,9 @@ noinst_LIBRARIES = libdebuginfod.a
 noinst_LIBRARIES += libdebuginfod_pic.a
 endif
 
+# expand $sysconfdir with embedded $prefix if any
+SYSCONFDIR=$(shell prefix="$(prefix)"; sysconfdir="$(sysconfdir)"; echo $$sysconfdir)
+AM_CFLAGS += -DSYSCONFDIR='"$(SYSCONFDIR)"'
 libdebuginfod_a_SOURCES = debuginfod-client.c
 libdebuginfod_pic_a_SOURCES = debuginfod-client.c
 am_libdebuginfod_pic_a_OBJECTS = $(libdebuginfod_a_SOURCES:.c=.os)
diff --git a/debuginfod/debuginfod-client.c b/debuginfod/debuginfod-client.c
index 374989e26d43..e65aac8b4c1c 100644
--- a/debuginfod/debuginfod-client.c
+++ b/debuginfod/debuginfod-client.c
@@ -1122,6 +1122,53 @@ debuginfod_query_server (debuginfod_client *c,
 
 
 
+/* Read given file into malloc()d buffer, if possible.  Caller to free. */
+static char*
+xstr_readfile (const char *file)
+{
+  char* buf = NULL;
+  struct stat st;
+  int fd = open (file, O_RDONLY);
+  if (fd < 0) goto out;
+  int rc = fstat(fd, &st);
+  if (rc < 0) goto out1;
+  off_t sz = st.st_size;
+  buf = malloc (sz+1);
+  if (buf == NULL) goto out1;
+  off_t i = 0;
+  while (i < sz) /* loop to read the whole thing */
+    {
+      ssize_t s = read(fd, & buf[i], sz-i);
+      if (s <= 0) break;
+      i += s;
+    }
+
+  /* NUL-terminate */
+  buf[i] = '\0';
+  
+ out1:
+  close (fd);
+
+ out:
+  return buf;
+}
+
+
+/* Return the first line of given file, with no \n but a \0.
+   Caller to free(). */
+static char*
+xstr_readline (const char *file)
+{
+  char *f = xstr_readfile (file);
+  if (f == NULL)
+    return f;
+  char *ret = index (f, '\n');
+  if (ret)
+    *ret = '\0';
+  return f;
+}
+
+
 /* See debuginfod.h  */
 debuginfod_client  *
 debuginfod_begin (void)
@@ -1130,7 +1177,8 @@ debuginfod_begin (void)
   size_t size = sizeof (struct debuginfod_client);
   const char* server_urls = NULL;
   client = (debuginfod_client *) calloc (1, size);
-
+  char* default_urls = NULL;
+    
   if (client != NULL)
     {
       if (getenv(DEBUGINFOD_PROGRESS_ENV_VAR))
@@ -1144,6 +1192,21 @@ debuginfod_begin (void)
   /* Count the DEBUGINFOD_URLS and create the long-lived curl handles. */
   client->num_urls = 0;
   server_urls = getenv (DEBUGINFOD_URLS_ENV_VAR);
+  /* Fall back to fetching default from a system file. */
+  if (server_urls == NULL)
+    {
+      const char* server_urls_file = getenv (DEBUGINFOD_URLS_FILE_ENV_VAR);
+      if (server_urls_file == NULL) server_urls_file = SYSCONFDIR "/debuginfod_urls";
+      default_urls = xstr_readline (server_urls_file);
+      if (default_urls != NULL)
+        {
+          server_urls = default_urls;
+          /* Save it to the environment so this file opening dance is
+             not repeated for this process. */
+          setenv ("DEBUGINFOD_URLS", default_urls, 1 /* overwrite */);
+        }
+    }
+  
   if (server_urls != NULL)
     for (int i = 0; server_urls[i] != '\0'; i++)
       if (server_urls[i] != url_delim_char
@@ -1184,7 +1247,8 @@ debuginfod_begin (void)
   free (client);
   client = NULL;
 
- out:  
+ out:
+  free (default_urls); /* ok even if NULL */
   return client;
 }
 
diff --git a/debuginfod/debuginfod.h.in b/debuginfod/debuginfod.h.in
index 559ea9479349..891cdf0da0cc 100644
--- a/debuginfod/debuginfod.h.in
+++ b/debuginfod/debuginfod.h.in
@@ -31,6 +31,7 @@
 
 /* Names of environment variables that control the client logic. */
 #define DEBUGINFOD_URLS_ENV_VAR "DEBUGINFOD_URLS"
+#define DEBUGINFOD_URLS_FILE_ENV_VAR "DEBUGINFOD_URLS_FILE"
 #define DEBUGINFOD_CACHE_PATH_ENV_VAR "DEBUGINFOD_CACHE_PATH"
 #define DEBUGINFOD_TIMEOUT_ENV_VAR "DEBUGINFOD_TIMEOUT"
 #define DEBUGINFOD_PROGRESS_ENV_VAR "DEBUGINFOD_PROGRESS"
diff --git a/doc/ChangeLog b/doc/ChangeLog
index 05fcd23d5465..2703bd7d2d0f 100644
--- a/doc/ChangeLog
+++ b/doc/ChangeLog
@@ -1,3 +1,8 @@
+2021-04-29  Frank Ch. Eigler <fche@redhat.com>
+
+	PR27783
+	* debuginfod*: Document new $DEBUGINFOD_URLS_FILE variable.
+
 2021-04-23  Frank Ch. Eigler <fche@redhat.com>
 
 	PR27701
diff --git a/doc/debuginfod-find.1 b/doc/debuginfod-find.1
index 12d4ec2d32fe..1e14b992ddc6 100644
--- a/doc/debuginfod-find.1
+++ b/doc/debuginfod-find.1
@@ -132,6 +132,12 @@ proxy server could.)
 This environment variable contains a list of URL prefixes for trusted
 debuginfod instances.  Alternate URL prefixes are separated by space.
 
+.TP 21
+.B DEBUGINFOD_URLS_FILE
+If $DEBUGINFOD_URLS is unset, the file named by this environment variable
+is read, and its first line is used as $DEBUGINFOD_URLS.  The default file 
+is under the system configuration directory (usually \fB/etc/debuginfod_urls\fP).
+
 .TP 21
 .B DEBUGINFOD_TIMEOUT
 This environment variable governs the timeout for each debuginfod HTTP
diff --git a/doc/debuginfod.8 b/doc/debuginfod.8
index 1ba42cf65ffa..9408aff0193d 100644
--- a/doc/debuginfod.8
+++ b/doc/debuginfod.8
@@ -416,6 +416,12 @@ debuginfod instances.  Alternate URL prefixes are separated by space.
 Avoid referential loops that cause a server to contact itself, directly
 or indirectly - the results would be hilarious.
 
+.TP 21
+.B DEBUGINFOD_URLS_FILE
+If $DEBUGINFOD_URLS is unset, the file named by this environment variable
+is read, and its first line is used as $DEBUGINFOD_URLS.  The default file 
+is under the system configuration directory (usually \fB/etc/debuginfod_urls\fP).
+
 .TP
 .B DEBUGINFOD_TIMEOUT
 This environment variable governs the timeout for each debuginfod HTTP
diff --git a/doc/debuginfod_find_debuginfo.3 b/doc/debuginfod_find_debuginfo.3
index 5ae44a9834be..2cee2ef1c9d9 100644
--- a/doc/debuginfod_find_debuginfo.3
+++ b/doc/debuginfod_find_debuginfo.3
@@ -248,6 +248,12 @@ proxy server could.)
 This environment variable contains a list of URL prefixes for trusted
 debuginfod instances.  Alternate URL prefixes are separated by space.
 
+.TP 21
+.B DEBUGINFOD_URLS_FILE
+If $DEBUGINFOD_URLS is unset, the file named by this environment variable
+is read, and its first line is used as $DEBUGINFOD_URLS.  The default file 
+is under the system configuration directory (usually \fB/etc/debuginfod_urls\fP).
+
 .TP 21
 .B DEBUGINFOD_TIMEOUT
 This environment variable governs the timeout for each debuginfod HTTP
diff --git a/tests/ChangeLog b/tests/ChangeLog
index 0712417fa6cd..bc2016f40203 100644
--- a/tests/ChangeLog
+++ b/tests/ChangeLog
@@ -1,3 +1,8 @@
+2021-04-29  Frank Ch. Eigler <fche@redhat.com>
+
+	PR27783
+	* run-debuginfod-find.sh: Add a $DEBUGINFOD_URLS_FILE test.
+
 2021-04-26  Frank Ch. Eigler <fche@redhat.com>
 
 	PR27571
diff --git a/tests/run-debuginfod-find.sh b/tests/run-debuginfod-find.sh
index 7ad2a45d3aac..9a217121b7e2 100755
--- a/tests/run-debuginfod-find.sh
+++ b/tests/run-debuginfod-find.sh
@@ -497,9 +497,17 @@ testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID
 # test parallel queries in client
 export DEBUGINFOD_CACHE_PATH=${PWD}/.client_cache3
 mkdir -p $DEBUGINFOD_CACHE_PATH
-export DEBUGINFOD_URLS="BAD http://127.0.0.1:$PORT1 127.0.0.1:$PORT1 http://127.0.0.1:$PORT2 DNE"
 
-testrun ${abs_builddir}/debuginfod_build_id_find -e F/prog2 1
+# test URLs in file
+urlfile=${PWD}/debuginfod_urls
+tempfiles $urlfile
+echo "BAD http://127.0.0.1:$PORT1 127.0.0.1:$PORT1 http://127.0.0.1:$PORT2 DNE" > $urlfile
+
+# NB: instead of this, use a nested env/stuff goo, avoid affecting valgrind itself
+# hiding under testrun() from being affected by these settings.
+#unset DEBUGINFOD_URLS
+#export DEBUGINFOD_URLS_FILE=$urlfile
+testrun env -u DEBUGINFOD_URLS env DEBUGINFOD_URLS_FILE=$urlfile ${abs_builddir}/debuginfod_build_id_find -e F/prog2 1
 
 ########################################################################
 
@@ -615,7 +623,7 @@ local_dir=${PWD}/mocktree/buildid/aaaaaaaaaabbbbbbbbbbccccccccccdddddddddd/sourc
 mkdir -p ${local_dir}
 echo "int main() { return 0; }" > ${local_dir}/main.c
 
-# first test that is doesn't work, when no DEBUGINFOD_URLS is set
+# first test that is doesn't work, when DEBUGINFOD_URLS is empty
 DEBUGINFOD_URLS=""
 testrun ${abs_top_builddir}/debuginfod/debuginfod-find source aaaaaaaaaabbbbbbbbbbccccccccccdddddddddd /my/path/main.c && false || true
 



More information about the Elfutils-devel mailing list