xref: /freebsd/tools/test/stress2/misc/beneath4.sh (revision 4d846d260e2b9a3d4d0a701462568268cbfe7a5b)
18a272653SPeter Holm#!/bin/sh
28a272653SPeter Holm
38a272653SPeter Holm#
4*4d846d26SWarner Losh# SPDX-License-Identifier: BSD-2-Clause
58a272653SPeter Holm#
68a272653SPeter Holm# Copyright (c) 2021 Peter Holm <pho@FreeBSD.org>
78a272653SPeter Holm#
88a272653SPeter Holm# Redistribution and use in source and binary forms, with or without
98a272653SPeter Holm# modification, are permitted provided that the following conditions
108a272653SPeter Holm# are met:
118a272653SPeter Holm# 1. Redistributions of source code must retain the above copyright
128a272653SPeter Holm#    notice, this list of conditions and the following disclaimer.
138a272653SPeter Holm# 2. Redistributions in binary form must reproduce the above copyright
148a272653SPeter Holm#    notice, this list of conditions and the following disclaimer in the
158a272653SPeter Holm#    documentation and/or other materials provided with the distribution.
168a272653SPeter Holm#
178a272653SPeter Holm# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
188a272653SPeter Holm# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
198a272653SPeter Holm# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
208a272653SPeter Holm# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
218a272653SPeter Holm# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
228a272653SPeter Holm# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
238a272653SPeter Holm# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
248a272653SPeter Holm# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
258a272653SPeter Holm# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
268a272653SPeter Holm# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
278a272653SPeter Holm# SUCH DAMAGE.
288a272653SPeter Holm#
298a272653SPeter Holm
308a272653SPeter Holm# Test of:
318a272653SPeter Holm# AT_BENEATH              0x1000  /* Fail if not under dirfd */
328a272653SPeter Holm# AT_RESOLVE_BENEATH      0x2000  /* As AT_BENEATH, but do not allow
338a272653SPeter Holm#                                    resolve to walk out of dirfd even
348a272653SPeter Holm
358a272653SPeter Holmdir=/tmp/beneath4.dir
368a272653SPeter Holmrm -rf $dir
378a272653SPeter Holmmkdir -p $dir
388a272653SPeter Holmhere=`pwd`
398a272653SPeter Holmcd $dir
408a272653SPeter Holm
418a272653SPeter Holmcat > beneath4.c <<EOF
428a272653SPeter Holm#include <sys/stat.h>
438a272653SPeter Holm
448a272653SPeter Holm#include <err.h>
458a272653SPeter Holm#include <errno.h>
468a272653SPeter Holm#include <fcntl.h>
478a272653SPeter Holm#include <stdio.h>
488a272653SPeter Holm#include <stdlib.h>
498a272653SPeter Holm#include <string.h>
508a272653SPeter Holm#include <unistd.h>
518a272653SPeter Holm
528a272653SPeter Holmint
538a272653SPeter Holmmain(int argc, char *argv[])
548a272653SPeter Holm{
558a272653SPeter Holm	struct stat st;
568a272653SPeter Holm	int exp, fd, flag, r;
578a272653SPeter Holm	char *cwd, *dir, *obj, *s;
588a272653SPeter Holm
598a272653SPeter Holm	if (argc != 5) {
608a272653SPeter Holm		fprintf(stderr,
618a272653SPeter Holm		    "Usage: %s <dir> <test obj> <flag> <expected return>\n",
628a272653SPeter Holm		    argv[0]);
638a272653SPeter Holm		return (1);
648a272653SPeter Holm	}
658a272653SPeter Holm
668a272653SPeter Holm	cwd = getwd(NULL);
678a272653SPeter Holm	dir = argv[1];
688a272653SPeter Holm	obj = argv[2];
698a272653SPeter Holm	sscanf(argv[3], "%x", &flag);
708a272653SPeter Holm	exp = atoi(argv[4]);
718a272653SPeter Holm#if 0
72e0fd837aSPeter Holm	if ((flag & AT_RESOLVE_BENEATH) == 0) {
738a272653SPeter Holm		fprintf(stderr, "Flag must be %#x or %#x\n",
748a272653SPeter Holm		    AT_BENEATH, AT_RESOLVE_BENEATH);
758a272653SPeter Holm		return (1);
768a272653SPeter Holm	}
778a272653SPeter Holm#endif
788a272653SPeter Holm	if ((fd = open(dir, O_DIRECTORY | O_RDONLY)) == -1)
798a272653SPeter Holm		err(1, "open(%s)", dir);
808a272653SPeter Holm
818a272653SPeter Holm	if (fstatat(fd, obj, &st, flag) == -1)
828a272653SPeter Holm		r = errno;
838a272653SPeter Holm	else
848a272653SPeter Holm		r = 0;
858a272653SPeter Holm	s = "FAIL";
868a272653SPeter Holm	if (r == exp)
878a272653SPeter Holm		s = "OK";
888a272653SPeter Holm	warn("cwd=%s, top=%s. flag=%0.6x. fstatf(%s) = %2d (expect %2d). %4s",
898a272653SPeter Holm	    cwd, dir, flag, obj, r, exp, s);
908a272653SPeter Holm
918a272653SPeter Holm	return (r == exp ? 0 : errno);
928a272653SPeter Holm}
938a272653SPeter HolmEOF
948a272653SPeter Holmcc -o beneath4 -Wall -Wextra -O2 -g beneath4.c || exit 1
958a272653SPeter Holmrm beneath4.c
968a272653SPeter Holm
978a272653SPeter Holmmkdir -p /tmp/beneath4.dir/a/a
988a272653SPeter Holmtouch    /tmp/beneath4.dir/a/f
998a272653SPeter Holmln       /tmp/beneath4.dir/a/f /tmp/beneath4.dir/a/c
1008a272653SPeter Holmln -s    /tmp/beneath4.dir/a/a /tmp/beneath4.dir/a/d
1018a272653SPeter Holmln -s    /tmp/beneath4.dir/a/b /tmp/beneath4.dir/a/e
1028a272653SPeter Holmmkfifo   /tmp/beneath4.dir/a/fifo
1038a272653SPeter Holm
1048a272653SPeter Holmtop=$dir/a
1058a272653SPeter Holm
1068a272653SPeter Holmcd $here
1078a272653SPeter Holms=0
108e0fd837aSPeter Holm#ls -lR $dir
109e0fd837aSPeter Holm#echo  AT_BENEATH
110e0fd837aSPeter Holm#$dir/beneath4 $top a                         0x1000  0 || s=1
111e0fd837aSPeter Holm#$dir/beneath4 $top b                         0x1000  2 || s=1
112e0fd837aSPeter Holm#$dir/beneath4 $top c                         0x1000  0 || s=1
113e0fd837aSPeter Holm#$dir/beneath4 $top d                         0x1000  0 || s=1
114e0fd837aSPeter Holm#$dir/beneath4 $top e                         0x1000  2 || s=1
115e0fd837aSPeter Holm#$dir/beneath4 $top fifo                      0x1000  0 || s=1
116e0fd837aSPeter Holm#$dir/beneath4 $top $top/../../beneath4.d/a/a 0x1000 93 || s=1
117e0fd837aSPeter Holm#$dir/beneath4 $top $top/..                   0x1000 93 || s=1
118e0fd837aSPeter Holm#$dir/beneath4 $top ../a                      0x1000  0 || s=1
1198a272653SPeter Holm
1208a272653SPeter Holmprintf "\nAT_RESOLVE_BENEATH\n"
1218a272653SPeter Holm$dir/beneath4 $top a                         0x2000  0 || s=1
1228a272653SPeter Holm$dir/beneath4 $top b                         0x2000  2 || s=1
1238a272653SPeter Holm$dir/beneath4 $top c                         0x2000  0 || s=1
1248a272653SPeter Holm$dir/beneath4 $top d                         0x2000 93 || s=1
1258a272653SPeter Holm$dir/beneath4 $top e                         0x2000 93 || s=1
1268a272653SPeter Holm$dir/beneath4 $top fifo                      0x2000  0 || s=1
127cefb959eSPeter Holm$dir/beneath4 $top $top/../../beneath4.d/a/a 0x2000 93 || s=1
128cefb959eSPeter Holm$dir/beneath4 $top $top/..                   0x2000 93 || s=1
1298a272653SPeter Holm$dir/beneath4 $top ../a                      0x2000 93 || s=1
1308a272653SPeter Holmprintf "\nNo flag\n"
1318a272653SPeter Holm$dir/beneath4 $top ../a                      0x0000  0 || s=1
1328a272653SPeter Holmrm -rf $top
1338a272653SPeter Holmexit $s
134