GNU C Library master sources branch master updated. glibc-2.28.9000-264-g4a938cb

fw@sourceware.org fw@sourceware.org
Tue Nov 6 16:07:00 GMT 2018


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".

The branch, master has been updated
       via  4a938cb273e164a475dc123cc80ea6354d7248d4 (commit)
      from  7597b0c7f711a6918d5804e08508817c72916376 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=4a938cb273e164a475dc123cc80ea6354d7248d4

commit 4a938cb273e164a475dc123cc80ea6354d7248d4
Author: Florian Weimer <fweimer@redhat.com>
Date:   Tue Nov 6 16:08:12 2018 +0100

    posix: New function posix_spawn_file_actions_addchdir_np [BZ #17405]

diff --git a/ChangeLog b/ChangeLog
index d64838b..9b8f6f2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,72 @@
+2018-11-06  Florian Weimer  <fweimer@redhat.com>
+
+	[BZ #17405]
+	* posix/Makefile (routines): Add spawn_faction_addchdir.
+	(tests): Add tst-spawn-chdir.
+	* posix/Versions (GLIBC_2.29): Add
+	posix_spawn_file_actions_addchdir_np.
+	* posix/spawn_faction_addchdir.c: New file.
+	* posix/spawn_faction_destroy.c
+	(__posix_spawn_file_actions_destroy): Handle spawn_do_chdir.
+	* posix/spawn.h (posix_spawn_file_actions_addchdir_np): Declare.
+	* posix/spawn_int.h (struct __spawn_action): Add spawn_do_chdir,
+	chdir_action.
+	* posix/tst-spawn-chdir.c: New file.
+	* sysdeps/posix/spawni.c (__spawni_child): Handle spawn_do_chdir.
+	* sysdeps/unix/sysv/linux/spawni.c (__spawni_child): Likewise.
+	* sysdeps/mach/hurd/i386/libc.abilist (GLIBC_2.29): Add
+	posix_spawn_file_actions_addchdir_np.
+	* sysdeps/unix/sysv/linux/aarch64/libc.abilist (GLIBC_2.29):
+	Likewise.
+	* sysdeps/unix/sysv/linux/alpha/libc.abilist (GLIBC_2.29):
+	Likewise.
+	* sysdeps/unix/sysv/linux/arm/libc.abilist (GLIBC_2.29): Likewise.
+	* sysdeps/unix/sysv/linux/hppa/libc.abilist (GLIBC_2.29):
+	Likewise.
+	* sysdeps/unix/sysv/linux/i386/libc.abilist (GLIBC_2.29):
+	Likewise.
+	* sysdeps/unix/sysv/linux/ia64/libc.abilist (GLIBC_2.29):
+	Likewise.
+	* sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist (GLIBC_2.29):
+	Likewise.
+	* sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist (GLIBC_2.29):
+	Likewise.
+	* sysdeps/unix/sysv/linux/microblaze/libc.abilist (GLIBC_2.29):
+	Likewise.
+	* sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
+	(GLIBC_2.29): Likewise.
+	* sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
+	(GLIBC_2.29): Likewise.
+	* sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
+	(GLIBC_2.29): Likewise.
+	* sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
+	(GLIBC_2.29): Likewise.
+	* sysdeps/unix/sysv/linux/nios2/libc.abilist (GLIBC_2.29):
+	Likewise.
+	* sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
+	(GLIBC_2.29): Likewise.
+	* sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
+	(GLIBC_2.29): Likewise.
+	* sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist
+	(GLIBC_2.29): Likewise.
+	* sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist
+	(GLIBC_2.29): Likewise.
+	* sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist (GLIBC_2.29):
+	Likewise.
+	* sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist (GLIBC_2.29):
+	Likewise.
+	* sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist (GLIBC_2.29):
+	Likewise.
+	* sysdeps/unix/sysv/linux/sh/libc.abilist (GLIBC_2.29): Likewise.
+	* sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist (GLIBC_2.29):
+	Likewise.
+	* sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist (GLIBC_2.29):
+	Likewise.
+	* sysdeps/unix/sysv/linux/x86_64/64/libc.abilist (GLIBC_2.29):
+	Likewise.
+	* sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist (GLIBC_2.29):
+	Likewise.
+
 2018-11-06  Gabriel F. T. Gomes  <gabriel@inconstante.eti.br>
 
 	* misc/Makefile (tests): Add tst-ldbl-error.
diff --git a/NEWS b/NEWS
index 3d13b32..f488821 100644
--- a/NEWS
+++ b/NEWS
@@ -30,6 +30,11 @@ Major new features:
   HTM state is saved and restore lazily (the state being saved even when the
   process actually does not use HTM).
 
+* The posix_spawn_file_actions_addchdir_np function has been added,
+  enabling posix_spawn and posix_spawnp to run the new process in a
+  different directory.  This is a GNU extension and similar to the
+  Solaris function of the same name.
+
 Deprecated and removed features, and other changes affecting compatibility:
 
 * The glibc.tune tunable namespace has been renamed to glibc.cpu and the
diff --git a/posix/Makefile b/posix/Makefile
index 8316212..d67f68d 100644
--- a/posix/Makefile
+++ b/posix/Makefile
@@ -55,6 +55,7 @@ routines :=								      \
 	pread pwrite pread64 pwrite64					      \
 	spawn_faction_init spawn_faction_destroy spawn_faction_addclose	      \
 	spawn_faction_addopen spawn_faction_adddup2 spawn_valid_fd	      \
+	spawn_faction_addchdir 						      \
 	spawnattr_init spawnattr_destroy				      \
 	spawnattr_getdefault spawnattr_setdefault			      \
 	spawnattr_getflags spawnattr_setflags				      \
@@ -96,7 +97,7 @@ tests		:= test-errno tstgetopt testfnm runtests runptests \
 		   tst-posix_fadvise tst-posix_fadvise64 \
 		   tst-sysconf-empty-chroot tst-glob_symlinks tst-fexecve \
 		   tst-glob-tilde test-ssize-max tst-spawn4 bug-regex37 \
-		   bug-regex38 tst-regcomp-truncated
+		   bug-regex38 tst-regcomp-truncated tst-spawn-chdir
 tests-internal	:= bug-regex5 bug-regex20 bug-regex33 \
 		   tst-rfc3484 tst-rfc3484-2 tst-rfc3484-3 \
 		   tst-glob_lstat_compat tst-spawn4-compat
diff --git a/posix/Versions b/posix/Versions
index cad4c23..56ab921 100644
--- a/posix/Versions
+++ b/posix/Versions
@@ -137,6 +137,9 @@ libc {
   GLIBC_2.27 {
     glob; glob64;
   }
+  GLIBC_2.29 {
+    posix_spawn_file_actions_addchdir_np;
+  }
   GLIBC_PRIVATE {
     __libc_fork; __libc_pread; __libc_pwrite;
     __nanosleep_nocancel; __pause_nocancel;
diff --git a/posix/spawn.h b/posix/spawn.h
index aafb276..c84ee4b 100644
--- a/posix/spawn.h
+++ b/posix/spawn.h
@@ -185,6 +185,13 @@ extern int posix_spawn_file_actions_adddup2 (posix_spawn_file_actions_t *
 					     __file_actions,
 					     int __fd, int __newfd) __THROW;
 
+#ifdef __USE_GNU
+/* Add an action changing the directory to PATH during spawn.  This
+   affects the subsequent file actions.  */
+extern int posix_spawn_file_actions_addchdir_np (posix_spawn_file_actions_t *,
+						 const char *__path) __THROW;
+#endif
+
 __END_DECLS
 
 #endif /* spawn.h */
diff --git a/posix/spawn_faction_addchdir.c b/posix/spawn_faction_addchdir.c
new file mode 100644
index 0000000..0e7a45a
--- /dev/null
+++ b/posix/spawn_faction_addchdir.c
@@ -0,0 +1,53 @@
+/* Add a directory change to a file action list for posix_spawn.
+   Copyright (C) 2000-2018 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
+   <http://www.gnu.org/licenses/>.  */
+
+#include <errno.h>
+#include <spawn.h>
+#include <string.h>
+
+#include "spawn_int.h"
+
+int
+posix_spawn_file_actions_addchdir_np (posix_spawn_file_actions_t *file_actions,
+                                      const char *path)
+{
+  struct __spawn_action *rec;
+
+  char *path_copy = __strdup (path);
+  if (path_copy == NULL)
+    return ENOMEM;
+
+  /* Allocate more memory if needed.  */
+  if (file_actions->__used == file_actions->__allocated
+      && __posix_spawn_file_actions_realloc (file_actions) != 0)
+    {
+      /* This can only mean we ran out of memory.  */
+      free (path_copy);
+      return ENOMEM;
+    }
+
+  /* Add the new value.  */
+  rec = &file_actions->__actions[file_actions->__used];
+  rec->tag = spawn_do_chdir;
+  rec->action.chdir_action.path = path_copy;
+
+  /* Account for the new entry.  */
+  ++file_actions->__used;
+
+  return 0;
+}
diff --git a/posix/spawn_faction_destroy.c b/posix/spawn_faction_destroy.c
index 2a2de4e..05ca9dc 100644
--- a/posix/spawn_faction_destroy.c
+++ b/posix/spawn_faction_destroy.c
@@ -33,6 +33,9 @@ __posix_spawn_file_actions_destroy (posix_spawn_file_actions_t *file_actions)
 	case spawn_do_open:
 	  free (sa->action.open_action.path);
 	  break;
+	case spawn_do_chdir:
+	  free (sa->action.chdir_action.path);
+	  break;
 	case spawn_do_close:
 	case spawn_do_dup2:
 	  /* No cleanup required.  */
diff --git a/posix/spawn_int.h b/posix/spawn_int.h
index 171f67c..9db3555 100644
--- a/posix/spawn_int.h
+++ b/posix/spawn_int.h
@@ -29,7 +29,8 @@ struct __spawn_action
   {
     spawn_do_close,
     spawn_do_dup2,
-    spawn_do_open
+    spawn_do_open,
+    spawn_do_chdir,
   } tag;
 
   union
@@ -50,6 +51,10 @@ struct __spawn_action
       int oflag;
       mode_t mode;
     } open_action;
+    struct
+    {
+      char *path;
+    } chdir_action;
   } action;
 };
 
diff --git a/posix/tst-spawn-chdir.c b/posix/tst-spawn-chdir.c
new file mode 100644
index 0000000..dc14f20
--- /dev/null
+++ b/posix/tst-spawn-chdir.c
@@ -0,0 +1,192 @@
+/* Test the posix_spawn_file_actions_addchdir_np function.
+   Copyright (C) 2018 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
+   <http://www.gnu.org/licenses/>.  */
+
+#include <array_length.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <spawn.h>
+#include <stdlib.h>
+#include <string.h>
+#include <support/check.h>
+#include <support/support.h>
+#include <support/temp_file.h>
+#include <support/xstdio.h>
+#include <support/xunistd.h>
+#include <unistd.h>
+
+/* Reads the file at PATH, which must consist of exactly one line.
+   Removes the line terminator at the end of the file.  */
+static char *
+read_one_line (const char *path)
+{
+  FILE *fp = xfopen (path, "r");
+  char *buffer = NULL;
+  size_t length = 0;
+  ssize_t ret = getline (&buffer, &length, fp);
+  if (ferror (fp))
+    FAIL_EXIT1 ("getline: %m");
+  if (ret < 1)
+    FAIL_EXIT1 ("getline returned %zd", ret);
+  if (fgetc (fp) != EOF)
+    FAIL_EXIT1 ("trailing bytes in %s", path);
+  if (ferror (fp))
+    FAIL_EXIT1 ("fgetc: %m");
+  xfclose (fp);
+  if (buffer[ret - 1] != '\n')
+    FAIL_EXIT1 ("missing line terminator in %s", path);
+  buffer[ret - 1] = 0;
+  return buffer;
+}
+
+/* Return the path to the "pwd" program.  */
+const char *
+get_pwd_program (void)
+{
+  const char *const paths[] = { "/bin/pwd", "/usr/bin/pwd" };
+  for (size_t i = 0; i < array_length (paths); ++i)
+    if (access (paths[i], X_OK) == 0)
+      return paths[i];
+  FAIL_EXIT1 ("cannot find pwd program");
+}
+
+static int
+do_test (void)
+{
+  /* Directory for temporary file data.  Each subtest uses a numeric
+     subdirectory.  */
+  char *directory = support_create_temp_directory ("tst-spawn-chdir-");
+  {
+    /* Avoid symbolic links, to get more consistent behavior from the
+       pwd command.  */
+    char *tmp = realpath (directory, NULL);
+    if (tmp == NULL)
+      FAIL_EXIT1 ("realpath: %m");
+    free (directory);
+    directory = tmp;
+  }
+
+  char *original_cwd = get_current_dir_name ();
+  if (original_cwd == NULL)
+    FAIL_EXIT1 ("get_current_dir_name: %m");
+
+  int iteration = 0;
+  for (int do_spawnp = 0; do_spawnp < 2; ++do_spawnp)
+    for (int do_overwrite = 0; do_overwrite < 2; ++do_overwrite)
+      {
+        ++iteration;
+        printf ("info: iteration=%d do_spawnp=%d do_overwrite=%d\n",
+                iteration, do_spawnp, do_overwrite);
+
+        /* The "pwd" program runs in this directory.  */
+        char *iteration_directory = xasprintf ("%s/%d", directory, iteration);
+        add_temp_file (iteration_directory);
+        xmkdir (iteration_directory, 0777);
+
+        /* This file receives output from "pwd".  */
+        char *output_file_path
+          = xasprintf ("%s/output-file", iteration_directory);
+        add_temp_file (output_file_path);
+
+        /* This subdirectory is used for chdir ordering checks.  */
+        char *subdir_path = xasprintf ("%s/subdir", iteration_directory);
+        add_temp_file (subdir_path);
+        xmkdir (subdir_path, 0777);
+
+        /* Also used for checking the order of actions.  */
+        char *probe_file_path
+          = xasprintf ("%s/subdir/probe-file", iteration_directory);
+        add_temp_file (probe_file_path);
+        TEST_COMPARE (access (probe_file_path, F_OK), -1);
+        TEST_COMPARE (errno, ENOENT);
+
+        /* This symbolic link is used in a relative path with
+           posix_spawn.  */
+        char *pwd_symlink_path
+          = xasprintf ("%s/subdir/pwd-symlink", iteration_directory);
+        xsymlink (get_pwd_program (), pwd_symlink_path);
+        add_temp_file (pwd_symlink_path);
+
+        posix_spawn_file_actions_t actions;
+        TEST_COMPARE (posix_spawn_file_actions_init (&actions), 0);
+        TEST_COMPARE (posix_spawn_file_actions_addchdir_np
+                      (&actions, subdir_path), 0);
+        TEST_COMPARE (posix_spawn_file_actions_addopen
+                      (&actions, 3, /* Arbitrary unused descriptor.  */
+                       "probe-file",
+                       O_WRONLY | O_CREAT | O_EXCL, 0777), 0);
+        TEST_COMPARE (posix_spawn_file_actions_addclose (&actions, 3), 0);
+        /* Run the actual in iteration_directory.  */
+        TEST_COMPARE (posix_spawn_file_actions_addchdir_np (&actions, ".."), 0);
+        TEST_COMPARE (posix_spawn_file_actions_addopen
+                      (&actions, STDOUT_FILENO, "output-file",
+                       O_WRONLY | O_CREAT | O_EXCL, 0777), 0);
+
+        /* Check that posix_spawn_file_actions_addchdir_np made a copy
+           of the path.  */
+        if (do_overwrite)
+          subdir_path[0] = '\0';
+
+        char *const argv[] = { (char *) "pwd", NULL };
+        char *const envp[] = { NULL } ;
+        pid_t pid;
+        if (do_spawnp)
+          TEST_COMPARE (posix_spawnp (&pid, "pwd", &actions,
+                                      NULL, argv, envp), 0);
+        else
+          TEST_COMPARE (posix_spawn (&pid, "subdir/pwd-symlink", &actions,
+                                     NULL, argv, envp), 0);
+        TEST_VERIFY (pid > 0);
+        int status;
+        xwaitpid (pid, &status, 0);
+        TEST_COMPARE (status, 0);
+
+        /* Check that the current directory did not change.  */
+        {
+          char *cwd = get_current_dir_name ();
+          if (cwd == NULL)
+            FAIL_EXIT1 ("get_current_dir_name: %m");
+          TEST_COMPARE_BLOB (original_cwd, strlen (original_cwd),
+                             cwd, strlen (cwd));
+          free (cwd);
+        }
+
+
+        /* Check the output from "pwd".  */
+        {
+          char *pwd = read_one_line (output_file_path);
+          TEST_COMPARE_BLOB (iteration_directory, strlen (iteration_directory),
+                             pwd, strlen (pwd));
+          free (pwd);
+        }
+
+        /* This file must now exist.  */
+        TEST_COMPARE (access (probe_file_path, F_OK), 0);
+
+        TEST_COMPARE (posix_spawn_file_actions_destroy (&actions), 0);
+        free (pwd_symlink_path);
+        free (probe_file_path);
+        free (subdir_path);
+        free (output_file_path);
+      }
+
+  free (directory);
+
+  return 0;
+}
+
+#include <support/test-driver.c>
diff --git a/sysdeps/mach/hurd/i386/libc.abilist b/sysdeps/mach/hurd/i386/libc.abilist
index e3fc051..62674e9 100644
--- a/sysdeps/mach/hurd/i386/libc.abilist
+++ b/sysdeps/mach/hurd/i386/libc.abilist
@@ -2038,6 +2038,7 @@ GLIBC_2.27 wcstof64x_l F
 GLIBC_2.28 fcntl64 F
 GLIBC_2.28 renameat2 F
 GLIBC_2.28 statx F
+GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
 GLIBC_2.3 __ctype_toupper_loc F
diff --git a/sysdeps/posix/spawni.c b/sysdeps/posix/spawni.c
index b138ab4..c42fbd5 100644
--- a/sysdeps/posix/spawni.c
+++ b/sysdeps/posix/spawni.c
@@ -209,6 +209,11 @@ __spawni_child (void *arguments)
 		  != action->action.dup2_action.newfd)
 		goto fail;
 	      break;
