* qualify.c (qualify_syscall_regex): New function. (qualify_syscall_name): Use qualify_syscall_regex function. * tests/regex.test: Check this. * tests/Makefile.am (DECODER_TESTS): Add regex.test. --- qualify.c | 36 +++++++++++++++++++++++++++ tests/Makefile.am | 1 + tests/regex.test | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 111 insertions(+) create mode 100755 tests/regex.test
diff --git a/qualify.c b/qualify.c index 157d313..783bb4a 100644 --- a/qualify.c +++ b/qualify.c @@ -27,6 +27,7 @@ #include "defs.h" #include "nsig.h" +#include <regex.h> typedef unsigned int number_slot_t; #define BITS_PER_SLOT (sizeof(number_slot_t) * 8) @@ -258,6 +259,40 @@ qualify_syscall_class(const char *s, struct number_set *set) } static bool +qualify_syscall_regex(const char *s, struct number_set *set) +{ + int len = strlen(s); + + if(!s || s[0] != '/' || s[len - 1] != '/') + return false; + + char *copy = xstrdup(s); + copy[len - 1] = '\0'; + + regex_t preg; + if (regcomp(&preg, copy + 1, REG_EXTENDED | REG_NOSUB)) + error_msg_and_die("invalid regular expression: '%s'", copy + 1); + free(copy); + + unsigned int p; + for (p = 0; p < SUPPORTED_PERSONALITIES; ++p) { + unsigned int i; + + for (i = 0; i < nsyscall_vec[p]; ++i) { + if (!sysent_vec[p][i].sys_name + || regexec(&preg, sysent_vec[p][i].sys_name, + 0, NULL, 0)) { + continue; + } + add_number_to_set(i, &set[p]); + } + } + + regfree(&preg); + return true; +} + +static bool qualify_syscall_name(const char *s, struct number_set *set) { unsigned int p; @@ -285,6 +320,7 @@ qualify_syscall(const char *token, struct number_set *set) if (*token >= '0' && *token <= '9') return qualify_syscall_number(token, set); return qualify_syscall_class(token, set) + || qualify_syscall_regex(token, set) || qualify_syscall_name(token, set); } diff --git a/tests/Makefile.am b/tests/Makefile.am index 96dcb6e..77ac13a 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -534,6 +534,7 @@ DECODER_TESTS = \ qual_fault-exit_group.test \ read-write.test \ readv.test \ + regex.test \ sched.test \ scm_rights-fd.test \ seccomp-strict.test \ diff --git a/tests/regex.test b/tests/regex.test new file mode 100755 index 0000000..a9de742 --- /dev/null +++ b/tests/regex.test @@ -0,0 +1,74 @@ +#!/bin/sh +# +# Check -e trace=/REGEX/ option. +# +# Copyright (c) 2017 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. + +. "${srcdir=.}/init.sh" + +while read w s; do { + try_run_prog "../$s" || continue + run_strace -a$w -e/^clock/ ../$s > "$EXP" + match_diff "$LOG" "$EXP" +} < /dev/null; done << EOF +37 clock_adjtime +40 clock_nanosleep +36 clock_xettime +EOF + +# Surprised that fcntl*, futimesat, utime, utimensat, and utimes tests +# linked with musl use clock_gettime? Me too! +grep -E -v '^(#|clock_|times$|fcntl|futimesat$|utime)' \ + < "$srcdir/pure_executables.list" > negative.list + +while read s; do { + try_run_prog "../$s" || continue + run_strace -qq -esignal=none -e/^clock/ ../$s > /dev/null + match_diff "$LOG" /dev/null +} < /dev/null; done < negative.list + +while read w s; do { + try_run_prog "../$s" || continue + run_strace -a$w -e/^sched_/ ../$s > "$EXP" + match_diff "$LOG" "$EXP" +} < /dev/null; done << EOF +28 sched_xetaffinity +23 sched_xetparam +31 sched_rr_get_interval +33 sched_get_priority_mxx +29 sched_xetattr +22 sched_xetscheduler +14 sched_yield +EOF + +grep -E -v '^(#|sched_|times$)' \ + < "$srcdir/pure_executables.list" > negative.list + +while read s; do { + try_run_prog "../$s" || continue + run_strace -qq -esignal=none -e/^sched_/ ../$s > /dev/null + match_diff "$LOG" /dev/null +} < /dev/null; done < negative.list -- 2.7.4 ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Strace-devel mailing list Strace-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/strace-devel