1#!/bin/sh
2#
3# Check syscall set parsing syntax.
4#
5# Copyright (c) 2016-2018 Dmitry V. Levin <ldv@altlinux.org>
6# Copyright (c) 2017 Nikolay Marchuk <marchuk.nikolay.a@gmail.com>
7# All rights reserved.
8#
9# Redistribution and use in source and binary forms, with or without
10# modification, are permitted provided that the following conditions
11# are met:
12# 1. Redistributions of source code must retain the above copyright
13#    notice, this list of conditions and the following disclaimer.
14# 2. Redistributions in binary form must reproduce the above copyright
15#    notice, this list of conditions and the following disclaimer in the
16#    documentation and/or other materials provided with the distribution.
17# 3. The name of the author may not be used to endorse or promote products
18#    derived from this software without specific prior written permission.
19#
20# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
31. "${srcdir=.}/syntax.sh"
32
33check_syscall()
34{
35	[ -z "$2" ] || check_e "invalid system call '$1'" -e"$2"
36
37	check_e "invalid system call '$1'" -e "$2"
38	check_e "invalid system call '$1'" -etrace="$2"
39	check_e "invalid system call '$1'" -e trace="$2"
40
41	check_e "invalid system call '$1'" -eabbrev="$2"
42	check_e "invalid system call '$1'" -e abbrev="$2"
43
44	check_e "invalid system call '$1'" -everbose="$2"
45	check_e "invalid system call '$1'" -e verbose="$2"
46
47	check_e "invalid system call '$1'" -eraw="$2"
48	check_e "invalid system call '$1'" -e raw="$2"
49
50	check_e "invalid system call '$1'" -einject="$2"
51	check_e "invalid system call '$1'" -e inject="$2"
52	check_e "invalid system call '$1'" -einject="$2:"
53	check_e "invalid system call '$1'" -einject="$2::"
54	check_e "invalid system call '$1'" -einject="$2:::"
55	check_e "invalid system call '$1'" -e inject="$2:"
56	check_e "invalid system call '$1'" -e inject="$2::"
57	check_e "invalid system call '$1'" -e inject="$2:::"
58	check_e "invalid system call '$1'" -einject="$2:when=3"
59	check_e "invalid system call '$1'" -e inject="$2:when=3"
60
61	check_e "invalid system call '$1'" -efault="$2"
62	check_e "invalid system call '$1'" -e fault="$2"
63	check_e "invalid system call '$1'" -efault="$2:"
64	check_e "invalid system call '$1'" -efault="$2::"
65	check_e "invalid system call '$1'" -efault="$2:::"
66	check_e "invalid system call '$1'" -e fault="$2:"
67	check_e "invalid system call '$1'" -e fault="$2::"
68	check_e "invalid system call '$1'" -e fault="$2:::"
69	check_e "invalid system call '$1'" -efault="$2:when=4"
70	check_e "invalid system call '$1'" -e fault="$2:when=4"
71}
72
73for arg in '' , ,, ,,, ; do
74	check_syscall "$arg" "$arg"
75	check_syscall "!$arg" "!$arg"
76done
77
78for arg in -1 -2 -3 -4 -5 \
79	   invalid_syscall_name \
80	   0x 0y \
81	   32767 \
82	   2147483647 \
83	   2147483648 \
84	   4294967295 \
85	   4294967296 \
86	   /non_syscall \
87	   % %not_a_class \
88	   ; do
89	check_syscall "$arg" "$arg"
90	check_syscall "$arg" "!$arg"
91	check_syscall "$arg" "1,$arg"
92done
93
94for arg in '!chdir' none all; do
95	check_syscall "$arg" "1,$arg"
96done
97
98# invalid syscall, multiple syscalls
99for arg in %desc \
100	   %file \
101	   %memory \
102	   %process \
103	   %network \
104	   chdir \
105	   1 \
106	   ?32767 \
107	   ?invalid \
108	   ?%not_a_class \
109	   ?/non_syscall \
110	   ; do
111	check_syscall nonsense "$arg,nonsense"
112	check_syscall nonsense "!$arg,nonsense"
113	check_syscall nonsense "nonsense,$arg"
114	check_syscall nonsense "!nonsense,$arg"
115done
116
117check_e_using_grep 'regcomp: \+id: [[:alpha:]].+' -e trace='/+id'
118check_e_using_grep 'regcomp: \*id: [[:alpha:]].+' -e trace='/*id'
119check_e_using_grep 'regcomp: \{id: [[:alpha:]].+' -e trace='/{id'
120check_e_using_grep 'regcomp: \(id: [[:alpha:]].+' -e trace='/(id'
121check_e_using_grep 'regcomp: \[id: [[:alpha:]].+' -e trace='/[id'
122