+
+	    case spawn_do_chdir:
+	      if (__chdir (action->action.chdir_action.path) != 0)
+		goto fail;
+	      break;
 	    }
 	}
     }
diff --git a/sysdeps/unix/sysv/linux/aarch64/libc.abilist b/sysdeps/unix/sysv/linux/aarch64/libc.abilist
index 15f966f..e66c741 100644
--- a/sysdeps/unix/sysv/linux/aarch64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/aarch64/libc.abilist
@@ -2138,3 +2138,4 @@ GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_equal F
 GLIBC_2.28 thrd_sleep F
 GLIBC_2.28 thrd_yield F
+GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
diff --git a/sysdeps/unix/sysv/linux/alpha/libc.abilist b/sysdeps/unix/sysv/linux/alpha/libc.abilist
index e22b916..8df162f 100644
--- a/sysdeps/unix/sysv/linux/alpha/libc.abilist
+++ b/sysdeps/unix/sysv/linux/alpha/libc.abilist
@@ -2033,6 +2033,7 @@ GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_equal F
 GLIBC_2.28 thrd_sleep F
 GLIBC_2.28 thrd_yield F
+GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
 GLIBC_2.3 __ctype_toupper_loc F
diff --git a/sysdeps/unix/sysv/linux/arm/libc.abilist b/sysdeps/unix/sysv/linux/arm/libc.abilist
index a231812..43c804f 100644
--- a/sysdeps/unix/sysv/linux/arm/libc.abilist
+++ b/sysdeps/unix/sysv/linux/arm/libc.abilist
@@ -123,6 +123,7 @@ GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_equal F
 GLIBC_2.28 thrd_sleep F
 GLIBC_2.28 thrd_yield F
+GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
 GLIBC_2.4 _Exit F
 GLIBC_2.4 _IO_2_1_stderr_ D 0xa0
 GLIBC_2.4 _IO_2_1_stdin_ D 0xa0
diff --git a/sysdeps/unix/sysv/linux/hppa/libc.abilist b/sysdeps/unix/sysv/linux/hppa/libc.abilist
index 24b11b1..88b01c2 100644
--- a/sysdeps/unix/sysv/linux/hppa/libc.abilist
+++ b/sysdeps/unix/sysv/linux/hppa/libc.abilist
@@ -1880,6 +1880,7 @@ GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_equal F
 GLIBC_2.28 thrd_sleep F
 GLIBC_2.28 thrd_yield F
+GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
 GLIBC_2.3 __ctype_toupper_loc F
diff --git a/sysdeps/unix/sysv/linux/i386/libc.abilist b/sysdeps/unix/sysv/linux/i386/libc.abilist
index 9762c81..6d02f31 100644
--- a/sysdeps/unix/sysv/linux/i386/libc.abilist
+++ b/sysdeps/unix/sysv/linux/i386/libc.abilist
@@ -2045,6 +2045,7 @@ GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_equal F
 GLIBC_2.28 thrd_sleep F
 GLIBC_2.28 thrd_yield F
+GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
 GLIBC_2.3 __ctype_toupper_loc F
diff --git a/sysdeps/unix/sysv/linux/ia64/libc.abilist b/sysdeps/unix/sysv/linux/ia64/libc.abilist
index 50c94ad..4249712 100644
--- a/sysdeps/unix/sysv/linux/ia64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/ia64/libc.abilist
@@ -1914,6 +1914,7 @@ GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_equal F
 GLIBC_2.28 thrd_sleep F
 GLIBC_2.28 thrd_yield F
+GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
 GLIBC_2.3 __ctype_toupper_loc F
diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
index f57be98..d47b808 100644
--- a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
+++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
@@ -124,6 +124,7 @@ GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_equal F
 GLIBC_2.28 thrd_sleep F
 GLIBC_2.28 thrd_yield F
+GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
 GLIBC_2.4 _Exit F
 GLIBC_2.4 _IO_2_1_stderr_ D 0x98
 GLIBC_2.4 _IO_2_1_stdin_ D 0x98
diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
index ddc7ebc..d5e3830 100644
--- a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
+++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
@@ -1989,6 +1989,7 @@ GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_equal F
 GLIBC_2.28 thrd_sleep F
 GLIBC_2.28 thrd_yield F
+GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
 GLIBC_2.3 __ctype_toupper_loc F
