bug-gnulib@gnu.org mirror (unofficial)
 help / color / mirror / Atom feed
From: Bruno Haible <bruno@clisp.org>
To: bug-gnulib@gnu.org
Subject: execle, execve, execvpe tests: Fix test failures under qemu user-mode
Date: Sat, 28 Aug 2021 19:19:36 +0200	[thread overview]
Message-ID: <13664133.EVyyLHbfrO@omega> (raw)

In an environment where qemu (user-mode) is used to execute binaries,
I'm seeing these test failures:

$ cat test-execle.sh.log 
qemu-riscv64: Could not open '/lib/ld-linux-riscv64-lp64d.so.1': No such file or directory
FAIL test-execle.sh (exit status: 1)
$ cat test-execve.sh.log 
qemu-riscv64: Could not open '/lib/ld-linux-riscv64-lp64d.so.1': No such file or directory
FAIL test-execve.sh (exit status: 1)
$ cat test-execvpe.sh.log 
qemu-riscv64: Could not open '/lib/ld-linux-riscv64-lp64d.so.1': No such file or directory
FAIL test-execvpe.sh (exit status: 1)

The cause is that the QEMU_LD_PREFIX environment variable is not passed to the
program to be executed. This patch fixes it.


2021-08-28  Bruno Haible  <bruno@clisp.org>

	execle, execve, execvpe tests: Fix test failures under qemu user-mode.
	* test-execle-main.c: Include <string.h>.
	(get_environ_assignment, create_minimal_env): New functions.
	(main): Call create_minimal_env.
	* test-execve-main.c: Likewise.
	* test-execvpe-main.c: Likewise.

diff --git a/tests/test-execle-main.c b/tests/test-execle-main.c
index 2c085f630..f738293c3 100644
--- a/tests/test-execle-main.c
+++ b/tests/test-execle-main.c
@@ -25,22 +25,53 @@
 SIGNATURE_CHECK (execle, int, (const char *, const char *, ...));
 
 #include <stdio.h>
