public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
* [PATCH]  elf: Add tst-ldconfig-ld_so_conf-update test
@ 2019-12-04  9:56 Alexandra Hájková
  2019-12-05 17:31 ` Arjun Shankar
  0 siblings, 1 reply; 9+ messages in thread
From: Alexandra Hájková @ 2019-12-04  9:56 UTC (permalink / raw)
  To: libc-alpha; +Cc: Alexandra Hájková

From: Alexandra Hájková <ahajkova@redhat.com>

 Test ldconfig after /etc/ld.so.conf update and verify a running process
 observes changes to /etc/ld.so.cache.
 The test uses the test-in-container framework.
---
 elf/Makefile                                  |  11 +-
 elf/tst-ldconfig-ld-mod.c                     |   8 +
 elf/tst-ldconfig-ld_so_conf-update.c          | 143 ++++++++++++++++++
 .../postclean.req                             |   0
 .../tst-ldconfig-ld_so_conf-update.script     |   1 +
 5 files changed, 160 insertions(+), 3 deletions(-)
 create mode 100644 elf/tst-ldconfig-ld-mod.c
 create mode 100644 elf/tst-ldconfig-ld_so_conf-update.c
 create mode 100644 elf/tst-ldconfig-ld_so_conf-update.root/postclean.req
 create mode 100644 elf/tst-ldconfig-ld_so_conf-update.root/tst-ldconfig-ld_so_conf-update.script

diff --git a/elf/Makefile b/elf/Makefile
index b2b3be203f..5a8d60c6a8 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -162,8 +162,9 @@ tests-static-internal := tst-tls1-static tst-tls2-static \
 CRT-tst-tls1-static-non-pie := $(csu-objpfx)crt1.o
 tst-tls1-static-non-pie-no-pie = yes
 
-tests-container = \
-			  tst-ldconfig-bad-aux-cache
+tests-container := \
+			  tst-ldconfig-bad-aux-cache \
+			  tst-ldconfig-ld_so_conf-update
 
 tests := tst-tls9 tst-leaks1 \
 	tst-array1 tst-array2 tst-array3 tst-array4 tst-array5 \
@@ -292,7 +293,8 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
 		tst-auditmanymod4 tst-auditmanymod5 tst-auditmanymod6 \
 		tst-auditmanymod7 tst-auditmanymod8 tst-auditmanymod9 \
 		tst-initlazyfailmod tst-finilazyfailmod \
-		tst-dlopenfailmod1 tst-dlopenfaillinkmod tst-dlopenfailmod2
+		tst-dlopenfailmod1 tst-dlopenfaillinkmod tst-dlopenfailmod2 \
+		tst-ldconfig-ld-mod
 # Most modules build with _ISOMAC defined, but those filtered out
 # depend on internal headers.
 modules-names-tests = $(filter-out ifuncmod% tst-libc_dlvsym-dso tst-tlsmod%,\
@@ -1627,3 +1629,6 @@ $(objpfx)tst-dlopenfailmod1.so: \
   $(shared-thread-library) $(objpfx)tst-dlopenfaillinkmod.so
 LDFLAGS-tst-dlopenfaillinkmod.so = -Wl,-soname,tst-dlopenfail-missingmod.so
 $(objpfx)tst-dlopenfailmod2.so: $(shared-thread-library)
+
+$(objpfx)tst-ldconfig-ld_so_conf-update.out: $(objpfx)tst-ldconfig-ld-mod.so
+$(objpfx)tst-ldconfig-ld_so_conf-update: $(libdl)
diff --git a/elf/tst-ldconfig-ld-mod.c b/elf/tst-ldconfig-ld-mod.c
new file mode 100644
index 0000000000..acd6609739
--- /dev/null
+++ b/elf/tst-ldconfig-ld-mod.c
@@ -0,0 +1,8 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+void
+bar (void)
+{
+      printf ("Called DSO.\n");
+}
diff --git a/elf/tst-ldconfig-ld_so_conf-update.c b/elf/tst-ldconfig-ld_so_conf-update.c
new file mode 100644
index 0000000000..59de51c494
--- /dev/null
+++ b/elf/tst-ldconfig-ld_so_conf-update.c
@@ -0,0 +1,143 @@
+/* Test ldconfig after /etc/ld.so.conf update and verify a running process
+   observes changes to /etc/ld.so.cache.
+
+   Copyright (C) 2019 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If
+   not, see <https://www.gnu.org/licenses/>.  */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+#include <support/capture_subprocess.h>
+#include <support/check.h>
+#include <support/support.h>
+#include <support/xdlfcn.h>
+#include <support/xstdio.h>
+#include <support/xunistd.h>
+
+#define DSO "libldconfig-ld-mod.so"
+#define DSO_DIR "/tmp/tst-ldconfig"
+#define CONF "/etc/ld.so.conf"
+
+static void
+execv_wrapper (void *args)
+{
+  char **argv = args;
+
+  execv (argv[0], argv);
+  FAIL_EXIT1 ("execv: %m");
+}
+
+int
+open_dso (const char *msg)
+{
+  void *dso;
+  char *err;
+  int ret = 0;
+
+  /* RTLD_NOW - all undefined symbols in the library are resolved
+   * before dlopen() returns. If this cannot be done, an error
+   * is returned.
+   * RTLD_GLOBAL - The symbols defined by this library will be made
+   * available for symbol resolution of subsequently loaded libraries.  */
+  dso = dlopen (DSO, RTLD_NOW | RTLD_GLOBAL);
+  if (dso == NULL)
+    {
+      err = dlerror ();
+      printf ("%s dlerror: %s\n", msg, err);
+      ret = 1;
+    }
+  /* Clear any errors.  */
+  dlerror ();
+
+  return ret;
+}
+
+/* Create a new directory.
+   Copy a test shared object there.
+   Try to dlopen it by soname.  This should fail.
+   (Directory is not searched.)
+   Run ldconfig.
+   Try to dlopen it again.  It should still fail.
+   (Directory is still not searched.)
+   Add the directory to /etc/ld.so.conf.
+   Try to dlopen it again.  It should still fail.
+   (The loader does not read /etc/ld.so.conf, only /etc/ld.so.cache.)
+   Run ldconfig.
+   Try to dlopen it again. This should finally succeed.  */
+static int
+do_test (void)
+{
+  char *prog = xasprintf ("%s/ldconfig", support_install_rootsbindir);
+  char *args[] = { prog, NULL };
+  FILE *fp;
+  struct support_capture_subprocess result;
+
+  /* Create the needed directories. */
+  xmkdirp ("/var/cache/ldconfig", 0777);
+  xmkdirp (DSO_DIR, 0777);
+
+  /* Rename the DSO to start with "lib" because there's an undocumented
+     filter in ldconfig where it ignores any file that doesn't start with
+     "lib" (for regular shared libraries) or "ld-" (for ld-linux-*).  */
+  if (rename ("/usr/lib64/tst-ldconfig-ld-mod.so",
+              "/tmp/tst-ldconfig/libldconfig-ld-mod.so"))
+    FAIL_EXIT1 ("Renaming/moving the DSO failed: %m");
+
+
+  /* Open the DSO. We expect this to fail - test_ldconfig directory
+   * is not searched.  */
+  if (!open_dso ("[Expected] "))
+    FAIL_EXIT1
+      ("We expect dlopen to fail at this point - test dir is not searched.");
+  fp = xfopen (CONF, "a+");
+  if (!fp)
+    FAIL_EXIT1 ("creating /etc/ld.so.conf failed: %m");
+  xfclose (fp);
+
+  /* Run ldconfig.  */
+  result = support_capture_subprocess (execv_wrapper, args);
+  support_capture_subprocess_check (&result, "execv", 0, sc_allow_none);
+
+  /* Try to dlopen the same DSO again, we expect this to fail again.  */
+  if (!open_dso ("[Expected] "))
+    FAIL_EXIT1 ("We expect dlopen to fail at this point!.");
+
+  /* Add test_ldconfig directory to /etc/ld.so.conf.  */
+  fp = xfopen (CONF, "w");
+  if (!(fwrite (DSO_DIR, 1, sizeof (DSO_DIR), fp)))
+    FAIL_EXIT1 ("updating /etc/ld.so.conf failed: %m");
+  xfclose (fp);
+
+  /* Try to dlopen the same DSO again, we expect this to still fail.  */
+  if (!open_dso ("[Expected] "))
+    FAIL_EXIT1 ("We expect dlopen to fail at this point!.");
+
+  /* Run ldconfig again.  */
+  result = support_capture_subprocess (execv_wrapper, args);
+  support_capture_subprocess_check (&result, "execv", 0, sc_allow_none);
+  support_capture_subprocess_free (&result);
+
+  if (open_dso ("[Unexpected] "))
+    FAIL_EXIT1 ("Dlopen failed.");
+
+  free (prog);
+  return 0;
+}
+
+#include <support/test-driver.c>
diff --git a/elf/tst-ldconfig-ld_so_conf-update.root/postclean.req b/elf/tst-ldconfig-ld_so_conf-update.root/postclean.req
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/elf/tst-ldconfig-ld_so_conf-update.root/tst-ldconfig-ld_so_conf-update.script b/elf/tst-ldconfig-ld_so_conf-update.root/tst-ldconfig-ld_so_conf-update.script
new file mode 100644
index 0000000000..be562ba554
--- /dev/null
+++ b/elf/tst-ldconfig-ld_so_conf-update.root/tst-ldconfig-ld_so_conf-update.script
@@ -0,0 +1 @@
+cp $B/elf/tst-ldconfig-ld-mod.so $L/tst-ldconfig-ld-mod.so
-- 
2.20.1

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH]  elf: Add tst-ldconfig-ld_so_conf-update test
  2019-12-04  9:56 [PATCH] elf: Add tst-ldconfig-ld_so_conf-update test Alexandra Hájková
@ 2019-12-05 17:31 ` Arjun Shankar
  2019-12-16 14:34   ` [PATCH v2] " Alexandra Hájková
  0 siblings, 1 reply; 9+ messages in thread
From: Arjun Shankar @ 2019-12-05 17:31 UTC (permalink / raw)
  To: Alexandra Hajkova; +Cc: libc-alpha, Alexandra Hajkova

Hi Alexandra,

The patch looks good to me, overall.

I only have questions and nitpicks, which are as follows:

>  Test ldconfig after /etc/ld.so.conf update and verify a running process
>  observes changes to /etc/ld.so.cache.

Does this test for a bug that was reported and fixed at some point? If yes, is
there a bug number that can be included?

Also, looks like the intention of the test is to verify running processes'
obseration of cache changes, and not ldconfig itself. Am I right?

> diff --git a/elf/Makefile b/elf/Makefile
> index b2b3be203f..5a8d60c6a8 100644
> --- a/elf/Makefile
> +++ b/elf/Makefile
> @@ -162,8 +162,9 @@ tests-static-internal := tst-tls1-static tst-tls2-static \
>  CRT-tst-tls1-static-non-pie := $(csu-objpfx)crt1.o
>  tst-tls1-static-non-pie-no-pie = yes
>  
> -tests-container = \
> -			  tst-ldconfig-bad-aux-cache
> +tests-container := \
> +			  tst-ldconfig-bad-aux-cache \
> +			  tst-ldconfig-ld_so_conf-update
>  
>  tests := tst-tls9 tst-leaks1 \
>  	tst-array1 tst-array2 tst-array3 tst-array4 tst-array5 \
> @@ -292,7 +293,8 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
>  		tst-auditmanymod4 tst-auditmanymod5 tst-auditmanymod6 \
>  		tst-auditmanymod7 tst-auditmanymod8 tst-auditmanymod9 \
>  		tst-initlazyfailmod tst-finilazyfailmod \
> -		tst-dlopenfailmod1 tst-dlopenfaillinkmod tst-dlopenfailmod2
> +		tst-dlopenfailmod1 tst-dlopenfaillinkmod tst-dlopenfailmod2 \
> +		tst-ldconfig-ld-mod
>  # Most modules build with _ISOMAC defined, but those filtered out
>  # depend on internal headers.
>  modules-names-tests = $(filter-out ifuncmod% tst-libc_dlvsym-dso tst-tlsmod%,\
> @@ -1627,3 +1629,6 @@ $(objpfx)tst-dlopenfailmod1.so: \
>    $(shared-thread-library) $(objpfx)tst-dlopenfaillinkmod.so
>  LDFLAGS-tst-dlopenfaillinkmod.so = -Wl,-soname,tst-dlopenfail-missingmod.so
>  $(objpfx)tst-dlopenfailmod2.so: $(shared-thread-library)
> +
> +$(objpfx)tst-ldconfig-ld_so_conf-update.out: $(objpfx)tst-ldconfig-ld-mod.so
> +$(objpfx)tst-ldconfig-ld_so_conf-update: $(libdl)

Looks okay.

> diff --git a/elf/tst-ldconfig-ld-mod.c b/elf/tst-ldconfig-ld-mod.c
> new file mode 100644
> index 0000000000..acd6609739
> --- /dev/null
> +++ b/elf/tst-ldconfig-ld-mod.c
> @@ -0,0 +1,8 @@
> +#include <stdio.h>
> +#include <stdlib.h>
> +
> +void
> +bar (void)
> +{
> +      printf ("Called DSO.\n");
> +}

Looks okay minus glibc's two space indent.

> diff --git a/elf/tst-ldconfig-ld_so_conf-update.c b/elf/tst-ldconfig-ld_so_conf-update.c
> new file mode 100644
> index 0000000000..59de51c494
> --- /dev/null
> +++ b/elf/tst-ldconfig-ld_so_conf-update.c
> @@ -0,0 +1,143 @@
> +/* Test ldconfig after /etc/ld.so.conf update and verify a running process
> +   observes changes to /etc/ld.so.cache.
> +
> +   Copyright (C) 2019 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public License as
> +   published by the Free Software Foundation; either version 2.1 of the
> +   License, or (at your option) any later version.
> +
> +   The GNU C Library 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
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; see the file COPYING.LIB.  If
> +   not, see <https://www.gnu.org/licenses/>.  */
> +
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <string.h>
> +#include <errno.h>
> +
> +#include <support/capture_subprocess.h>
> +#include <support/check.h>
> +#include <support/support.h>
> +#include <support/xdlfcn.h>
> +#include <support/xstdio.h>
> +#include <support/xunistd.h>
> +
> +#define DSO "libldconfig-ld-mod.so"
> +#define DSO_DIR "/tmp/tst-ldconfig"
> +#define CONF "/etc/ld.so.conf"

Looks okay.

> +static void
> +execv_wrapper (void *args)
> +{
> +  char **argv = args;
> +
> +  execv (argv[0], argv);
> +  FAIL_EXIT1 ("execv: %m");
> +}

Perhaps rename to 'run_ldconfig' and drop the use of args? This function is
only ever called to run ldconfig, and with the same args each time.

> +int
> +open_dso (const char *msg)
> +{
> +  void *dso;
> +  char *err;
> +  int ret = 0;
> +
> +  /* RTLD_NOW - all undefined symbols in the library are resolved
> +   * before dlopen() returns. If this cannot be done, an error
> +   * is returned.
> +   * RTLD_GLOBAL - The symbols defined by this library will be made
> +   * available for symbol resolution of subsequently loaded libraries.  */
> +  dso = dlopen (DSO, RTLD_NOW | RTLD_GLOBAL);
> +  if (dso == NULL)
> +    {
> +      err = dlerror ();
> +      printf ("%s dlerror: %s\n", msg, err);
> +      ret = 1;
> +    }
> +  /* Clear any errors.  */
> +  dlerror ();
> +
> +  return ret;
> +}

Since we aren't using the "expected" error messages in any way except
logging it, and since passing a string is a bit awkward, we could maybe
drop this entire function, and replace calls to it with:

(for expected failures)
TEST_VERIFY_EXIT (dlopen (DSO, RTLD_NOW | RTLD_GLOBAL) == NULL);

or

(for the final successful call)
TEST_VERIFY_EXIT (dlopen (DSO, RTLD_NOW | RTLD_GLOBAL) != NULL);

> +/* Create a new directory.
> +   Copy a test shared object there.
> +   Try to dlopen it by soname.  This should fail.
> +   (Directory is not searched.)
> +   Run ldconfig.
> +   Try to dlopen it again.  It should still fail.
> +   (Directory is still not searched.)
> +   Add the directory to /etc/ld.so.conf.
> +   Try to dlopen it again.  It should still fail.
> +   (The loader does not read /etc/ld.so.conf, only /etc/ld.so.cache.)
> +   Run ldconfig.
> +   Try to dlopen it again. This should finally succeed.  */

Description is clear. There's a missing double space before the last sentence.

> +static int
> +do_test (void)
> +{
> +  char *prog = xasprintf ("%s/ldconfig", support_install_rootsbindir);
> +  char *args[] = { prog, NULL };

Could go into 'run_ldconfig' (i.e. execv_wrapper).

> +  FILE *fp;
> +  struct support_capture_subprocess result;

Could be declared at point of first use.

> +  /* Create the needed directories. */

Missing double space.

> +  xmkdirp ("/var/cache/ldconfig", 0777);
> +  xmkdirp (DSO_DIR, 0777);
> +
> +  /* Rename the DSO to start with "lib" because there's an undocumented
> +     filter in ldconfig where it ignores any file that doesn't start with
> +     "lib" (for regular shared libraries) or "ld-" (for ld-linux-*).  */
> +  if (rename ("/usr/lib64/tst-ldconfig-ld-mod.so",
> +              "/tmp/tst-ldconfig/libldconfig-ld-mod.so"))
> +    FAIL_EXIT1 ("Renaming/moving the DSO failed: %m");

Looks okay.

> +  /* Open the DSO. We expect this to fail - test_ldconfig directory
> +   * is not searched.  */

The directory you used is tst-ldconfig.

> +  if (!open_dso ("[Expected] "))
> +    FAIL_EXIT1
> +      ("We expect dlopen to fail at this point - test dir is not searched.");

Could be replaced with that line I suggested earlier:
TEST_VERIFY_EXIT (dlopen (DSO, RTLD_NOW | RTLD_GLOBAL) == NULL);

> +  fp = xfopen (CONF, "a+");
> +  if (!fp)
> +    FAIL_EXIT1 ("creating /etc/ld.so.conf failed: %m");
> +  xfclose (fp);

Looks okay.

> +  /* Run ldconfig.  */
> +  result = support_capture_subprocess (execv_wrapper, args);
> +  support_capture_subprocess_check (&result, "execv", 0, sc_allow_none);
> +
> +  /* Try to dlopen the same DSO again, we expect this to fail again.  */
> +  if (!open_dso ("[Expected] "))
> +    FAIL_EXIT1 ("We expect dlopen to fail at this point!.");
> +
> +  /* Add test_ldconfig directory to /etc/ld.so.conf.  */
> +  fp = xfopen (CONF, "w");
> +  if (!(fwrite (DSO_DIR, 1, sizeof (DSO_DIR), fp)))
> +    FAIL_EXIT1 ("updating /etc/ld.so.conf failed: %m");
> +  xfclose (fp);
> +
> +  /* Try to dlopen the same DSO again, we expect this to still fail.  */
> +  if (!open_dso ("[Expected] "))
> +    FAIL_EXIT1 ("We expect dlopen to fail at this point!.");
> +
> +  /* Run ldconfig again.  */
> +  result = support_capture_subprocess (execv_wrapper, args);
> +  support_capture_subprocess_check (&result, "execv", 0, sc_allow_none);
> +  support_capture_subprocess_free (&result);
> +
> +  if (open_dso ("[Unexpected] "))
> +    FAIL_EXIT1 ("Dlopen failed.");

Looks okay minus the one reference to test_ldconfig. Of course, it will change a
bit if you go for my dlopen and run_ldconfig suggestions.

Cheers,
Arjun

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH v2]  elf: Add tst-ldconfig-ld_so_conf-update test
  2019-12-05 17:31 ` Arjun Shankar
