]> granicus.if.org Git - strace/blobdiff - tests/execve.c
strace: terminate itself if interrupted by a signal
[strace] / tests / execve.c
index 74749e73e62053624dab175bfdb2740ff3dc9b66..db7206d8c04a7cd1d66e59e55fb98ce7f5d238b7 100644 (file)
@@ -2,29 +2,10 @@
  * This file is part of execve strace test.
  *
  * Copyright (c) 2015-2016 Dmitry V. Levin <ldv@altlinux.org>
+ * Copyright (c) 2015-2018 The strace developers.
  * All rights reserved.
  *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * SPDX-License-Identifier: GPL-2.0-or-later
  */
 
 #include "tests.h"
@@ -58,34 +39,40 @@ main(void)
 
        execve(FILENAME, tail_argv, tail_envp);
        printf("execve(\"%s\""
-              ", [\"%s\", \"%s\", \"%s\", %p, %p, %p, ???]"
+              ", [\"%s\", \"%s\", \"%s\", %p, %p, %p, ... /* %p */]"
 #if VERBOSE
-              ", [\"%s\", \"%s\", %p, %p, %p, ???]"
+              ", [\"%s\", \"%s\", %p, %p, %p, ... /* %p */]"
 #else
-              ", [/* 5 vars, unterminated */]"
+              ", %p /* 5 vars, unterminated */"
 #endif
               ") = -1 ENOENT (%m)\n",
               Q_FILENAME, q_argv[0], q_argv[1], q_argv[2],
-              argv[3], argv[4], argv[5]
+              argv[3], argv[4], argv[5], (char *) tail_argv + sizeof(argv)
 #if VERBOSE
-              , q_envp[0], q_envp[1], envp[2], envp[3], envp[4]
+              , q_envp[0], q_envp[1], envp[2], envp[3], envp[4],
+              (char *) tail_envp + sizeof(envp)
+#else
+              , tail_envp
 #endif
               );
 
        tail_argv[ARRAY_SIZE(q_argv)] = NULL;
        tail_envp[ARRAY_SIZE(q_envp)] = NULL;
+       (void) q_envp;  /* workaround for clang bug #33068 */
 
        execve(FILENAME, tail_argv, tail_envp);
        printf("execve(\"%s\", [\"%s\", \"%s\", \"%s\"]"
 #if VERBOSE
               ", [\"%s\", \"%s\"]"
 #else
-              ", [/* 2 vars */]"
+              ", %p /* 2 vars */"
 #endif
               ") = -1 ENOENT (%m)\n",
               Q_FILENAME, q_argv[0], q_argv[1], q_argv[2]
 #if VERBOSE
               , q_envp[0], q_envp[1]
+#else
+              , tail_envp
 #endif
               );
 
@@ -94,16 +81,18 @@ main(void)
 #if VERBOSE
               ", [\"%s\"]"
 #else
-              ", [/* 1 var */]"
+              ", %p /* 1 var */"
 #endif
               ") = -1 ENOENT (%m)\n",
               Q_FILENAME, q_argv[2]
 #if VERBOSE
               , q_envp[1]
+#else
+              , tail_envp + 1
 #endif
               );
 
-       char **const empty = tail_alloc(sizeof(*empty));
+       TAIL_ALLOC_OBJECT_CONST_PTR(char *, empty);
        char **const efault = empty + 1;
        *empty = NULL;
 
@@ -112,13 +101,22 @@ main(void)
 #if VERBOSE
               ", []"
 #else
-              ", [/* 0 vars */]"
+              ", %p /* 0 vars */"
 #endif
-              ") = -1 ENOENT (%m)\n", Q_FILENAME);
+              ") = -1 ENOENT (%m)\n", Q_FILENAME
+#if !VERBOSE
+              , empty
+#endif
+              );
+
+       char *const str_a = tail_alloc(DEFAULT_STRLEN + 2);
+       fill_memory_ex(str_a, DEFAULT_STRLEN + 1, '0', 10);
+       str_a[DEFAULT_STRLEN + 1] = '\0';
+
+       char *const str_b = tail_alloc(DEFAULT_STRLEN + 2);
+       fill_memory_ex(str_b, DEFAULT_STRLEN + 1, '_', 32);
+       str_b[DEFAULT_STRLEN + 1] = '\0';
 
-       char str_a[] = "012345678901234567890123456789012";
-       char str_b[] = "_abcdefghijklmnopqrstuvwxyz()[]{}";
-#define DEFAULT_STRLEN ((unsigned int) sizeof(str_a) - 2)
        char **const a = tail_alloc(sizeof(*a) * (DEFAULT_STRLEN + 2));
        char **const b = tail_alloc(sizeof(*b) * (DEFAULT_STRLEN + 2));
        unsigned int i;
@@ -141,10 +139,11 @@ main(void)
        printf("], [\"%.*s\"...", DEFAULT_STRLEN, b[0]);
        for (i = 1; i <= DEFAULT_STRLEN; ++i)
                printf(", \"%s\"", b[i]);
+       printf("]");
 #else
-       printf("], [/* %u vars */", DEFAULT_STRLEN + 1);
+       printf("], %p /* %u vars */", b, DEFAULT_STRLEN + 1);
 #endif
-       printf("]) = -1 ENOENT (%m)\n");
+       printf(") = -1 ENOENT (%m)\n");
 
        execve(FILENAME, a + 1, b + 1);
        printf("execve(\"%s\", [\"%s\"", Q_FILENAME, a[1]);
@@ -154,10 +153,11 @@ main(void)
        printf("], [\"%s\"", b[1]);
        for (i = 2; i <= DEFAULT_STRLEN; ++i)
                printf(", \"%s\"", b[i]);
+       printf("]");
 #else
-       printf("], [/* %d vars */", DEFAULT_STRLEN);
+       printf("], %p /* %d vars */", b + 1, DEFAULT_STRLEN);
 #endif
-       printf("]) = -1 ENOENT (%m)\n");
+       printf(") = -1 ENOENT (%m)\n");
 
        execve(FILENAME, (char **) tail_argv[ARRAY_SIZE(q_argv)], efault);
        printf("execve(\"%s\", NULL, %p) = -1 ENOENT (%m)\n",