tests: replace system by xsystem

With fortification enabled, system calls return result needs to be checked,
has it gets the __wur macro enabled.
Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>

(cherry picked from commit 8022fc7d51)
This commit is contained in:
Frédéric Bérat 2023-06-14 10:52:07 +02:00 committed by Florian Weimer
parent 708f507e30
commit 88b3554ed9
8 changed files with 86 additions and 6 deletions

View File

@ -26,6 +26,8 @@
#include <tls.h> #include <tls.h>
#include <unistd.h> #include <unistd.h>
#include <support/xstdlib.h>
static const char *command; static const char *command;
static bool child; static bool child;
static uintptr_t stack_chk_guard_copy; static uintptr_t stack_chk_guard_copy;
@ -108,7 +110,8 @@ do_test (void)
dup2 (fds[1], 2); dup2 (fds[1], 2);
close (fds[1]); close (fds[1]);
system (command); xsystem (command);
exit (0); exit (0);
} }

View File

@ -4,6 +4,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <support/xstdlib.h>
static char *fname; static char *fname;
@ -35,14 +36,16 @@ do_test (void)
char buffer[1024]; char buffer[1024];
snprintf (buffer, sizeof (buffer), "echo 'From foo@bar.com' > %s", fname); snprintf (buffer, sizeof (buffer), "echo 'From foo@bar.com' > %s", fname);
system (buffer); xsystem (buffer);
f = fopen (fname, "r"); f = fopen (fname, "r");
fseek (f, 0, SEEK_END); fseek (f, 0, SEEK_END);
o = ftello (f); o = ftello (f);
fseek (f, 0, SEEK_SET); fseek (f, 0, SEEK_SET);
fflush (f); fflush (f);
snprintf (buffer, sizeof (buffer), "echo 'From bar@baz.edu' >> %s", fname); snprintf (buffer, sizeof (buffer), "echo 'From bar@baz.edu' >> %s", fname);
system (buffer); xsystem (buffer);
fseek (f, o, SEEK_SET); fseek (f, o, SEEK_SET);
if (fgets (buffer, 1024, f) == NULL) if (fgets (buffer, 1024, f) == NULL)
exit (1); exit (1);

View File

@ -43,7 +43,8 @@ tf (void *arg)
{ {
char *cmd = xasprintf ("%s --direct --sem %s --pidfile %s", char *cmd = xasprintf ("%s --direct --sem %s --pidfile %s",
command, semfilename, pidfilename); command, semfilename, pidfilename);
system (cmd); if (system (cmd))
FAIL_EXIT1("system call unexpectedly returned");
/* This call should never return. */ /* This call should never return. */
return NULL; return NULL;
} }

View File

@ -27,6 +27,8 @@
#include <tls.h> #include <tls.h>
#include <unistd.h> #include <unistd.h>
#include <support/xstdlib.h>
static const char *command; static const char *command;
static bool child; static bool child;
static uintptr_t stack_chk_guard_copy; static uintptr_t stack_chk_guard_copy;
@ -138,7 +140,8 @@ do_test (void)
dup2 (fds[1], 2); dup2 (fds[1], 2);
close (fds[1]); close (fds[1]);
system (command); xsystem (command);
exit (0); exit (0);
} }

View File

@ -23,6 +23,7 @@
#include <support/support.h> #include <support/support.h>
#include <support/check.h> #include <support/check.h>
#include <support/xstdlib.h>
/* It is entirely allowed to start with a getpwent call without /* It is entirely allowed to start with a getpwent call without
resetting the state of the service via a call to setpwent. resetting the state of the service via a call to setpwent.
@ -55,7 +56,7 @@ do_test (void)
cmd = xasprintf ("%s/makedb -o /var/db/passwd.db /var/db/passwd.in", cmd = xasprintf ("%s/makedb -o /var/db/passwd.db /var/db/passwd.in",
support_bindir_prefix); support_bindir_prefix);
system (cmd); xsystem (cmd);
free (cmd); free (cmd);
try_it (); try_it ();

View File

@ -208,6 +208,7 @@ libsupport-routines = \
xstrndup \ xstrndup \
xsymlink \ xsymlink \
xsysconf \ xsysconf \
xsystem \
xunlink \ xunlink \
xuselocale \ xuselocale \
xwaitpid \ xwaitpid \

31
support/xstdlib.h Normal file
View File

@ -0,0 +1,31 @@
/* Error-checking wrappers for stdlib functions.
Copyright (C) 2023 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; if not, see
<https://www.gnu.org/licenses/>. */
#ifndef SUPPORT_XSTDLIB_H
#define SUPPORT_XSTDLIB_H
#include <stdlib.h>
#include <sys/cdefs.h>
__BEGIN_DECLS
void xsystem (const char *cmd);
__END_DECLS
#endif /* SUPPORT_XSTDLIB_H */

37
support/xsystem.c Normal file
View File

@ -0,0 +1,37 @@
/* Error-checking replacement for "system".
Copyright (C) 2023 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; if not, see
<https://www.gnu.org/licenses/>. */
#include <support/support.h>
#include <support/check.h>
#include <support/xstdlib.h>
void
xsystem (const char *cmd)
{
int ret = system (cmd);
if (ret == 0 && cmd == NULL)
FAIL_EXIT1 ("Unable to spawn a shell for NULL command");
if (ret == 127)
FAIL_EXIT1 ("Child terminated with status 127");
if (ret < 0)
FAIL_EXIT1 ("system (\"%s\")", cmd);
}