diff --git a/sysdeps/unix/sysv/linux/microblaze/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/libc.abilist
index daed511..8596b84 100644
--- a/sysdeps/unix/sysv/linux/microblaze/libc.abilist
+++ b/sysdeps/unix/sysv/linux/microblaze/libc.abilist
@@ -2130,3 +2130,4 @@ GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_equal F
 GLIBC_2.28 thrd_sleep F
 GLIBC_2.28 thrd_yield F
+GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
index dda9797..88e0f89 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
@@ -1967,6 +1967,7 @@ GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_equal F
 GLIBC_2.28 thrd_sleep F
 GLIBC_2.28 thrd_yield F
+GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
 GLIBC_2.3 __ctype_toupper_loc F
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
index 42e930d..aff7462 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
@@ -1965,6 +1965,7 @@ GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_equal F
 GLIBC_2.28 thrd_sleep F
 GLIBC_2.28 thrd_yield F
+GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
 GLIBC_2.3 __ctype_toupper_loc F
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
index f89b44f..71d8244 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
@@ -1973,6 +1973,7 @@ GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_equal F
 GLIBC_2.28 thrd_sleep F
 GLIBC_2.28 thrd_yield F
+GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
 GLIBC_2.3 __ctype_toupper_loc F
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
index 1486af1..de6c53d 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
@@ -1968,6 +1968,7 @@ GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_equal F
 GLIBC_2.28 thrd_sleep F
 GLIBC_2.28 thrd_yield F
+GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
 GLIBC_2.3 __ctype_toupper_loc F
diff --git a/sysdeps/unix/sysv/linux/nios2/libc.abilist b/sysdeps/unix/sysv/linux/nios2/libc.abilist
index aab1c44..e724bab 100644
--- a/sysdeps/unix/sysv/linux/nios2/libc.abilist
+++ b/sysdeps/unix/sysv/linux/nios2/libc.abilist
@@ -2171,3 +2171,4 @@ GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_equal F
 GLIBC_2.28 thrd_sleep F
 GLIBC_2.28 thrd_yield F
+GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
index 45839ed..e9ecbcc 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
@@ -1993,6 +1993,7 @@ GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_equal F
 GLIBC_2.28 thrd_sleep F
 GLIBC_2.28 thrd_yield F
+GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
 GLIBC_2.3 __ctype_toupper_loc F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
index 344e5ae..da83ea6 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
@@ -1997,6 +1997,7 @@ GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_equal F
 GLIBC_2.28 thrd_sleep F
 GLIBC_2.28 thrd_yield F
+GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
 GLIBC_2.3 __ctype_toupper_loc F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist
index e26930e..4535b40 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist
@@ -2228,3 +2228,4 @@ GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_equal F
 GLIBC_2.28 thrd_sleep F
 GLIBC_2.28 thrd_yield F
+GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist
index 8c1781a..65725de 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist
@@ -123,6 +123,7 @@ GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_equal F
 GLIBC_2.28 thrd_sleep F
 GLIBC_2.28 thrd_yield F
+GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
 GLIBC_2.3 _Exit F
 GLIBC_2.3 _IO_2_1_stderr_ D 0xe0
 GLIBC_2.3 _IO_2_1_stdin_ D 0xe0
diff --git a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
index daaccee..bbb3c4a 100644
--- a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
@@ -2100,3 +2100,4 @@ GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_equal F
 GLIBC_2.28 thrd_sleep F
 GLIBC_2.28 thrd_yield F
+GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
index 3a5ec2a..e85ac2a 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
@@ -2002,6 +2002,7 @@ GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_equal F
 GLIBC_2.28 thrd_sleep F
 GLIBC_2.28 thrd_yield F
+GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
 GLIBC_2.3 __ctype_toupper_loc F
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
index 04a539f..d569310 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
@@ -1908,6 +1908,7 @@ GLIBC_2.28 thrd_equal F
 GLIBC_2.28 thrd_sleep F
 GLIBC_2.28 thrd_yield F
 GLIBC_2.29 __fentry__ F
+GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
 GLIBC_2.3 __ctype_toupper_loc F
diff --git a/sysdeps/unix/sysv/linux/sh/libc.abilist b/sysdeps/unix/sysv/linux/sh/libc.abilist
index 1f4e648..ff939a1 100644
--- a/sysdeps/unix/sysv/linux/sh/libc.abilist
+++ b/sysdeps/unix/sysv/linux/sh/libc.abilist
@@ -1884,6 +1884,7 @@ GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_equal F
 GLIBC_2.28 thrd_sleep F
 GLIBC_2.28 thrd_yield F
+GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
 GLIBC_2.3 __ctype_toupper_loc F
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
index d308ac8..64fa9e1 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
@@ -1996,6 +1996,7 @@ GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_equal F
 GLIBC_2.28 thrd_sleep F
 GLIBC_2.28 thrd_yield F
+GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
 GLIBC_2.3 __ctype_toupper_loc F
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
index 6731ebf..db909d1 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
@@ -1937,6 +1937,7 @@ GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_equal F
 GLIBC_2.28 thrd_sleep F
 GLIBC_2.28 thrd_yield F
+GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
 GLIBC_2.3 __ctype_toupper_loc F
