138a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin/* 223168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin * This file is part of execve strace test. 323168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin * 423168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin * Copyright (c) 2015-2016 Dmitry V. Levin <ldv@altlinux.org> 538a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * All rights reserved. 638a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * 738a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * Redistribution and use in source and binary forms, with or without 838a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * modification, are permitted provided that the following conditions 938a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * are met: 1038a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * 1. Redistributions of source code must retain the above copyright 1138a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * notice, this list of conditions and the following disclaimer. 1238a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * 2. Redistributions in binary form must reproduce the above copyright 1338a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * notice, this list of conditions and the following disclaimer in the 1438a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * documentation and/or other materials provided with the distribution. 1538a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * 3. The name of the author may not be used to endorse or promote products 1638a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * derived from this software without specific prior written permission. 1738a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * 1838a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 1938a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 2038a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 2138a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 2238a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 2338a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2438a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2538a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2638a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2738a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2838a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin */ 2938a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin 3023168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin#include "tests.h" 3123168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin#include <stdio.h> 324ff687bb31ee2caa8b0ce54911bc61708889e272Dmitry V. Levin#include <unistd.h> 334ff687bb31ee2caa8b0ce54911bc61708889e272Dmitry V. Levin 3423168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin#define FILENAME "test.execve\nfilename" 3523168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin#define Q_FILENAME "test.execve\\nfilename" 3623168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin 3723168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levinstatic const char * const argv[] = { 3823168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin FILENAME, "first", "second", (const char *) -1L, 3923168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin (const char *) -2L, (const char *) -3L 4023168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin}; 4123168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levinstatic const char * const q_argv[] = { 4223168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin Q_FILENAME, "first", "second" 4323168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin}; 4423168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin 4523168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levinstatic const char * const envp[] = { 4623168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin "foobar=1", "foo\nbar=2", (const char *) -1L, 4723168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin (const char *) -2L, (const char *) -3L 4823168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin}; 4923168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levinstatic const char * const q_envp[] = { 5023168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin "foobar=1", "foo\\nbar=2" 5123168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin}; 524ff687bb31ee2caa8b0ce54911bc61708889e272Dmitry V. Levin 534ff687bb31ee2caa8b0ce54911bc61708889e272Dmitry V. Levinint 544ff687bb31ee2caa8b0ce54911bc61708889e272Dmitry V. Levinmain(void) 554ff687bb31ee2caa8b0ce54911bc61708889e272Dmitry V. Levin{ 5623168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin char ** const tail_argv = tail_memdup(argv, sizeof(argv)); 5723168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin char ** const tail_envp = tail_memdup(envp, sizeof(envp)); 5823168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin 5923168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin execve(FILENAME, tail_argv, tail_envp); 6023168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin printf("execve(\"%s\"" 6123168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin ", [\"%s\", \"%s\", \"%s\", %p, %p, %p, ???]" 6268beed808a8abfcba3b7a5aeb59a194d3f916fd3Dmitry V. Levin#if VERBOSE 6323168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin ", [\"%s\", \"%s\", %p, %p, %p, ???]" 6423168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin#else 6523168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin ", [/* 5 vars, unterminated */]" 6623168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin#endif 67b5faea4c73f5a39fcd6143ff6cf67462e0662348Dmitry V. Levin ") = -1 ENOENT (%m)\n", 6823168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin Q_FILENAME, q_argv[0], q_argv[1], q_argv[2], 69b5faea4c73f5a39fcd6143ff6cf67462e0662348Dmitry V. Levin argv[3], argv[4], argv[5] 7068beed808a8abfcba3b7a5aeb59a194d3f916fd3Dmitry V. Levin#if VERBOSE 71b5faea4c73f5a39fcd6143ff6cf67462e0662348Dmitry V. Levin , q_envp[0], q_envp[1], envp[2], envp[3], envp[4] 7223168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin#endif 73b5faea4c73f5a39fcd6143ff6cf67462e0662348Dmitry V. Levin ); 7423168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin 7523168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin tail_argv[ARRAY_SIZE(q_argv)] = NULL; 7623168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin tail_envp[ARRAY_SIZE(q_envp)] = NULL; 7723168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin 7823168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin execve(FILENAME, tail_argv, tail_envp); 7923168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin printf("execve(\"%s\", [\"%s\", \"%s\", \"%s\"]" 8068beed808a8abfcba3b7a5aeb59a194d3f916fd3Dmitry V. Levin#if VERBOSE 8123168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin ", [\"%s\", \"%s\"]" 8223168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin#else 8323168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin ", [/* 2 vars */]" 8423168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin#endif 85b5faea4c73f5a39fcd6143ff6cf67462e0662348Dmitry V. Levin ") = -1 ENOENT (%m)\n", 86b5faea4c73f5a39fcd6143ff6cf67462e0662348Dmitry V. Levin Q_FILENAME, q_argv[0], q_argv[1], q_argv[2] 8768beed808a8abfcba3b7a5aeb59a194d3f916fd3Dmitry V. Levin#if VERBOSE 88b5faea4c73f5a39fcd6143ff6cf67462e0662348Dmitry V. Levin , q_envp[0], q_envp[1] 8923168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin#endif 90b5faea4c73f5a39fcd6143ff6cf67462e0662348Dmitry V. Levin ); 9123168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin 9223168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin execve(FILENAME, tail_argv + 2, tail_envp + 1); 9323168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin printf("execve(\"%s\", [\"%s\"]" 9468beed808a8abfcba3b7a5aeb59a194d3f916fd3Dmitry V. Levin#if VERBOSE 9523168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin ", [\"%s\"]" 9623168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin#else 9723168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin ", [/* 1 var */]" 9823168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin#endif 99b5faea4c73f5a39fcd6143ff6cf67462e0662348Dmitry V. Levin ") = -1 ENOENT (%m)\n", 100b5faea4c73f5a39fcd6143ff6cf67462e0662348Dmitry V. Levin Q_FILENAME, q_argv[2] 10168beed808a8abfcba3b7a5aeb59a194d3f916fd3Dmitry V. Levin#if VERBOSE 102b5faea4c73f5a39fcd6143ff6cf67462e0662348Dmitry V. Levin , q_envp[1] 10323168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin#endif 104b5faea4c73f5a39fcd6143ff6cf67462e0662348Dmitry V. Levin ); 10523168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin 10623168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin char **const empty = tail_alloc(sizeof(*empty)); 10784be84db7ba0e4cf0794cea9e83ec3e89148b120Dmitry V. Levin char **const efault = empty + 1; 10823168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin *empty = NULL; 10923168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin 11023168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin execve(FILENAME, empty, empty); 11123168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin printf("execve(\"%s\", []" 11268beed808a8abfcba3b7a5aeb59a194d3f916fd3Dmitry V. Levin#if VERBOSE 11323168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin ", []" 11423168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin#else 11523168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin ", [/* 0 vars */]" 11623168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin#endif 117b5faea4c73f5a39fcd6143ff6cf67462e0662348Dmitry V. Levin ") = -1 ENOENT (%m)\n", Q_FILENAME); 11823168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin 11923168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin char str_a[] = "012345678901234567890123456789012"; 12023168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin char str_b[] = "_abcdefghijklmnopqrstuvwxyz()[]{}"; 12123168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin#define DEFAULT_STRLEN ((unsigned int) sizeof(str_a) - 2) 12223168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin char **const a = tail_alloc(sizeof(*a) * (DEFAULT_STRLEN + 2)); 12323168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin char **const b = tail_alloc(sizeof(*b) * (DEFAULT_STRLEN + 2)); 12423168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin unsigned int i; 12523168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin for (i = 0; i <= DEFAULT_STRLEN; ++i) { 12623168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin a[i] = &str_a[i]; 12723168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin b[i] = &str_b[i]; 12823168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin } 12923168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin a[i] = b[i] = NULL; 13023168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin 13123168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin execve(FILENAME, a, b); 13223168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin printf("execve(\"%s\", [\"%.*s\"...", Q_FILENAME, DEFAULT_STRLEN, a[0]); 13323168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin for (i = 1; i < DEFAULT_STRLEN; ++i) 13423168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin printf(", \"%s\"", a[i]); 13568beed808a8abfcba3b7a5aeb59a194d3f916fd3Dmitry V. Levin#if VERBOSE 13623168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin printf(", \"%s\"", a[i]); 13723168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin#else 13823168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin printf(", ..."); 13923168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin#endif 14068beed808a8abfcba3b7a5aeb59a194d3f916fd3Dmitry V. Levin#if VERBOSE 14123168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin printf("], [\"%.*s\"...", DEFAULT_STRLEN, b[0]); 14223168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin for (i = 1; i <= DEFAULT_STRLEN; ++i) 14323168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin printf(", \"%s\"", b[i]); 14423168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin#else 14523168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin printf("], [/* %u vars */", DEFAULT_STRLEN + 1); 14623168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin#endif 147b5faea4c73f5a39fcd6143ff6cf67462e0662348Dmitry V. Levin printf("]) = -1 ENOENT (%m)\n"); 14823168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin 14923168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin execve(FILENAME, a + 1, b + 1); 15023168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin printf("execve(\"%s\", [\"%s\"", Q_FILENAME, a[1]); 15123168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin for (i = 2; i <= DEFAULT_STRLEN; ++i) 15223168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin printf(", \"%s\"", a[i]); 15368beed808a8abfcba3b7a5aeb59a194d3f916fd3Dmitry V. Levin#if VERBOSE 15423168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin printf("], [\"%s\"", b[1]); 15523168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin for (i = 2; i <= DEFAULT_STRLEN; ++i) 15623168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin printf(", \"%s\"", b[i]); 15723168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin#else 15823168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin printf("], [/* %d vars */", DEFAULT_STRLEN); 15923168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin#endif 160b5faea4c73f5a39fcd6143ff6cf67462e0662348Dmitry V. Levin printf("]) = -1 ENOENT (%m)\n"); 16123168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin 16223168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin execve(FILENAME, (char **) tail_argv[ARRAY_SIZE(q_argv)], efault); 163b5faea4c73f5a39fcd6143ff6cf67462e0662348Dmitry V. Levin printf("execve(\"%s\", NULL, %p) = -1 ENOENT (%m)\n", 164b5faea4c73f5a39fcd6143ff6cf67462e0662348Dmitry V. Levin Q_FILENAME, efault); 16523168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin 16623168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin execve(FILENAME, efault, NULL); 167b5faea4c73f5a39fcd6143ff6cf67462e0662348Dmitry V. Levin printf("execve(\"%s\", %p, NULL) = -1 ENOENT (%m)\n", 168b5faea4c73f5a39fcd6143ff6cf67462e0662348Dmitry V. Levin Q_FILENAME, efault); 16923168c1e545e7d8d7cbadb5fb6f5a7ddf2e6e59fDmitry V. Levin 1704ff687bb31ee2caa8b0ce54911bc61708889e272Dmitry V. Levin return 0; 1714ff687bb31ee2caa8b0ce54911bc61708889e272Dmitry V. Levin} 172