bug-gnulib@gnu.org mirror (unofficial)
 help / color / mirror / Atom feed
* execute, spawn-pipe: Fix test failures when running under QEMU user-mode
@ 2021-08-30  0:16 Bruno Haible
  0 siblings, 0 replies; only message in thread
From: Bruno Haible @ 2021-08-30  0:16 UTC (permalink / raw)
  To: bug-gnulib

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

In a QEMU user-mode environment (for various CPUs), the test-execute.sh
and test-spawn-pipe.sh tests fail. This happens with qemu 6.1.0, but did not
happen with qemu 4.1.0 and older versions.

The reason is that when qemu is used to execute a program, the file descriptor
3 is open, referencing /dev/urandom.

These two patches work around it.


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

	spawn-pipe: Fix test failure when running under QEMU user-mode.
	* tests/test-spawn-pipe-child.c: Include <stdbool.h>, <string.h>,
	qemu.h.
	(main): Under QEMU user-mode, allow fd 2 or fd 3 to be open.
	* modules/spawn-pipe-tests (Files): Add qemu.h.
	(Depends-on): Add stdbool.

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

	execute: Fix test failure when running under QEMU user-mode.
	* tests/test-execute-child.c: Include <stdbool.h>, qemu.h.
	(main): Under QEMU user-mode, allow fd 3 to be open.
	* modules/execute-tests (Files): Add qemu.h.
	(Depends-on): Add stdbool.