@ 2019-12-16 14:34   ` Alexandra Hájková
  2020-01-06 18:05     ` Arjun Shankar
  0 siblings, 1 reply; 9+ messages in thread
From: Alexandra Hájková @ 2019-12-16 14:34 UTC (permalink / raw)
  To: libc-alpha; +Cc: Alexandra Hájková

From: Alexandra Hájková <ahajkova@redhat.com>

 Test ldconfig after /etc/ld.so.conf update and verify a running process
 observes changes to /etc/ld.so.cache.
 The test uses the test-in-container framework.
---
 elf/Makefile                                  |  11 +-
 elf/tst-ldconfig-ld-mod.c                     |   8 ++
 elf/tst-ldconfig-ld_so_conf-update.c          | 115 ++++++++++++++++++
 .../postclean.req                             |   0
 .../tst-ldconfig-ld_so_conf-update.script     |   1 +
 5 files changed, 132 insertions(+), 3 deletions(-)
 create mode 100644 elf/tst-ldconfig-ld-mod.c
 create mode 100644 elf/tst-ldconfig-ld_so_conf-update.c
 create mode 100644 elf/tst-ldconfig-ld_so_conf-update.root/postclean.req
 create mode 100644 elf/tst-ldconfig-ld_so_conf-update.root/tst-ldconfig-ld_so_conf-update.script

