]> granicus.if.org Git - strace/commitdiff
Check that structures defined by bpf_attr.h match system union bpf_attr
authorDmitry V. Levin <ldv@altlinux.org>
Mon, 2 Apr 2018 19:10:55 +0000 (19:10 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Wed, 4 Apr 2018 12:24:19 +0000 (12:24 +0000)
* gen_bpf_attr_check.sh: New file.
* Makefile.am (EXTRA_DIST): Add it.
(strace_SOURCES_check): New variable.
(strace_SOURCES): Add $(strace_SOURCES_check).
(BUILT_SOURCES, CLEANFILES): Add bpf_attr_check.c.
(bpf_attr_check.c): New rule.
(sys_func_h_sources): New variable.
(sys_func.h): Use it instead of strace_SOURCES_c.
* .gitignore: Add /bpf_attr_check.c.

.gitignore
Makefile.am
gen_bpf_attr_check.sh [new file with mode: 0755]

index ae60036897c9b0768e2613dede55920f5d50f962..13c196d9b7a19e7df37afc20b3a479e16becf773 100644 (file)
@@ -14,6 +14,7 @@
 /ChangeLog
 /aclocal.m4
 /autom4te.cache
+/bpf_attr_check.c
 /compile
 /config.guess
 /config.h
index c22f872a67db976426ef421d6d5d206569ac6107..8926dd18be40a413ef0a1d4f48b432967598ed18 100644 (file)
@@ -344,8 +344,11 @@ strace_SOURCES =   \
        xmalloc.c       \
        xmalloc.h       \
        xstring.h       \
+       $(strace_SOURCES_check) \
        # end of strace_SOURCES
 
+strace_SOURCES_check = bpf_attr_check.c
+
 if USE_LIBUNWIND
 strace_SOURCES += unwind.c
 strace_CPPFLAGS += $(libunwind_CPPFLAGS)
@@ -392,6 +395,7 @@ EXTRA_DIST =                                \
        debian/strace64.install         \
        debian/strace64.manpages        \
        debian/watch                    \
+       gen_bpf_attr_check.sh           \
        generate_sen.sh                 \
        ioctl_iocdef.c                  \
        ioctlsort.c                     \
@@ -949,10 +953,15 @@ srpm: dist-xz
 $(srcdir)/.version:
        $(AM_V_GEN)echo $(VERSION) > $@-t && mv $@-t $@
 
+bpf_attr_check.c: $(srcdir)/bpf_attr.h $(srcdir)/gen_bpf_attr_check.sh
+       $(srcdir)/gen_bpf_attr_check.sh $< > $@-t && mv $@-t $@
+
 strace_SOURCES_c = \
        $(filter %.c,$(strace_SOURCES)) $(filter %.c,$(libstrace_a_SOURCES))
 
-sys_func.h: $(patsubst %,$(srcdir)/%,$(strace_SOURCES_c))
+sys_func_h_sources = $(filter-out $(strace_SOURCES_check),$(strace_SOURCES_c))
+
+sys_func.h: $(patsubst %,$(srcdir)/%,$(sys_func_h_sources))
        for f in $^; do \
                sed -n 's/^SYS_FUNC(.*/extern &;/p' $$f; \
        done | sort -u > $@
@@ -1025,10 +1034,12 @@ ioctls_all%.h: $(srcdir)/$(OS)/$(ARCH)/ioctls_inc%.h $(srcdir)/$(OS)/$(ARCH)/ioc
        cat $^ > $@
 
 BUILT_SOURCES = $(ioctl_redefs_h) $(ioctlent_h) \
-               native_printer_decls.h native_printer_defs.h printers.h sen.h sys_func.h .version
+               bpf_attr_check.c native_printer_decls.h native_printer_defs.h \
+               printers.h sen.h sys_func.h .version
 CLEANFILES    = $(ioctl_redefs_h) $(ioctlent_h) $(mpers_preproc_files) \
                ioctl_iocdef.h ioctl_iocdef.i \
-               native_printer_decls.h native_printer_defs.h printers.h sen.h sys_func.h
+               bpf_attr_check.c native_printer_decls.h native_printer_defs.h \
+               printers.h sen.h sys_func.h
 DISTCLEANFILES = gnu/stubs-32.h gnu/stubs-x32.h
 
 include scno.am
diff --git a/gen_bpf_attr_check.sh b/gen_bpf_attr_check.sh
new file mode 100755 (executable)
index 0000000..8c7730e
--- /dev/null
@@ -0,0 +1,65 @@
+#!/bin/sh -efu
+# Copyright (c) 2018 Dmitry V. Levin <ldv@altlinux.org>
+# 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.
+
+input="$1"
+shift
+
+cat <<EOF
+/* Generated by $0 from $input; do not edit. */
+#include "defs.h"
+#ifdef HAVE_LINUX_BPF_H
+# include <linux/bpf.h>
+# include "bpf_attr.h"
+# include "static_assert.h"
+
+# define SoM(type_, member_) (sizeof(((type_ *)0)->member_))
+EOF
+
+for struct in $(sed -n 's/^struct \(BPF_[^[:space:]]\+_struct\) .*/\1/p' < "$input"); do
+       enum="$(sed -n 's/^struct '"$struct"' \/\* \([^[:space:]]\+\) \*\/ {.*/\1/p' < "$input")"
+       ENUM="$(printf %s "$enum" |tr '[:lower:]' '[:upper:]')"
+       enum="$enum${enum:+.}"
+       ENUM="$ENUM${ENUM:+_}"
+       sed -n '/^struct '"$struct"' [^{]*{/,/^};$/p' < "$input" |
+       sed -n 's/^[[:space:]]\+[^;]*[[:space:]]\([^[:space:];]\+\);$/\1/p' |
+       while read field; do
+               FIELD="$(printf %s "$field" |tr '[:lower:]' '[:upper:]')"
+               cat <<EOF
+
+# ifdef HAVE_UNION_BPF_ATTR_$ENUM$FIELD
+       static_assert(SoM(struct $struct, $field) == SoM(union bpf_attr, $enum$field),
+                     "$struct.$field size mismatch");
+       static_assert(offsetof(struct $struct, $field) == offsetof(union bpf_attr, $enum$field),
+                     "$struct.$field offset mismatch");
+# endif /* HAVE_UNION_BPF_ATTR_$ENUM$FIELD */
+EOF
+       done
+done
+
+cat <<'EOF'
+
+#endif /* HAVE_LINUX_BPF_H */
+EOF