[-- Attachment #2: 0001-execute-Fix-test-failure-when-running-under-QEMU-use.patch --]
[-- Type: text/x-patch, Size: 3104 bytes --]

From 5d5eba1c0c43e4c9638cb857aa7f3c471ae0deba Mon Sep 17 00:00:00 2001
From: Bruno Haible <bruno@clisp.org>
Date: Mon, 30 Aug 2021 02:05:53 +0200
Subject: [PATCH 1/2] execute: Fix test failure when running under QEMU
 user-mode.

* tests/test-execute-child.c: Include <stdbool.h>, qemu.h.
(main): Under QEMU user-mode, allow fd 3 to be open.
* modules/execute-tests (Files): Add qemu.h.
(Depends-on): Add stdbool.
---
 ChangeLog                  |  8 ++++++++
 modules/execute-tests      |  2 ++
 tests/test-execute-child.c | 12 +++++++++++-
 3 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/ChangeLog b/ChangeLog
index 511765e12..76562fea4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2021-08-29  Bruno Haible  <bruno@clisp.org>
+
+	execute: Fix test failure when running under QEMU user-mode.
+	* tests/test-execute-child.c: Include <stdbool.h>, qemu.h.
+	(main): Under QEMU user-mode, allow fd 3 to be open.
+	* modules/execute-tests (Files): Add qemu.h.
+	(Depends-on): Add stdbool.
+
 2021-08-29  Bruno Haible  <bruno@clisp.org>
 
 	posix_spawn_file_actions_addfchdir: Avoid test failure under QEMU.
diff --git a/modules/execute-tests b/modules/execute-tests
index 735f55c94..14d48676c 100644
--- a/modules/execute-tests
+++ b/modules/execute-tests
@@ -6,6 +6,7 @@ tests/test-execute-script.c
 tests/executable-script
 tests/executable-script.sh
 tests/executable-shell-script
+tests/qemu.h
 tests/macros.h
 
 Depends-on:
@@ -14,6 +15,7 @@ fcntl
 mkdir
 msvc-inval
 read-file
+stdbool
 stdint
 unistd
 
diff --git a/tests/test-execute-child.c b/tests/test-execute-child.c
index dbaae1e96..481e50f34 100644
--- a/tests/test-execute-child.c
+++ b/tests/test-execute-child.c
@@ -41,6 +41,7 @@ is_device (int fd)
 /* Now include the other header files.  */
 #include <fcntl.h>
 #include <signal.h>
+#include <stdbool.h>
 #include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -57,6 +58,7 @@ is_device (int fd)
 
 /* In this file, we use only system functions, no overrides from gnulib.  */
 #undef atoi
+#undef close
 #undef fcntl
 #undef fflush
 #undef fgetc
@@ -64,13 +66,18 @@ is_device (int fd)
 #undef fputs
 #undef getcwd
 #undef isatty
+#undef open
 #undef raise
 #undef read
 #undef sprintf
+#undef strcasestr
 #undef strcmp
 #undef strlen
+#undef strstr
 #undef write
 
+#include "qemu.h"
+
 #if HAVE_MSVC_INVALID_PARAMETER_HANDLER
 static void __cdecl
 gl_msvc_invalid_parameter_handler (const wchar_t *expression,
@@ -166,12 +173,15 @@ main (int argc, char *argv[])
       _set_invalid_parameter_handler (gl_msvc_invalid_parameter_handler);
       #endif
       {
+        /* QEMU 6.1 in user-mode passes an open fd = 3, that references
+           /dev/urandom.  We need to ignore this fd.  */
+        bool is_qemu = is_running_under_qemu_user ();
         char buf[300];
         buf[0] = '\0';
         char *p = buf;
         int fd;
         for (fd = 0; fd < 20; fd++)
-          if (is_open (fd))
+          if (is_open (fd) && !(is_qemu && fd == 3))
             {
               sprintf (p, "%d ", fd);
               p += strlen (p);
-- 
2.25.1


[-- Attachment #3: 0002-spawn-pipe-Fix-test-failure-when-running-under-QEMU-.patch --]
[-- Type: text/x-patch, Size: 3657 bytes --]

From f765c6881f9b237163aa0178df3da5540f282f87 Mon Sep 17 00:00:00 2001
From: Bruno Haible <bruno@clisp.org>
Date: Mon, 30 Aug 2021 02:06:23 +0200
Subject: [PATCH 2/2] spawn-pipe: Fix test failure when running under QEMU
 user-mode.

* tests/test-spawn-pipe-child.c: Include <stdbool.h>, <string.h>,
qemu.h.
(main): Under QEMU user-mode, allow fd 2 or fd 3 to be open.
* modules/spawn-pipe-tests (Files): Add qemu.h.
(Depends-on): Add stdbool.
---
 ChangeLog                     |  9 +++++++++
 modules/spawn-pipe-tests      |  2 ++
 tests/test-spawn-pipe-child.c | 25 +++++++++++++++++++------
 3 files changed, 30 insertions(+), 6 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 76562fea4..7933058e8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2021-08-29  Bruno Haible  <bruno@clisp.org>
+
+	spawn-pipe: Fix test failure when running under QEMU user-mode.
+	* tests/test-spawn-pipe-child.c: Include <stdbool.h>, <string.h>,
+	qemu.h.
+	(main): Under QEMU user-mode, allow fd 2 or fd 3 to be open.
+	* modules/spawn-pipe-tests (Files): Add qemu.h.
+	(Depends-on): Add stdbool.
+
 2021-08-29  Bruno Haible  <bruno@clisp.org>
 
 	execute: Fix test failure when running under QEMU user-mode.
diff --git a/modules/spawn-pipe-tests b/modules/spawn-pipe-tests
index a204031a6..64bcde2b5 100644
--- a/modules/spawn-pipe-tests
+++ b/modules/spawn-pipe-tests
@@ -6,11 +6,13 @@ tests/test-spawn-pipe-script.c
 tests/executable-script
 tests/executable-script.sh
 tests/executable-shell-script
+tests/qemu.h
 tests/macros.h
 
 Depends-on:
 close
 msvc-inval
+stdbool
 stdint
 
 configure.ac:
diff --git a/tests/test-spawn-pipe-child.c b/tests/test-spawn-pipe-child.c
index 9d4dd174b..ee0ba9ad6 100644
--- a/tests/test-spawn-pipe-child.c
+++ b/tests/test-spawn-pipe-child.c
@@ -18,9 +18,11 @@
 
 #include <errno.h>
 #include <fcntl.h>
+#include <stdbool.h>
 #include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 #include <unistd.h>
 
 #if defined _WIN32 && ! defined __CYGWIN__
@@ -47,12 +49,17 @@ static FILE *myerr;
 #undef fdopen
 #undef fflush
 #undef fprintf
+#undef open
 #undef read
+#undef strcasestr
+#undef strstr
 #undef write
 #if defined _WIN32 && !defined __CYGWIN__
 # define fdopen _fdopen
 #endif
 
+#include "qemu.h"
+
 #if HAVE_MSVC_INVALID_PARAMETER_HANDLER
 static void __cdecl
 gl_msvc_invalid_parameter_handler (const wchar_t *expression,
@@ -97,6 +104,10 @@ main (int argc, char *argv[])
   _set_invalid_parameter_handler (gl_msvc_invalid_parameter_handler);
 #endif
 
+  /* QEMU 6.1 in user-mode passes an open fd, usually = 3, that references
+     /dev/urandom.  We need to ignore this fd.  */
+  bool is_qemu = is_running_under_qemu_user ();
+
   /* Read one byte from fd 0, and write its value plus one to fd 1.
      fd 2 should be closed iff the argument is 1.  Check that no other file
      descriptors leaked.  */
@@ -120,7 +131,8 @@ main (int argc, char *argv[])
          was closed.  Similarly on native Windows.  Future POSIX will allow
          this, see <http://austingroupbugs.net/view.php?id=173>.  */
 #if !(defined __hpux || (defined _WIN32 && ! defined __CYGWIN__))
-      ASSERT (! is_open (STDERR_FILENO));
+      if (!is_qemu)
+        ASSERT (! is_open (STDERR_FILENO));
 #endif
       break;
     default:
@@ -129,11 +141,12 @@ main (int argc, char *argv[])
 
   int fd;
   for (fd = 3; fd < 7; fd++)
-    {
-      errno = 0;
-      ASSERT (close (fd) == -1);
-      ASSERT (errno == EBADF);
-    }
+    if (!(is_qemu && fd == 3))
+      {
+        errno = 0;
+        ASSERT (close (fd) == -1);
+        ASSERT (errno == EBADF);
+      }
 
   return 0;
 }
-- 
2.25.1


^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2021-08-30  0:16 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-08-30  0:16 execute, spawn-pipe: Fix test failures when running under QEMU user-mode Bruno Haible

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).