diff --git a/elf/Makefile b/elf/Makefile
index 72a5aa88b1..a89226f163 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -162,8 +162,9 @@ tests-static-internal := tst-tls1-static tst-tls2-static \
 CRT-tst-tls1-static-non-pie := $(csu-objpfx)crt1.o
 tst-tls1-static-non-pie-no-pie = yes
 
-tests-container = \
-			  tst-ldconfig-bad-aux-cache
+tests-container := \
+			  tst-ldconfig-bad-aux-cache \
+			  tst-ldconfig-ld_so_conf-update
 
 tests := tst-tls9 tst-leaks1 \
 	tst-array1 tst-array2 tst-array3 tst-array4 tst-array5 \
@@ -309,7 +310,8 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
 		tst-auditmanymod4 tst-auditmanymod5 tst-auditmanymod6 \
 		tst-auditmanymod7 tst-auditmanymod8 tst-auditmanymod9 \
 		tst-initlazyfailmod tst-finilazyfailmod \
-		tst-dlopenfailmod1 tst-dlopenfaillinkmod tst-dlopenfailmod2
+		tst-dlopenfailmod1 tst-dlopenfaillinkmod tst-dlopenfailmod2 \
+		tst-ldconfig-ld-mod
 # Most modules build with _ISOMAC defined, but those filtered out
 # depend on internal headers.
 modules-names-tests = $(filter-out ifuncmod% tst-libc_dlvsym-dso tst-tlsmod%,\
@@ -1689,3 +1691,6 @@ $(objpfx)tst-dlopen-nodelete-reloc-mod17.so: \
   $(objpfx)tst-dlopen-nodelete-reloc-mod15.so \
   $(objpfx)tst-dlopen-nodelete-reloc-mod16.so
 LDFLAGS-tst-dlopen-nodelete-reloc-mod17.so = -Wl,--no-as-needed
+
+$(objpfx)tst-ldconfig-ld_so_conf-update.out: $(objpfx)tst-ldconfig-ld-mod.so
+$(objpfx)tst-ldconfig-ld_so_conf-update: $(libdl)
diff --git a/elf/tst-ldconfig-ld-mod.c b/elf/tst-ldconfig-ld-mod.c
new file mode 100644
index 0000000000..f8f658d03b
--- /dev/null
+++ b/elf/tst-ldconfig-ld-mod.c
@@ -0,0 +1,8 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+void
+bar (void)
+{
+  printf ("Called DSO.\n");
+}
diff --git a/elf/tst-ldconfig-ld_so_conf-update.c b/elf/tst-ldconfig-ld_so_conf-update.c
new file mode 100644
index 0000000000..54fae5c829
--- /dev/null
+++ b/elf/tst-ldconfig-ld_so_conf-update.c
@@ -0,0 +1,115 @@
+/* Test ldconfig after /etc/ld.so.conf update and verify that a running process
+   observes changes to /etc/ld.so.cache.
+
+   Copyright (C) 2019 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If
+   not, see <https://www.gnu.org/licenses/>.  */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+#include <support/capture_subprocess.h>
+#include <support/check.h>
+#include <support/support.h>
+#include <support/xdlfcn.h>
+#include <support/xstdio.h>
+#include <support/xunistd.h>
+
+
+#define DSO "libldconfig-ld-mod.so"
+#define DSO_DIR "/tmp/tst-ldconfig"
+#define CONF "/etc/ld.so.conf"
+
+
+static void
+run_ldconfig (void *x __attribute__((unused)))
+{
+  char *prog = xasprintf ("%s/ldconfig", support_install_rootsbindir);
+  char *args[] = { prog, NULL };
+
+  execv (args[0], args);
+  FAIL_EXIT1 ("execv: %m");
+}
+
+
+/* Create a new directory.
+   Copy a test shared object there.
+   Try to dlopen it by soname.  This should fail.
+   (Directory is not searched.)
+   Run ldconfig.
+   Try to dlopen it again.  It should still fail.
+   (Directory is still not searched.)
+   Add the directory to /etc/ld.so.conf.
+   Try to dlopen it again.  It should still fail.
+   (The loader does not read /etc/ld.so.conf, only /etc/ld.so.cache.)
+   Run ldconfig.
+   Try to dlopen it again.  This should finally succeed.  */
+static int
+do_test (void)
+{
+  struct support_capture_subprocess result;
+
+  /* Create the needed directories.  */
+  xmkdirp ("/var/cache/ldconfig", 0777);
+  xmkdirp (DSO_DIR, 0777);
+
+  /* Rename the DSO to start with "lib" because there's an undocumented
+     filter in ldconfig where it ignores any file that doesn't start with
+     "lib" (for regular shared libraries) or "ld-" (for ld-linux-*).  */
+  if (rename ("/usr/lib64/tst-ldconfig-ld-mod.so",
+              "/tmp/tst-ldconfig/libldconfig-ld-mod.so"))
+    FAIL_EXIT1 ("Renaming/moving the DSO failed: %m");
+
+
+  /* Open the DSO.  We expect this to fail - tst-ldconfig directory
+     is not searched.  */
+  TEST_VERIFY_EXIT (dlopen (DSO, RTLD_NOW | RTLD_GLOBAL) == NULL);
+
+  FILE *fp = xfopen (CONF, "a+");
+  if (!fp)
+    FAIL_EXIT1 ("creating /etc/ld.so.conf failed: %m");
+  xfclose (fp);
+
+  /* Run ldconfig.  */
+  result = support_capture_subprocess (run_ldconfig, NULL);
+  support_capture_subprocess_check (&result, "execv", 0, sc_allow_none);
+
+  /* Try to dlopen the same DSO again, we expect this to fail again.  */
+  TEST_VERIFY_EXIT (dlopen (DSO, RTLD_NOW | RTLD_GLOBAL) == NULL);
+
+  /* Add tst-ldconfig directory to /etc/ld.so.conf.  */
+  fp = xfopen (CONF, "w");
+  if (!(fwrite (DSO_DIR, 1, sizeof (DSO_DIR), fp)))
+    FAIL_EXIT1 ("updating /etc/ld.so.conf failed: %m");
+  xfclose (fp);
+
+  /* Try to dlopen the same DSO again, we expect this to still fail.  */
+  TEST_VERIFY_EXIT (dlopen (DSO, RTLD_NOW | RTLD_GLOBAL) == NULL);
+
+  /* Run ldconfig again.  */
+  result = support_capture_subprocess (run_ldconfig, NULL);
+  support_capture_subprocess_check (&result, "execv", 0, sc_allow_none);
+  support_capture_subprocess_free (&result);
+
+  /* Finally, we expect dlopen to pass now.  */
+  TEST_VERIFY_EXIT (dlopen (DSO, RTLD_NOW | RTLD_GLOBAL) != NULL);
+
+  return 0;
+}
+
+#include <support/test-driver.c>
diff --git a/elf/tst-ldconfig-ld_so_conf-update.root/postclean.req b/elf/tst-ldconfig-ld_so_conf-update.root/postclean.req
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/elf/tst-ldconfig-ld_so_conf-update.root/tst-ldconfig-ld_so_conf-update.script b/elf/tst-ldconfig-ld_so_conf-update.root/tst-ldconfig-ld_so_conf-update.script
new file mode 100644
index 0000000000..be562ba554
--- /dev/null
+++ b/elf/tst-ldconfig-ld_so_conf-update.root/tst-ldconfig-ld_so_conf-update.script
@@ -0,0 +1 @@
+cp $B/elf/tst-ldconfig-ld-mod.so $L/tst-ldconfig-ld-mod.so
-- 
2.21.0

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2]  elf: Add tst-ldconfig-ld_so_conf-update test
  2019-12-16 14:34   ` [PATCH v2] " Alexandra Hájková
@ 2020-01-06 18:05     ` Arjun Shankar
  2020-01-06 18:09       ` Adhemerval Zanella
  0 siblings, 1 reply; 9+ messages in thread
From: Arjun Shankar @ 2020-01-06 18:05 UTC (permalink / raw)
  To: Alexandra Hajkova; +Cc: libc-alpha, Alexandra Hajkova

Hi Alexandra,

> diff --git a/elf/Makefile b/elf/Makefile
> index 72a5aa88b1..a89226f163 100644
> --- a/elf/Makefile
> +++ b/elf/Makefile
> @@ -162,8 +162,9 @@ tests-static-internal := tst-tls1-static tst-tls2-static \
>  CRT-tst-tls1-static-non-pie := $(csu-objpfx)crt1.o
>  tst-tls1-static-non-pie-no-pie = yes
>  
> -tests-container = \
> -			  tst-ldconfig-bad-aux-cache
> +tests-container := \
> +			  tst-ldconfig-bad-aux-cache \
> +			  tst-ldconfig-ld_so_conf-update
>  
>  tests := tst-tls9 tst-leaks1 \
>  	tst-array1 tst-array2 tst-array3 tst-array4 tst-array5 \
> @@ -309,7 +310,8 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
>  		tst-auditmanymod4 tst-auditmanymod5 tst-auditmanymod6 \
>  		tst-auditmanymod7 tst-auditmanymod8 tst-auditmanymod9 \
>  		tst-initlazyfailmod tst-finilazyfailmod \
> -		tst-dlopenfailmod1 tst-dlopenfaillinkmod tst-dlopenfailmod2
> +		tst-dlopenfailmod1 tst-dlopenfaillinkmod tst-dlopenfailmod2 \
> +		tst-ldconfig-ld-mod
>  # Most modules build with _ISOMAC defined, but those filtered out
>  # depend on internal headers.
>  modules-names-tests = $(filter-out ifuncmod% tst-libc_dlvsym-dso tst-tlsmod%,\
> @@ -1689,3 +1691,6 @@ $(objpfx)tst-dlopen-nodelete-reloc-mod17.so: \
>    $(objpfx)tst-dlopen-nodelete-reloc-mod15.so \
>    $(objpfx)tst-dlopen-nodelete-reloc-mod16.so
>  LDFLAGS-tst-dlopen-nodelete-reloc-mod17.so = -Wl,--no-as-needed
> +
> +$(objpfx)tst-ldconfig-ld_so_conf-update.out: $(objpfx)tst-ldconfig-ld-mod.so
> +$(objpfx)tst-ldconfig-ld_so_conf-update: $(libdl)

Looks okay.

> diff --git a/elf/tst-ldconfig-ld-mod.c b/elf/tst-ldconfig-ld-mod.c
> new file mode 100644
> index 0000000000..f8f658d03b
> --- /dev/null
> +++ b/elf/tst-ldconfig-ld-mod.c
> @@ -0,0 +1,8 @@
> +#include <stdio.h>
> +#include <stdlib.h>
> +
> +void
> +bar (void)
> +{
> +  printf ("Called DSO.\n");
> +}

Looks okay. I recall v1 had a whitespace issue; it's gone.

> diff --git a/elf/tst-ldconfig-ld_so_conf-update.c b/elf/tst-ldconfig-ld_so_conf-update.c
> new file mode 100644
> index 0000000000..54fae5c829
> --- /dev/null
> +++ b/elf/tst-ldconfig-ld_so_conf-update.c
> @@ -0,0 +1,115 @@
> +/* Test ldconfig after /etc/ld.so.conf update and verify that a running process
> +   observes changes to /etc/ld.so.cache.

Looks okay.

> +   Copyright (C) 2019 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public License as
> +   published by the Free Software Foundation; either version 2.1 of the
> +   License, or (at your option) any later version.
> +
> +   The GNU C Library 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
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; see the file COPYING.LIB.  If
> +   not, see <https://www.gnu.org/licenses/>.  */
> +
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <string.h>
> +#include <errno.h>
> +
> +#include <support/capture_subprocess.h>
> +#include <support/check.h>
> +#include <support/support.h>
> +#include <support/xdlfcn.h>
> +#include <support/xstdio.h>
> +#include <support/xunistd.h>
> +
> +
> +#define DSO "libldconfig-ld-mod.so"
> +#define DSO_DIR "/tmp/tst-ldconfig"
> +#define CONF "/etc/ld.so.conf"

Looks okay. No changes here.

> +static void
> +run_ldconfig (void *x __attribute__((unused)))
> +{
> +  char *prog = xasprintf ("%s/ldconfig", support_install_rootsbindir);
> +  char *args[] = { prog, NULL };
> +
> +  execv (args[0], args);
> +  FAIL_EXIT1 ("execv: %m");
> +}

Function renamed and skipped using arguments. Looks okay.

> +/* Create a new directory.
> +   Copy a test shared object there.
> +   Try to dlopen it by soname.  This should fail.
> +   (Directory is not searched.)
> +   Run ldconfig.
> +   Try to dlopen it again.  It should still fail.
> +   (Directory is still not searched.)
> +   Add the directory to /etc/ld.so.conf.
> +   Try to dlopen it again.  It should still fail.
> +   (The loader does not read /etc/ld.so.conf, only /etc/ld.so.cache.)
> +   Run ldconfig.
> +   Try to dlopen it again.  This should finally succeed.  */

Looks okay.

> +static int
> +do_test (void)
> +{
> +  struct support_capture_subprocess result;
> +
> +  /* Create the needed directories.  */
> +  xmkdirp ("/var/cache/ldconfig", 0777);
> +  xmkdirp (DSO_DIR, 0777);
> +
> +  /* Rename the DSO to start with "lib" because there's an undocumented
> +     filter in ldconfig where it ignores any file that doesn't start with
> +     "lib" (for regular shared libraries) or "ld-" (for ld-linux-*).  */
> +  if (rename ("/usr/lib64/tst-ldconfig-ld-mod.so",
> +              "/tmp/tst-ldconfig/libldconfig-ld-mod.so"))
> +    FAIL_EXIT1 ("Renaming/moving the DSO failed: %m");
> +
> +
> +  /* Open the DSO.  We expect this to fail - tst-ldconfig directory
> +     is not searched.  */
> +  TEST_VERIFY_EXIT (dlopen (DSO, RTLD_NOW | RTLD_GLOBAL) == NULL);

You dropped the open_dso function in favour of TEST_VERIFY_EXIT. Looks okay.

> +  FILE *fp = xfopen (CONF, "a+");
> +  if (!fp)
> +    FAIL_EXIT1 ("creating /etc/ld.so.conf failed: %m");
> +  xfclose (fp);
> +
> +  /* Run ldconfig.  */
> +  result = support_capture_subprocess (run_ldconfig, NULL);
> +  support_capture_subprocess_check (&result, "execv", 0, sc_allow_none);
> +
> +  /* Try to dlopen the same DSO again, we expect this to fail again.  */
> +  TEST_VERIFY_EXIT (dlopen (DSO, RTLD_NOW | RTLD_GLOBAL) == NULL);
> +
> +  /* Add tst-ldconfig directory to /etc/ld.so.conf.  */
> +  fp = xfopen (CONF, "w");
> +  if (!(fwrite (DSO_DIR, 1, sizeof (DSO_DIR), fp)))
> +    FAIL_EXIT1 ("updating /etc/ld.so.conf failed: %m");
> +  xfclose (fp);
> +
> +  /* Try to dlopen the same DSO again, we expect this to still fail.  */
> +  TEST_VERIFY_EXIT (dlopen (DSO, RTLD_NOW | RTLD_GLOBAL) == NULL);
> +
> +  /* Run ldconfig again.  */
> +  result = support_capture_subprocess (run_ldconfig, NULL);
> +  support_capture_subprocess_check (&result, "execv", 0, sc_allow_none);
> +  support_capture_subprocess_free (&result);
> +
> +  /* Finally, we expect dlopen to pass now.  */
> +  TEST_VERIFY_EXIT (dlopen (DSO, RTLD_NOW | RTLD_GLOBAL) != NULL);
> +
> +  return 0;
> +}

Changes since v1 correspond to renaming function to run_ldconfig, and dropping
open_dso. Looks okay.

> +#include <support/test-driver.c>
> diff --git a/elf/tst-ldconfig-ld_so_conf-update.root/postclean.req b/elf/tst-ldconfig-ld_so_conf-update.root/postclean.req
> new file mode 100644
> index 0000000000..e69de29bb2
> diff --git a/elf/tst-ldconfig-ld_so_conf-update.root/tst-ldconfig-ld_so_conf-update.script b/elf/tst-ldconfig-ld_so_conf-update.root/tst-ldconfig-ld_so_conf-update.script
> new file mode 100644
> index 0000000000..be562ba554
> --- /dev/null
> +++ b/elf/tst-ldconfig-ld_so_conf-update.root/tst-ldconfig-ld_so_conf-update.script
> @@ -0,0 +1 @@
> +cp $B/elf/tst-ldconfig-ld-mod.so $L/tst-ldconfig-ld-mod.so

I applied the patch and ran the test. It ran and passed.

This version looks good to me and I'd say it's good enough for master.

Cheers,
Arjun

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2] elf: Add tst-ldconfig-ld_so_conf-update test
  2020-01-06 18:05     ` Arjun Shankar