diff --git a/sysdeps/unix/sysv/linux/spawni.c b/sysdeps/unix/sysv/linux/spawni.c
index 85239ce..9f3a137 100644
--- a/sysdeps/unix/sysv/linux/spawni.c
+++ b/sysdeps/unix/sysv/linux/spawni.c
@@ -258,6 +258,11 @@ __spawni_child (void *arguments)
 		  != action->action.dup2_action.newfd)
 		goto fail;
 	      break;
+
+	    case spawn_do_chdir:
+	      if (__chdir (action->action.chdir_action.path) != 0)
+		goto fail;
+	      break;
 	    }
 	}
     }
diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
index 816e4a7..3b175f1 100644
--- a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
@@ -1895,6 +1895,7 @@ GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_equal F
 GLIBC_2.28 thrd_sleep F
 GLIBC_2.28 thrd_yield F
+GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
 GLIBC_2.3 __ctype_toupper_loc F
diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
index 6fee16a..1b57710 100644
--- a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
@@ -2146,3 +2146,4 @@ GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_equal F
 GLIBC_2.28 thrd_sleep F
 GLIBC_2.28 thrd_yield F
+GLIBC_2.29 posix_spawn_file_actions_addchdir_np F

-----------------------------------------------------------------------

Summary of changes:
 ChangeLog                                          |   69 +++++++
 NEWS                                               |    5 +
 posix/Makefile                                     |    3 +-
 posix/Versions                                     |    3 +
 posix/spawn.h                                      |    7 +
 ..._faction_addopen.c => spawn_faction_addchdir.c} |   23 +--
 posix/spawn_faction_destroy.c                      |    3 +
 posix/spawn_int.h                                  |    7 +-
 posix/tst-spawn-chdir.c                            |  192 ++++++++++++++++++++
 sysdeps/mach/hurd/i386/libc.abilist                |    1 +
 sysdeps/posix/spawni.c                             |    5 +
 sysdeps/unix/sysv/linux/aarch64/libc.abilist       |    1 +
 sysdeps/unix/sysv/linux/alpha/libc.abilist         |    1 +
 sysdeps/unix/sysv/linux/arm/libc.abilist           |    1 +
 sysdeps/unix/sysv/linux/hppa/libc.abilist          |    1 +
 sysdeps/unix/sysv/linux/i386/libc.abilist          |    1 +
 sysdeps/unix/sysv/linux/ia64/libc.abilist          |    1 +
 sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist |    1 +
 sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist   |    1 +
 sysdeps/unix/sysv/linux/microblaze/libc.abilist    |    1 +
 .../unix/sysv/linux/mips/mips32/fpu/libc.abilist   |    1 +
 .../unix/sysv/linux/mips/mips32/nofpu/libc.abilist |    1 +
 .../unix/sysv/linux/mips/mips64/n32/libc.abilist   |    1 +
 .../unix/sysv/linux/mips/mips64/n64/libc.abilist   |    1 +
 sysdeps/unix/sysv/linux/nios2/libc.abilist         |    1 +
 .../sysv/linux/powerpc/powerpc32/fpu/libc.abilist  |    1 +
 .../linux/powerpc/powerpc32/nofpu/libc.abilist     |    1 +
 .../sysv/linux/powerpc/powerpc64/libc-le.abilist   |    1 +
 .../unix/sysv/linux/powerpc/powerpc64/libc.abilist |    1 +
 sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist    |    1 +
 sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist  |    1 +
 sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist  |    1 +
 sysdeps/unix/sysv/linux/sh/libc.abilist            |    1 +
 sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist |    1 +
 sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist |    1 +
 sysdeps/unix/sysv/linux/spawni.c                   |    5 +
 sysdeps/unix/sysv/linux/x86_64/64/libc.abilist     |    1 +
 sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist    |    1 +
 38 files changed, 331 insertions(+), 18 deletions(-)
 copy posix/{spawn_faction_addopen.c => spawn_faction_addchdir.c} (69%)
 create mode 100644 posix/tst-spawn-chdir.c


hooks/post-receive
-- 
GNU C Library master sources



More information about the Glibc-cvs mailing list