Home | History | Annotate | Download | only in tests
      1 /*
      2  * Test printpath/umovestr.
      3  *
      4  * Copyright (c) 2015-2017 Dmitry V. Levin <ldv (at) altlinux.org>
      5  * Copyright (c) 2017-2018 The strace developers.
      6  * All rights reserved.
      7  *
      8  * Redistribution and use in source and binary forms, with or without
      9  * modification, are permitted provided that the following conditions
     10  * are met:
     11  * 1. Redistributions of source code must retain the above copyright
     12  *    notice, this list of conditions and the following disclaimer.
     13  * 2. Redistributions in binary form must reproduce the above copyright
     14  *    notice, this list of conditions and the following disclaimer in the
     15  *    documentation and/or other materials provided with the distribution.
     16  * 3. The name of the author may not be used to endorse or promote products
     17  *    derived from this software without specific prior written permission.
     18  *
     19  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     20  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     21  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     22  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     23  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     24  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     28  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     29  */
     30 
     31 #include "tests.h"
     32 
     33 #include <limits.h>
     34 #include <stdio.h>
     35 #include <string.h>
     36 #include <unistd.h>
     37 
     38 #include "test_ucopy.h"
     39 
     40 static void
     41 test_printpath_at(char *const p, const unsigned int test_max)
     42 {
     43 	/*
     44 	 *       /
     45 	 *      /.
     46 	 *     /..
     47 	 *    /...
     48 	 *   /../.
     49 	 *  /../..
     50 	 * /../../
     51 	 */
     52 
     53 	char *const eop = p + (test_max - 1);
     54 	*eop = '\0';
     55 	unsigned int i;
     56 	for (i = 1; i < test_max; ++i) {
     57 		const unsigned int i_1 = i - 1;
     58 		memmove(eop - i, eop - i_1, i_1);
     59 		eop[-1] = "/.."[i_1 % 3];
     60 		if (chdir(eop - i))
     61 			perror_msg_and_fail("chdir");
     62 		printf("chdir(\"%s\") = 0\n", eop - i);
     63 	}
     64 }
     65 
     66 static void
     67 test_efault(const unsigned int test_max)
     68 {
     69 	char *p = tail_alloc(test_max);
     70 	const char *const efault = p + test_max;
     71 	memset(p, '/', test_max);
     72 
     73 	for (; p <= efault; ++p) {
     74 		if (p <= efault - PATH_MAX)
     75 			continue;
     76 		printf("chdir(%p) = %s\n", p, sprintrc(chdir(p)));
     77 	}
     78 }
     79 
     80 static void
     81 test_enametoolong(void)
     82 {
     83 	char *p = tail_alloc(PATH_MAX);
     84 	memset(p, '/', PATH_MAX);
     85 
     86 	printf("chdir(\"%.*s\"...) = %s\n",
     87 	       PATH_MAX - 1, p, sprintrc(chdir(p)));
     88 }
     89 
     90 void
     91 test_printpath(const unsigned int test_max)
     92 {
     93 	/*
     94 	 * /../..|
     95 	 * /../.|.
     96 	 * /../|..
     97 	 * /..|/..
     98 	 * /.|./..
     99 	 * /|../..
    100 	 * |/../..
    101 	 */
    102 	const unsigned int page_size = get_page_size();
    103 	char *p = tail_alloc(test_max + page_size);
    104 	unsigned int i;
    105 	for (i = 1; i < sizeof(long); ++i)
    106 		test_printpath_at(p + i, test_max);
    107 	for (i = 0; i < sizeof(long); ++i)
    108 		test_printpath_at(p + page_size - i, test_max);
    109 	test_efault(test_max);
    110 	test_enametoolong();
    111 }
    112