@ 2020-01-06 18:09       ` Adhemerval Zanella
  2020-01-07  4:20         ` Siddhesh Poyarekar
  0 siblings, 1 reply; 9+ messages in thread
From: Adhemerval Zanella @ 2020-01-06 18:09 UTC (permalink / raw)
  To: libc-alpha



On 06/01/2020 15:05, Arjun Shankar wrote:
> +   Copyright (C) 2019 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.

It needs to update the copyright year to 2020

> 
> This version looks good to me and I'd say it's good enough for master.

And to not add any confusion, only once 2.32 master open or if
release manager (Siddhesh) agrees. 

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2] elf: Add tst-ldconfig-ld_so_conf-update test
  2020-01-06 18:09       ` Adhemerval Zanella
@ 2020-01-07  4:20         ` Siddhesh Poyarekar
  2020-01-10 14:45           ` Stefan Liebler
  0 siblings, 1 reply; 9+ messages in thread
From: Siddhesh Poyarekar @ 2020-01-07  4:20 UTC (permalink / raw)
  To: Adhemerval Zanella, libc-alpha

On 06/01/20 11:39 pm, Adhemerval Zanella wrote:
> 
> 
> On 06/01/2020 15:05, Arjun Shankar wrote:
>> +   Copyright (C) 2019 Free Software Foundation, Inc.
>> +   This file is part of the GNU C Library.
> 
> It needs to update the copyright year to 2020
> 
>>
>> This version looks good to me and I'd say it's good enough for master.
> 
> And to not add any confusion, only once 2.32 master open or if
> release manager (Siddhesh) agrees. 
> 

This is OK for master.

Thanks,
Siddhesh

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2] elf: Add tst-ldconfig-ld_so_conf-update test
  2020-01-07  4:20         ` Siddhesh Poyarekar