+#include <string.h>
+
+/* Looks up the NAME=VALUE assignment among the environment variables.
+   Returns it, or NULL if not found.  */
+static const char *
+get_environ_assignment (const char *name)
+{
+  size_t name_len = strlen (name);
+  char **p;
+  for (p = environ; *p != NULL; p++)
+    {
+      const char *assignment = *p;
+      if (strncmp (assignment, name, name_len) == 0
+          && assignment[name_len] == '=')
+        return assignment;
+    }
+  return NULL;
+}
+
+/* Creates a minimal environment.  */
+static void
+create_minimal_env (const char *env[5])
+{
+  const char **p = env;
+  *p++ =
+    #ifdef __CYGWIN__
+    /* The Cygwin DLLs needed by the program are in /bin.  */
+    "PATH=.:/bin";
+    #else
+    "PATH=.";
+    #endif
+  *p = get_environ_assignment ("QEMU_LD_PREFIX");
+  if (*p != NULL)
+    p++;
+  *p = get_environ_assignment ("QEMU_CPU");
+  if (*p != NULL)
+    p++;
+  *p++ = "Hommingberg=Gepardenforelle";
+  *p = NULL;
+}
 
 int
 main ()
 {
   const char *progname = "./test-exec-child";
-  const char *env[3] =
-    {
-      #ifdef __CYGWIN__
-      /* The Cygwin DLLs needed by the program are in /bin.  */
-      "PATH=.:/bin",
-      #else
-      "PATH=.",
-      #endif
-      "Hommingberg=Gepardenforelle",
-      NULL
-    };
+  const char *env[5];
+  create_minimal_env (env);
   execle (progname,
           progname,
           "abc def",
diff --git a/tests/test-execve-main.c b/tests/test-execve-main.c
index 970372da1..6199a7d50 100644
--- a/tests/test-execve-main.c
+++ b/tests/test-execve-main.c
@@ -25,22 +25,51 @@
 SIGNATURE_CHECK (execve, int, (const char *, char * const *, char * const *));
 
 #include <stdio.h>
+#include <string.h>
+
+/* Looks up the NAME=VALUE assignment among the environment variables.
+   Returns it, or NULL if not found.  */
+static const char *
+get_environ_assignment (const char *name)
+{
+  size_t name_len = strlen (name);
+  char **p;
+  for (p = environ; *p != NULL; p++)
+    {
+      const char *assignment = *p;
+      if (strncmp (assignment, name, name_len) == 0
+          && assignment[name_len] == '=')
+        return assignment;
+    }
+  return NULL;
+}
+
+/* Creates a minimal environment.  */
+static void
+create_minimal_env (const char *env[5])
+{
+  const char **p = env;
+  *p++ =
+    #ifdef __CYGWIN__
+    /* The Cygwin DLLs needed by the program are in /bin.  */
+    "PATH=.:/bin";
+    #else
+    "PATH=.";
+    #endif
+  *p = get_environ_assignment ("QEMU_LD_PREFIX");
+  if (*p != NULL)
+    p++;
+  *p = get_environ_assignment ("QEMU_CPU");
+  if (*p != NULL)
+    p++;
+  *p++ = "Hommingberg=Gepardenforelle";
+  *p = NULL;
+}
 
 int
 main ()
 {
   const char *progname = "./test-exec-child";
-  const char *env[3] =
-    {
-      #ifdef __CYGWIN__
-      /* The Cygwin DLLs needed by the program are in /bin.  */
-      "PATH=.:/bin",
-      #else
-      "PATH=.",
-      #endif
-      "Hommingberg=Gepardenforelle",
-      NULL
-    };
   const char *argv[12] =
     {
       progname,
@@ -56,6 +85,8 @@ main ()
       "",
       NULL
     };
+  const char *env[5];
+  create_minimal_env (env);
   execve (progname, (char * const *) argv, (char * const *) env);
 
   perror ("execve");
diff --git a/tests/test-execvpe-main.c b/tests/test-execvpe-main.c
index 560ae8e69..c7aa0a3a2 100644
--- a/tests/test-execvpe-main.c
+++ b/tests/test-execvpe-main.c
@@ -25,22 +25,51 @@
 SIGNATURE_CHECK (execvpe, int, (const char *, char * const *, char * const *));
 
 #include <stdio.h>
+#include <string.h>
+
+/* Looks up the NAME=VALUE assignment among the environment variables.
+   Returns it, or NULL if not found.  */
+static const char *
+get_environ_assignment (const char *name)
+{
+  size_t name_len = strlen (name);
+  char **p;
+  for (p = environ; *p != NULL; p++)
+    {
+      const char *assignment = *p;
+      if (strncmp (assignment, name, name_len) == 0
+          && assignment[name_len] == '=')
+        return assignment;
+    }
+  return NULL;
+}
+
+/* Creates a minimal environment.  */
+static void
+create_minimal_env (const char *env[5])
+{
+  const char **p = env;
+  *p++ =
+    #ifdef __CYGWIN__
+    /* The Cygwin DLLs needed by the program are in /bin.  */
+    "PATH=.:/bin";
+    #else
+    "PATH=.";
+    #endif
+  *p = get_environ_assignment ("QEMU_LD_PREFIX");
+  if (*p != NULL)
+    p++;
+  *p = get_environ_assignment ("QEMU_CPU");
+  if (*p != NULL)
+    p++;
+  *p++ = "Hommingberg=Gepardenforelle";
+  *p = NULL;
+}
 
 int
 main ()
 {
   const char *progname = "test-exec-child";
-  const char *env[3] =
-    {
-      #ifdef __CYGWIN__
-      /* The Cygwin DLLs needed by the program are in /bin.  */
-      "PATH=.:/bin",
-      #else
-      "PATH=.",
-      #endif
-      "Hommingberg=Gepardenforelle",
-      NULL
-    };
   const char *argv[12] =
     {
       progname,
@@ -56,6 +85,8 @@ main ()
       "",
       NULL
     };
+  const char *env[5];
+  create_minimal_env (env);
   execvpe (progname, (char * const *) argv, (char * const *) env);
 
   perror ("execvpe");





                 reply	other threads:[~2021-08-28 17:19 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://lists.gnu.org/mailman/listinfo/bug-gnulib

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=13664133.EVyyLHbfrO@omega \
    --to=bruno@clisp.org \
    --cc=bug-gnulib@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).