@ 2020-01-10 14:45           ` Stefan Liebler
  2020-01-10 16:00             ` Siddhesh Poyarekar
  0 siblings, 1 reply; 9+ messages in thread
From: Stefan Liebler @ 2020-01-10 14:45 UTC (permalink / raw)
  To: libc-alpha

[-- Attachment #1: Type: text/plain, Size: 831 bytes --]

On 1/7/20 5:20 AM, Siddhesh Poyarekar wrote:
> On 06/01/20 11:39 pm, Adhemerval Zanella wrote:
>>
>>
>> On 06/01/2020 15:05, Arjun Shankar wrote:
>>> +   Copyright (C) 2019 Free Software Foundation, Inc.
>>> +   This file is part of the GNU C Library.
>>
>> It needs to update the copyright year to 2020
>>
>>>
>>> This version looks good to me and I'd say it's good enough for master.
>>
>> And to not add any confusion, only once 2.32 master open or if
>> release manager (Siddhesh) agrees.
>>
> 
> This is OK for master.
> 
> Thanks,
> Siddhesh
> 

Hi,

If run on 32bit, this test fails while renaming tst-ldconfig-ld-mod.so 
as there is no /usr/lib64 directory.

The attached patch is constructing the file name with help of 
support_libdir_prefix.

If the patch is okay, let me know if I can commit it on master.

Bye,
Stefan

[-- Attachment #2: 20200110_tst-ldconfig-ld_so_conf-update.patch --]
[-- Type: text/x-patch, Size: 1390 bytes --]

commit 7feda514bc62870cd3ac3413a2aebb810b346d02
Author: Stefan Liebler <stli@linux.ibm.com>
Date:   Fri Jan 10 15:36:52 2020 +0100

    Fix "elf: Add tst-ldconfig-ld_so_conf-update test" on 32bit.
    
    This new test was introduced with recent commit
    591236f1a33f11cc65ccf009d997071ba853e186.
    If run on 32bit, it fails while renaming tst-ldconfig-ld-mod.so as there is no
    /usr/lib64 directory. This patch is constructing the file name with help of
    support_libdir_prefix.

diff --git a/elf/tst-ldconfig-ld_so_conf-update.c b/elf/tst-ldconfig-ld_so_conf-update.c
index 54fae5c829..ff2ee217d9 100644
--- a/elf/tst-ldconfig-ld_so_conf-update.c
+++ b/elf/tst-ldconfig-ld_so_conf-update.c
@@ -71,9 +71,11 @@ do_test (void)
   /* Rename the DSO to start with "lib" because there's an undocumented
      filter in ldconfig where it ignores any file that doesn't start with
      "lib" (for regular shared libraries) or "ld-" (for ld-linux-*).  */
-  if (rename ("/usr/lib64/tst-ldconfig-ld-mod.so",
-              "/tmp/tst-ldconfig/libldconfig-ld-mod.so"))
+  char *mod_src_path = xasprintf ("%s/tst-ldconfig-ld-mod.so",
+				  support_libdir_prefix);
+  if (rename (mod_src_path, "/tmp/tst-ldconfig/libldconfig-ld-mod.so"))
     FAIL_EXIT1 ("Renaming/moving the DSO failed: %m");
+  free (mod_src_path);
 
 
   /* Open the DSO.  We expect this to fail - tst-ldconfig directory

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2] elf: Add tst-ldconfig-ld_so_conf-update test
  2020-01-10 14:45           ` Stefan Liebler
@ 2020-01-10 16:00             ` Siddhesh Poyarekar
  2020-01-13 10:09               ` Stefan Liebler
  0 siblings, 1 reply; 9+ messages in thread
From: Siddhesh Poyarekar @ 2020-01-10 16:00 UTC (permalink / raw)
  To: Stefan Liebler, libc-alpha

On 10/01/20 8:15 pm, Stefan Liebler wrote:
> Hi,
> 
> If run on 32bit, this test fails while renaming tst-ldconfig-ld-mod.so
> as there is no /usr/lib64 directory.
> 
> The attached patch is constructing the file name with help of
> support_libdir_prefix.
> 
> If the patch is okay, let me know if I can commit it on master.

Nice catch, looks OK to me.

Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2] elf: Add tst-ldconfig-ld_so_conf-update test
  2020-01-10 16:00             ` Siddhesh Poyarekar
@ 2020-01-13 10:09               ` Stefan Liebler
  0 siblings, 0 replies; 9+ messages in thread
From: Stefan Liebler @ 2020-01-13 10:09 UTC (permalink / raw)
  To: Siddhesh Poyarekar, libc-alpha

On 1/10/20 5:00 PM, Siddhesh Poyarekar wrote:
> On 10/01/20 8:15 pm, Stefan Liebler wrote:
>> Hi,
>>
>> If run on 32bit, this test fails while renaming tst-ldconfig-ld-mod.so
>> as there is no /usr/lib64 directory.
>>
>> The attached patch is constructing the file name with help of
>> support_libdir_prefix.
>>
>> If the patch is okay, let me know if I can commit it on master.
> 
> Nice catch, looks OK to me.
> 
> Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
> 
Committed.

Thanks,
Stefan

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2020-01-13 10:09 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-12-04  9:56 [PATCH] elf: Add tst-ldconfig-ld_so_conf-update test Alexandra Hájková
2019-12-05 17:31 ` Arjun Shankar
2019-12-16 14:34   ` [PATCH v2] " Alexandra Hájková
2020-01-06 18:05     ` Arjun Shankar
2020-01-06 18:09       ` Adhemerval Zanella
2020-01-07  4:20         ` Siddhesh Poyarekar
2020-01-10 14:45           ` Stefan Liebler
2020-01-10 16:00             ` Siddhesh Poyarekar
2020-01-13 10:09               ` Stefan Liebler

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).