>Synopsis: unsafe macro in tcpdump/print-ike.c and /etc/tcpdump.conf
>Category: user
>Environment:
System : OpenBSD 7.2
Details : OpenBSD 7.2 (GENERIC.MP) #2: Thu Nov 24 23:53:03 MST 2022
[email protected]:/usr/src/sys/arch/arm64/compile/GENERIC.MP
Architecture: OpenBSD.arm64
Machine : arm64
>Description:
The macro TCHECK() is undef'ed in print-ike.c and a worse macro that
didn't see repeated fixes is added. I saw this while "fixing" tcpdump with
policies on what can print and what can't. I'm gonna dump a big patch on
you guys for review, it adds a /etc/tcpdump.conf with yacc parsing (taken from
a modified lpd(8)), the -Y: flag allows someone to specify a different policy
other than "default" which is defined to be rudamentary ether,llc,arp,ip/ip6
and udp/tcp/domain. Someone who has to do work specifically for other
protocols would need to add those themselves either to the default or a new
policy. Check it out, I think it was worth doing, and it's sorta a passlist
or pledge for protocols in tcpdump.
The policy names are from print-NAME.c in tcpdump so this will also get people
to familiarize themselves with the way tcpdump works.
>How-To-Repeat:
Code reading/frustrations.
>Fix:
Index: Makefile
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/Makefile,v
retrieving revision 1.67
diff -u -p -u -r1.67 Makefile
--- Makefile 4 Dec 2020 11:36:13 -0000 1.67
+++ Makefile 7 Mar 2023 06:47:37 -0000
@@ -50,7 +50,7 @@ SRCS= tcpdump.c addrtoname.c privsep.c p
print-pfsync.c pf_print_state.c print-ofp.c ofp_map.c \
print-udpencap.c print-carp.c print-nhrp.c print-wg.c \
print-802_11.c print-iapp.c print-mpls.c print-slow.c print-usbpcap.c \
- gmt2local.c savestr.c setsignal.c in_cksum.c
+ gmt2local.c savestr.c setsignal.c in_cksum.c parse.y
# TCP OS Fingerprinting
.PATH: ${.CURDIR}/../../sys/net
Index: parse.y
===================================================================
RCS file: parse.y
diff -N parse.y
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ parse.y 7 Mar 2023 06:47:38 -0000
@@ -0,0 +1,1248 @@
+/* $OpenBSD$ */
+
+/*
+ * Copyright (c) 2008 Gilles Chehade <[email protected]>
+ * Copyright (c) 2008 Pierre-Yves Ritschard <[email protected]>
+ * Copyright (c) 2002, 2003, 2004 Henning Brauer <[email protected]>
+ * Copyright (c) 2001 Markus Friedl. All rights reserved.
+ * Copyright (c) 2001 Daniel Hartmeier. All rights reserved.
+ * Copyright (c) 2001 Theo de Raadt. All rights reserved.
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+%{
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/stat.h>
+#include <sys/queue.h>
+
+#include <ctype.h>
+#include <err.h>
+#include <errno.h>
+#include <inttypes.h>
+#include <limits.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+
+TAILQ_HEAD(files, file) files = TAILQ_HEAD_INITIALIZER(files);
+static struct file {
+ TAILQ_ENTRY(file) entry;
+ FILE *stream;
+ char *name;
+ int lineno;
+ int errors;
+} *file, *topfile;
+
+struct tcpdump_conf * tcpd_parse_config(int);
+struct file *pushfile(int);
+int popfile(void);
+int check_file_secrecy(int, const char *);
+int yyparse(void);
+int yylex(void);
+int kw_cmp(const void *, const void *);
+int lookup(char *);
+int lgetc(int);
+int lungetc(int);
+int findeol(void);
+int yyerror(const char *, ...)
+ __attribute__((__format__ (printf, 1, 2)))
+ __attribute__((__nonnull__ (1)));
+
+int check_policy(char *filename);
+
+TAILQ_HEAD(symhead, sym) symhead = TAILQ_HEAD_INITIALIZER(symhead);
+struct sym {
+ TAILQ_ENTRY(sym) entry;
+ int used;
+ int persist;
+ char *nam;
+ char *val;
+};
+int symset(const char *, const char *, int);
+char *symget(const char *);
+
+static int errors = 0;
+
+extern char *policyname;
+extern int priv_open_conf(void);
+
+struct policy {
+ TAILQ_ENTRY(policy) entry;
+ char *filename;
+};
+
+struct tcpdump_conf {
+ TAILQ_HEAD(, policy) policies;
+};
+
+struct tcpdump_conf *conf = NULL;
+
+struct printer_opts {
+ uint8_t po_ieee80211;
+ uint8_t po_arp;
+ uint8_t po_atalk;
+ uint8_t po_atm;
+ uint8_t po_bgp;
+ uint8_t po_bootp;
+ uint8_t po_carp;
+ uint8_t po_cdp;
+ uint8_t po_cnfp;
+ uint8_t po_decnet;
+ uint8_t po_dhcp6;
+ uint8_t po_domain;
+ uint8_t po_dvmrp;
+ uint8_t po_enc;
+ uint8_t po_ether;
+ uint8_t po_etherip;
+ uint8_t po_fddi;
+ uint8_t po_frag6;
+ uint8_t po_gre;
+ uint8_t po_gtp;
+ uint8_t po_hsrp;
+ uint8_t po_iapp;
+ uint8_t po_icmp;
+ uint8_t po_icmp6;
+ uint8_t po_igrp;
+ uint8_t po_ike;
+ uint8_t po_ip;
+ uint8_t po_ip6;
+ uint8_t po_ip6opts;
+ uint8_t po_ipsec;
+ uint8_t po_ipx;
+ uint8_t po_isoclns;
+ uint8_t po_krb;
+ uint8_t po_l2tp;
+ uint8_t po_llc;
+ uint8_t po_lldp;
+ uint8_t po_lwres;
+ uint8_t po_mobile;
+ uint8_t po_mpls;
+ uint8_t po_netbios;
+ uint8_t po_nfs;
+ uint8_t po_nhrp;
+ uint8_t po_nsh;
+ uint8_t po_ntp;
+ uint8_t po_null;
+ uint8_t po_ofp;
+ uint8_t po_ospf;
+ uint8_t po_ospf6;
+ uint8_t po_pflog;
+ uint8_t po_pfsync;
+ uint8_t po_pim;
+ uint8_t po_ppp;
+ uint8_t po_radius;
+ uint8_t po_raw;
+ uint8_t po_rip;
+ uint8_t po_ripng;
+ uint8_t po_rt6;
+ uint8_t po_sl;
+ uint8_t po_slow;
+ uint8_t po_smb;
+ uint8_t po_snmp;
+ uint8_t po_stp;
+ uint8_t po_sunrpc;
+ uint8_t po_tcp;
+ uint8_t po_tftp;
+ uint8_t po_timed;
+ uint8_t po_udp;
+ uint8_t po_udpencap;
+ uint8_t po_usbpcap;
+ uint8_t po_vqp;
+ uint8_t po_vrrp;
+ uint8_t po_wb;
+ uint8_t po_wg;
+} printer_opts;
+
+static void add_policy(struct printer_opts *);
+static void add_policy2(char *);
+static void config_free(struct tcpdump_conf *);
+static void config_policy(struct policy *);
+
+typedef struct {
+ union {
+ int64_t number;
+ char *string;
+ struct host *host;
+ struct printer_opts printer_opts;
+ } v;
+ int lineno;
+} YYSTYPE;
+
+%}
+
+%token ERROR ARROW LBRACE RBRACE
+%token POLICY COMMA
+%token TOK_802_11 TOK_ARP TOK_ATALK TOK_ATM TOK_BGP TOK_BOOTP
+%token TOK_CARP TOK_CDP TOK_CNFP TOK_DECNET TOK_DHCP6 TOK_DOMAIN
+%token TOK_DVMRP TOK_ENC TOK_ETHER TOK_ETHERIP TOK_FDDI TOK_FRAG6
+%token TOK_GRE TOK_GTP TOK_HSRP TOK_IAPP TOK_ICMP TOK_ICMP6 TOK_IGRP
+%token TOK_IKE TOK_IP TOK_IP6 TOK_IP6OPTS TOK_IPSEC TOK_IPX TOK_ISOCLNS
+%token TOK_KRB TOK_L2TP TOK_LLC TOK_LLDP TOK_LWRES TOK_MOBILE TOK_MPLS
+%token TOK_NETBIOS TOK_NFS TOK_NHRP TOK_NSH TOK_NTP TOK_NULL TOK_OFP
+%token TOK_OSPF TOK_OSPF6 TOK_PFLOG TOK_PFSYNC TOK_PIM TOK_PPP TOK_RADIUS
+%token TOK_RAW TOK_RIP TOK_RIPNG TOK_RT6 TOK_SL TOK_SLOW TOK_SMB TOK_SNMP
+%token TOK_STP TOK_SUNRPC TOK_TCP TOK_TFTP TOK_TIMED TOK_UDP TOK_UDPENCAP
+%token TOK_USBPCAP TOK_VQP TOK_VRRP TOK_WB TOK_WG
+
+%token <v.string> STRING
+%token <v.number> NUMBER
+
+%type <v.printer_opts> printer_opts printer_opt printers_l
+
+%%
+
+grammar : /* empty */
+ | grammar '\n'
+ | grammar varset '\n'
+ | grammar main '\n'
+ | grammar error '\n' { file->errors++; }
+ ;
+
+varset : STRING '=' STRING {
+ char *s = $1;
+ while (*s++) {
+ if (isspace((unsigned char)*s)) {
+ yyerror("macro name cannot contain "
+ "whitespace");
+ free($1);
+ free($3);
+ YYERROR;
+ }
+ }
+ if (symset($1, $3, 0) == -1) {
+ fprintf(stderr, "cannot store variable\n");
+ exit(1);
+ }
+ free($1);
+ free($3);
+ }
+ ;
+
+printer_opts : { bzero(&printer_opts, sizeof(printer_opts)); }
+ printers_l
+ { $$ = printer_opts; }
+ ;
+
+printers_l : printers_l COMMA printer_opt
+ | printer_opt
+ ;
+
+printer_opt :TOK_ARP {
+ printer_opts.po_arp = 1;
+ }
+ |TOK_ATALK {
+ printer_opts.po_atalk = 1;
+ }
+ |TOK_ATM {
+ printer_opts.po_atm = 1;
+ }
+ |TOK_BGP {
+ printer_opts.po_bgp = 1;
+ }
+ |TOK_BOOTP {
+ printer_opts.po_bootp = 1;
+ }
+ |TOK_CARP {
+ printer_opts.po_carp = 1;
+ }
+ |TOK_CDP {
+ printer_opts.po_cdp = 1;
+ }
+ |TOK_CNFP {
+ printer_opts.po_cnfp = 1;
+ }
+ |TOK_DECNET {
+ printer_opts.po_decnet = 1;
+ }
+ |TOK_DHCP6 {
+ printer_opts.po_dhcp6 = 1;
+ }
+ |TOK_DOMAIN {
+ printer_opts.po_domain = 1;
+ }
+ |TOK_DVMRP {
+ printer_opts.po_dvmrp = 1;
+ }
+ |TOK_ENC {
+ printer_opts.po_enc = 1;
+ }
+ |TOK_ETHER {
+ printer_opts.po_ether = 1;
+ }
+ |TOK_ETHERIP {
+ printer_opts.po_etherip = 1;
+ }
+ |TOK_FDDI {
+ printer_opts.po_fddi = 1;
+ }
+ |TOK_FRAG6 {
+ printer_opts.po_frag6 = 1;
+ }
+ |TOK_GRE {
+ printer_opts.po_gre = 1;
+ }
+ |TOK_GTP {
+ printer_opts.po_gtp = 1;
+ }
+ |TOK_HSRP {
+ printer_opts.po_hsrp = 1;
+ }
+ |TOK_IAPP {
+ printer_opts.po_iapp = 1;
+ }
+ |TOK_ICMP {
+ printer_opts.po_icmp = 1;
+ }
+ |TOK_ICMP6 {
+ printer_opts.po_icmp6 = 1;
+ }
+ |TOK_IGRP {
+ printer_opts.po_igrp = 1;
+ }
+ |TOK_IKE {
+ printer_opts.po_ike = 1;
+ }
+ |TOK_IP {
+ printer_opts.po_ip = 1;
+ }
+ |TOK_IP6 {
+ printer_opts.po_ip6 = 1;
+ }
+ |TOK_IP6OPTS {
+ printer_opts.po_ip6opts = 1;
+ }
+ |TOK_IPSEC {
+ printer_opts.po_ipsec = 1;
+ }
+ |TOK_IPX {
+ printer_opts.po_ipx = 1;
+ }
+ |TOK_ISOCLNS {
+ printer_opts.po_isoclns = 1;
+ }
+ |TOK_KRB {
+ printer_opts.po_krb = 1;
+ }
+ |TOK_L2TP {
+ printer_opts.po_l2tp = 1;
+ }
+ |TOK_LLC {
+ printer_opts.po_llc = 1;
+ }
+ |TOK_LLDP {
+ printer_opts.po_lldp = 1;
+ }
+ |TOK_LWRES {
+ printer_opts.po_lwres = 1;
+ }
+ |TOK_MOBILE {
+ printer_opts.po_mobile = 1;
+ }
+ |TOK_MPLS {
+ printer_opts.po_mpls = 1;
+ }
+ |TOK_NETBIOS {
+ printer_opts.po_netbios = 1;
+ }
+ |TOK_NFS {
+ printer_opts.po_nfs = 1;
+ }
+ |TOK_NHRP {
+ printer_opts.po_nhrp = 1;
+ }
+ |TOK_NSH {
+ printer_opts.po_nsh = 1;
+ }
+ |TOK_NTP {
+ printer_opts.po_ntp = 1;
+ }
+ |TOK_NULL {
+ printer_opts.po_null = 1;
+ }
+ |TOK_OFP {
+ printer_opts.po_ofp = 1;
+ }
+ |TOK_OSPF {
+ printer_opts.po_ospf = 1;
+ }
+ |TOK_OSPF6 {
+ printer_opts.po_ospf6 = 1;
+ }
+ |TOK_PFLOG {
+ printer_opts.po_pflog = 1;
+ }
+ |TOK_PFSYNC {
+ printer_opts.po_pfsync = 1;
+ }
+ |TOK_PIM {
+ printer_opts.po_pim = 1;
+ }
+ |TOK_PPP {
+ printer_opts.po_ppp = 1;
+ }
+ |TOK_RADIUS {
+ printer_opts.po_radius = 1;
+ }
+ |TOK_RAW {
+ printer_opts.po_raw = 1;
+ }
+ |TOK_RIP {
+ printer_opts.po_rip = 1;
+ }
+ |TOK_RIPNG {
+ printer_opts.po_ripng = 1;
+ }
+ |TOK_RT6 {
+ printer_opts.po_rt6 = 1;
+ }
+ |TOK_SL {
+ printer_opts.po_sl = 1;
+ }
+ |TOK_SLOW {
+ printer_opts.po_slow = 1;
+ }
+ |TOK_SMB {
+ printer_opts.po_smb = 1;
+ }
+ |TOK_SNMP {
+ printer_opts.po_snmp = 1;
+ }
+ |TOK_STP {
+ printer_opts.po_stp = 1;
+ }
+ |TOK_SUNRPC {
+ printer_opts.po_sunrpc = 1;
+ }
+ |TOK_TCP {
+ printer_opts.po_tcp = 1;
+ }
+ |TOK_TFTP {
+ printer_opts.po_tftp = 1;
+ }
+ |TOK_TIMED {
+ printer_opts.po_timed = 1;
+ }
+ |TOK_UDP {
+ printer_opts.po_udp = 1;
+ }
+ |TOK_UDPENCAP {
+ printer_opts.po_udpencap = 1;
+ }
+ |TOK_USBPCAP {
+ printer_opts.po_usbpcap = 1;
+ }
+ |TOK_VQP {
+ printer_opts.po_vqp = 1;
+ }
+ |TOK_VRRP {
+ printer_opts.po_vrrp = 1;
+ }
+ |TOK_WB {
+ printer_opts.po_wb = 1;
+ }
+ |TOK_WG {
+ printer_opts.po_wg = 1;
+ }
+ ;
+
+main : POLICY STRING LBRACE printer_opts RBRACE
+ {
+ if (strcmp(policyname, $2) == 0) {
+ add_policy(&$4);
+ }
+
+ free($2);
+ }
+ ;
+%%
+
+struct keywords {
+ const char *k_name;
+ int k_val;
+};
+
+int
+yyerror(const char *fmt, ...)
+{
+ va_list ap;
+ char *msg;
+
+ file->errors++;
+ va_start(ap, fmt);
+ if (vasprintf(&msg, fmt, ap) == -1) {
+ fprintf(stderr, "yyerror vasprintf\n");
+ exit(1);
+ }
+ va_end(ap);
+ fprintf(stderr, "%s:%d: %s\n", file->name, yylval.lineno, msg);
+ free(msg);
+ return (0);
+}
+
+int
+kw_cmp(const void *k, const void *e)
+{
+ return (strcmp(k, ((const struct keywords *)e)->k_name));
+}
+
+int
+lookup(char *s)
+{
+ /* this has to be sorted always */
+ static const struct keywords keywords[] = {
+ {"802_11", TOK_802_11 },
+ {"arp", TOK_ARP },
+ {"atalk", TOK_ATALK },
+ {"atm", TOK_ATM },
+ {"bgp", TOK_BGP },
+ {"bootp", TOK_BOOTP },
+ {"carp", TOK_CARP },
+ {"cdp", TOK_CDP },
+ {"cnfp", TOK_CNFP },
+ {"decnet", TOK_DECNET },
+ {"dhcp6", TOK_DHCP6 },
+ {"domain", TOK_DOMAIN },
+ {"dvmrp", TOK_DVMRP },
+ {"enc", TOK_ENC },
+ {"ether", TOK_ETHER },
+ {"etherip", TOK_ETHERIP },
+ {"fddi", TOK_FDDI },
+ {"frag6", TOK_FRAG6 },
+ {"gre", TOK_GRE },
+ {"gtp", TOK_GTP },
+ {"hsrp", TOK_HSRP },
+ {"iapp", TOK_IAPP },
+ {"icmp", TOK_ICMP },
+ {"icmp6", TOK_ICMP6 },
+ {"igrp", TOK_IGRP },
+ {"ike", TOK_IKE },
+ {"ip", TOK_IP },
+ {"ip6", TOK_IP6 },
+ {"ip6opts", TOK_IP6OPTS },
+ {"ipsec", TOK_IPSEC },
+ {"ipx", TOK_IPX },
+ {"isoclns", TOK_ISOCLNS },
+ {"krb", TOK_KRB },
+ {"l2tp", TOK_L2TP },
+ {"llc", TOK_LLC },
+ {"lldp", TOK_LLDP },
+ {"lwres", TOK_LWRES },
+ {"mobile", TOK_MOBILE },
+ {"mpls", TOK_MPLS },
+ {"netbios", TOK_NETBIOS },
+ {"nfs", TOK_NFS },
+ {"nhrp", TOK_NHRP },
+ {"nsh", TOK_NSH },
+ {"ntp", TOK_NTP },
+ {"null", TOK_NULL },
+ {"ofp", TOK_OFP },
+ {"ospf", TOK_OSPF },
+ {"ospf6", TOK_OSPF6 },
+ {"pflog", TOK_PFLOG },
+ {"pfsync", TOK_PFSYNC },
+ {"pim", TOK_PIM },
+ {"policy", POLICY },
+ {"ppp", TOK_PPP },
+ {"radius", TOK_RADIUS },
+ {"raw", TOK_RAW },
+ {"rip", TOK_RIP },
+ {"ripng", TOK_RIPNG },
+ {"rt6", TOK_RT6 },
+ {"sl", TOK_SL },
+ {"slow", TOK_SLOW },
+ {"smb", TOK_SMB },
+ {"snmp", TOK_SNMP },
+ {"stp", TOK_STP },
+ {"sunrpc", TOK_SUNRPC },
+ {"tcp", TOK_TCP },
+ {"tftp", TOK_TFTP },
+ {"timed", TOK_TIMED },
+ {"udp", TOK_UDP },
+ {"udpencap", TOK_UDPENCAP },
+ {"usbpcap", TOK_USBPCAP },
+ {"vqp", TOK_VQP },
+ {"vrrp", TOK_VRRP },
+ {"wb", TOK_WB },
+ {"wg", TOK_WG }
+ };
+ const struct keywords *p;
+
+ p = bsearch(s, keywords, sizeof(keywords)/sizeof(keywords[0]),
+ sizeof(keywords[0]), kw_cmp);
+
+ if (p)
+ return (p->k_val);
+ else
+ return (STRING);
+}
+
+#define MAXPUSHBACK 128
+
+char *parsebuf;
+int parseindex;
+char pushback_buffer[MAXPUSHBACK];
+int pushback_index = 0;
+
+int
+lgetc(int quotec)
+{
+ int c, next;
+
+ if (parsebuf) {
+ /* Read character from the parsebuffer instead of input. */
+ if (parseindex >= 0) {
+ c = (unsigned char)parsebuf[parseindex++];
+ if (c != '\0')
+ return (c);
+ parsebuf = NULL;
+ } else
+ parseindex++;
+ }
+
+ if (pushback_index)
+ return ((unsigned char)pushback_buffer[--pushback_index]);
+
+ if (quotec) {
+ if ((c = getc(file->stream)) == EOF) {
+ yyerror("reached end of file while parsing "
+ "quoted string");
+ if (file == topfile || popfile() == EOF)
+ return (EOF);
+ return (quotec);
+ }
+ return (c);
+ }
+
+ while ((c = getc(file->stream)) == '\\') {
+ next = getc(file->stream);
+ if (next != '\n') {
+ c = next;
+ break;
+ }
+ yylval.lineno = file->lineno;
+ file->lineno++;
+ }
+
+ while (c == EOF) {
+ if (file == topfile || popfile() == EOF)
+ return (EOF);
+ c = getc(file->stream);
+ }
+ return (c);
+}
+
+int
+lungetc(int c)
+{
+ if (c == EOF)
+ return (EOF);
+ if (parsebuf) {
+ parseindex--;
+ if (parseindex >= 0)
+ return (c);
+ }
+ if (pushback_index + 1 >= MAXPUSHBACK)
+ return (EOF);
+ pushback_buffer[pushback_index++] = c;
+ return (c);
+}
+
+int
+findeol(void)
+{
+ int c;
+
+ parsebuf = NULL;
+ pushback_index = 0;
+
+ /* skip to either EOF or the first real EOL */
+ while (1) {
+ c = lgetc(0);
+ if (c == '\n') {
+ file->lineno++;
+ break;
+ }
+ if (c == EOF)
+ break;
+ }
+ return (ERROR);
+}
+
+int
+yylex(void)
+{
+ char buf[8096];
+ char *p, *val;
+ int quotec, next, c;
+ int token;
+
+top:
+ p = buf;
+ while ((c = lgetc(0)) == ' ' || c == '\t')
+ ; /* nothing */
+
+ yylval.lineno = file->lineno;
+ if (c == '#')
+ while ((c = lgetc(0)) != '\n' && c != EOF)
+ ; /* nothing */
+ if (c == '{')
+ return (LBRACE);
+
+ if (c == '}')
+ return (RBRACE);
+
+ if (c == ',')
+ return (COMMA);
+
+ if (c == '$' && parsebuf == NULL) {
+ while (1) {
+ if ((c = lgetc(0)) == EOF)
+ return (0);
+
+ if (p + 1 >= buf + sizeof(buf) - 1) {
+ yyerror("string too long");
+ return (findeol());
+ }
+ if (isalnum(c) || c == '_') {
+ *p++ = c;
+ continue;
+ }
+ *p = '\0';
+ lungetc(c);
+ break;
+ }
+ val = symget(buf);
+ if (val == NULL) {
+ yyerror("macro '%s' not defined", buf);
+ return (findeol());
+ }
+ parsebuf = val;
+ parseindex = 0;
+ goto top;
+ }
+
+ switch (c) {
+ case '\'':
+ case '"':
+ quotec = c;
+ while (1) {
+ if ((c = lgetc(quotec)) == EOF)
+ return (0);
+ if (c == '\n') {
+ file->lineno++;
+ continue;
+ } else if (c == '\\') {
+ if ((next = lgetc(quotec)) == EOF)
+ return (0);
+ if (next == quotec || next == ' ' ||
+ next == '\t')
+ c = next;
+ else if (next == '\n') {
+ file->lineno++;
+ continue;
+ } else
+ lungetc(next);
+ } else if (c == quotec) {
+ *p = '\0';
+ break;
+ } else if (c == '\0') {
+ yyerror("syntax error");
+ return (findeol());
+ }
+ if (p + 1 >= buf + sizeof(buf) - 1) {
+ yyerror("string too long");
+ return (findeol());
+ }
+ *p++ = c;
+ }
+ yylval.v.string = strdup(buf);
+ if (yylval.v.string == NULL)
+ err(1, "%s", __func__);
+ return (STRING);
+ }
+
+#define allowed_to_end_number(x) \
+ (isspace(x) || x == ')' || x ==',' || x == '/' || x == '}' || x == '=')
+
+ if (c == '-' || isdigit(c)) {
+ do {
+ *p++ = c;
+ if ((size_t)(p-buf) >= sizeof(buf)) {
+ yyerror("string too long");
+ return (findeol());
+ }
+ } while ((c = lgetc(0)) != EOF && isdigit(c));
+ lungetc(c);
+ if (p == buf + 1 && buf[0] == '-')
+ goto nodigits;
+ if (c == EOF || allowed_to_end_number(c)) {
+ const char *errstr = NULL;
+
+ *p = '\0';
+ yylval.v.number = strtonum(buf, LLONG_MIN,
+ LLONG_MAX, &errstr);
+ if (errstr) {
+ yyerror("\"%s\" invalid number: %s",
+ buf, errstr);
+ return (findeol());
+ }
+ return (NUMBER);
+ } else {
+nodigits:
+ while (p > buf + 1)
+ lungetc((unsigned char)*--p);
+ c = (unsigned char)*--p;
+ if (c == '-')
+ return (c);
+ }
+ }
+
+ if (c == '=') {
+ if ((c = lgetc(0)) != EOF && c == '>')
+ return (ARROW);
+ lungetc(c);
+ c = '=';
+ }
+
+#define allowed_in_string(x) \
+ (isalnum(x) || (ispunct(x) && x != '(' && x != ')' && \
+ x != '{' && x != '}' && x != '<' && x != '>' && \
+ x != '!' && x != '=' && x != '#' && \
+ x != ','))
+
+ if (isalnum(c) || c == ':' || c == '_') {
+ do {
+ *p++ = c;
+ if ((size_t)(p-buf) >= sizeof(buf)) {
+ yyerror("string too long");
+ return (findeol());
+ }
+ } while ((c = lgetc(0)) != EOF && (allowed_in_string(c)));
+ lungetc(c);
+ *p = '\0';
+ if ((token = lookup(buf)) == STRING)
+ if ((yylval.v.string = strdup(buf)) == NULL)
+ err(1, "%s", __func__);
+ return (token);
+ }
+ if (c == '\n') {
+ yylval.lineno = file->lineno;
+ file->lineno++;
+ }
+
+ if (c == EOF)
+ return (0);
+ return (c);
+}
+
+int
+check_file_secrecy(int fd, const char *fname)
+{
+ struct stat st;
+
+ if (fstat(fd, &st)) {
+ fprintf(stderr, "warn: cannot stat %s\n", fname);
+ return (-1);
+ }
+ if (st.st_uid != 0 && st.st_uid != getuid()) {
+ fprintf(stderr, "warn: %s: owner not root or current user\n",
fname);
+ return (-1);
+ }
+ if (st.st_mode & (S_IWGRP | S_IXGRP | S_IRWXO)) {
+ fprintf(stderr, "warn: %s: group/world readable/writeable\n",
fname);
+ return (-1);
+ }
+ return (0);
+}
+
+struct file *
+pushfile(int secret)
+{
+ int fd;
+ struct file *nfile;
+
+ if ((nfile = calloc(1, sizeof(struct file))) == NULL) {
+ fprintf(stderr, "%s\n", __func__);
+ return (NULL);
+ }
+ if ((nfile->name = strdup("/etc/tcpdump.conf")) == NULL) {
+ fprintf(stderr, "%s\n", __func__);
+ free(nfile);
+ return (NULL);
+ }
+ if ((fd = priv_open_conf()) == -1) {
+ fprintf(stderr, "%s: %s\n", __func__, nfile->name);
+ free(nfile->name);
+ free(nfile);
+ return (NULL);
+ }
+
+ if ((nfile->stream = fdopen(fd, "r")) == NULL) {
+ fprintf(stderr, "%s: %s\n", __func__, nfile->name);
+ free(nfile->name);
+ free(nfile);
+ return (NULL);
+ }
+
+ if (secret && check_file_secrecy(fd, nfile->name)) {
+ fclose(nfile->stream);
+ free(nfile->name);
+ free(nfile);
+ return (NULL);
+ }
+ nfile->lineno = 1;
+ TAILQ_INSERT_TAIL(&files, nfile, entry);
+ return (nfile);
+}
+
+int
+popfile(void)
+{
+ struct file *prev;
+
+ if ((prev = TAILQ_PREV(file, files, entry)) != NULL)
+ prev->errors += file->errors;
+
+ TAILQ_REMOVE(&files, file, entry);
+ fclose(file->stream);
+ free(file->name);
+ free(file);
+ file = prev;
+ return (file ? 0 : EOF);
+}
+
+struct tcpdump_conf *
+tcpd_parse_config(int verbose)
+{
+ struct sym *sym, *next;
+
+ conf = calloc(1, sizeof(*conf));
+ if (conf == NULL)
+ return NULL;
+
+ TAILQ_INIT(&conf->policies);
+
+ errors = 0;
+
+ if ((file = pushfile(0)) == NULL) {
+ config_free(conf);
+ return NULL;
+ }
+ topfile = file;
+
+ /*
+ * parse configuration
+ */
+ yyparse();
+ errors = file->errors;
+ popfile();
+
+ /* Free macros and check which have not been used. */
+ TAILQ_FOREACH_SAFE(sym, &symhead, entry, next) {
+ if ((verbose) && !sym->used)
+ fprintf(stderr, "warning: macro '%s' not used\n",
sym->nam);
+ if (!sym->persist) {
+ free(sym->nam);
+ free(sym->val);
+ TAILQ_REMOVE(&symhead, sym, entry);
+ free(sym);
+ }
+ }
+
+ //fclose(file->stream); /* close tcpdump.conf */
+
+ if (errors) {
+ config_free(conf);
+ return NULL;
+ }
+
+
+ return conf;
+}
+
+int
+symset(const char *nam, const char *val, int persist)
+{
+ struct sym *sym;
+
+ TAILQ_FOREACH(sym, &symhead, entry) {
+ if (strcmp(nam, sym->nam) == 0)
+ break;
+ }
+
+ if (sym != NULL) {
+ if (sym->persist == 1)
+ return (0);
+ else {
+ free(sym->nam);
+ free(sym->val);
+ TAILQ_REMOVE(&symhead, sym, entry);
+ free(sym);
+ }
+ }
+ if ((sym = calloc(1, sizeof(*sym))) == NULL)
+ return (-1);
+
+ sym->nam = strdup(nam);
+ if (sym->nam == NULL) {
+ free(sym);
+ return (-1);
+ }
+ sym->val = strdup(val);
+ if (sym->val == NULL) {
+ free(sym->nam);
+ free(sym);
+ return (-1);
+ }
+ sym->used = 0;
+ sym->persist = persist;
+ TAILQ_INSERT_TAIL(&symhead, sym, entry);
+ return (0);
+}
+
+int
+cmdline_symset(char *s)
+{
+ char *sym, *val;
+ int ret;
+
+ if ((val = strrchr(s, '=')) == NULL)
+ return (-1);
+ sym = strndup(s, val - s);
+ if (sym == NULL)
+ errx(1, "%s: strndup", __func__);
+ ret = symset(sym, val + 1, 1);
+ free(sym);
+
+ return (ret);
+}
+
+char *
+symget(const char *nam)
+{
+ struct sym *sym;
+
+ TAILQ_FOREACH(sym, &symhead, entry) {
+ if (strcmp(nam, sym->nam) == 0) {
+ sym->used = 1;
+ return (sym->val);
+ }
+ }
+ return (NULL);
+}
+
+static void
+config_free(struct tcpdump_conf *c)
+{
+ struct policy *p;
+
+ while ((p = TAILQ_FIRST(&c->policies))) {
+ TAILQ_REMOVE(&c->policies, p, entry);
+ free(p);
+ }
+ free(c);
+}
+
+static void
+config_policy(struct policy *p)
+{
+ TAILQ_INSERT_TAIL(&conf->policies, p, entry);
+}
+
+static void
+add_policy(struct printer_opts *popts)
+{
+ if (popts->po_arp)
+ add_policy2("arp");
+ if (popts->po_atalk)
+ add_policy2("atalk");
+ if (popts->po_atm)
+ add_policy2("atm");
+ if (popts->po_bgp)
+ add_policy2("bgp");
+ if (popts->po_bootp)
+ add_policy2("bootp");
+ if (popts->po_carp)
+ add_policy2("carp");
+ if (popts->po_cdp)
+ add_policy2("cdp");
+ if (popts->po_cnfp)
+ add_policy2("cnfp");
+ if (popts->po_decnet)
+ add_policy2("decnet");
+ if (popts->po_dhcp6)
+ add_policy2("dhcp6");
+ if (popts->po_domain)
+ add_policy2("domain");
+ if (popts->po_dvmrp)
+ add_policy2("dvmrp");
+ if (popts->po_enc)
+ add_policy2("enc");
+ if (popts->po_ether)
+ add_policy2("ether");
+ if (popts->po_etherip)
+ add_policy2("etherip");
+ if (popts->po_fddi)
+ add_policy2("fddi");
+ if (popts->po_frag6)
+ add_policy2("frag6");
+ if (popts->po_gre)
+ add_policy2("gre");
+ if (popts->po_gtp)
+ add_policy2("gtp");
+ if (popts->po_hsrp)
+ add_policy2("hsrp");
+ if (popts->po_iapp)
+ add_policy2("iapp");
+ if (popts->po_icmp)
+ add_policy2("icmp");
+ if (popts->po_icmp6)
+ add_policy2("icmp6");
+ if (popts->po_igrp)
+ add_policy2("igrp");
+ if (popts->po_ike)
+ add_policy2("ike");
+ if (popts->po_ip)
+ add_policy2("ip");
+ if (popts->po_ip6)
+ add_policy2("ip6");
+ if (popts->po_ipsec)
+ add_policy2("ipsec");
+ if (popts->po_ipx)
+ add_policy2("ipx");
+ if (popts->po_isoclns)
+ add_policy2("isoclns");
+ if (popts->po_krb)
+ add_policy2("krb");
+ if (popts->po_l2tp)
+ add_policy2("l2tp");
+ if (popts->po_llc)
+ add_policy2("llc");
+ if (popts->po_lldp)
+ add_policy2("lldp");
+ if (popts->po_lwres)
+ add_policy2("lwres");
+ if (popts->po_mobile)
+ add_policy2("mobile");
+ if (popts->po_mpls)
+ add_policy2("mpls");
+ if (popts->po_netbios)
+ add_policy2("netbios");
+ if (popts->po_nfs)
+ add_policy2("nfs");
+ if (popts->po_nhrp)
+ add_policy2("nhrp");
+ if (popts->po_nsh)
+ add_policy2("nsh");
+ if (popts->po_ntp)
+ add_policy2("ntp");
+ if (popts->po_null)
+ add_policy2("null");
+ if (popts->po_ofp)
+ add_policy2("ofp");
+ if (popts->po_ospf)
+ add_policy2("ospf");
+ if (popts->po_ospf6)
+ add_policy2("ospf6");
+ if (popts->po_pflog)
+ add_policy2("pflog");
+ if (popts->po_pfsync)
+ add_policy2("pfsync");
+ if (popts->po_pim)
+ add_policy2("pim");
+ if (popts->po_ppp)
+ add_policy2("ppp");
+ if (popts->po_radius)
+ add_policy2("radius");
+ if (popts->po_raw)
+ add_policy2("raw");
+ if (popts->po_rip)
+ add_policy2("rip");
+ if (popts->po_ripng);
+ add_policy2("ripng");
+ if (popts->po_sl)
+ add_policy2("sl");
+ if (popts->po_slow)
+ add_policy2("slow");
+ if (popts->po_snmp)
+ add_policy2("snmp");
+ if (popts->po_stp)
+ add_policy2("stp");
+ if (popts->po_sunrpc)
+ add_policy2("sunrpc");
+ if (popts->po_tcp)
+ add_policy2("tcp");
+ if (popts->po_tftp)
+ add_policy2("tftp");
+ if (popts->po_timed)
+ add_policy2("timed");
+ if (popts->po_udp)
+ add_policy2("udp");
+ if (popts->po_udpencap)
+ add_policy2("udpencap");
+ if (popts->po_usbpcap)
+ add_policy2("usbpcap");
+ if (popts->po_vqp)
+ add_policy2("vqp");
+ if (popts->po_vrrp)
+ add_policy2("vrrp");
+ if (popts->po_wb)
+ add_policy2("wb");
+ if (popts->po_wg)
+ add_policy2("wg");
+}
+
+static void
+add_policy2(char *filechunk)
+{
+ struct policy *p;
+ char filename[PATH_MAX];
+
+ snprintf(filename, sizeof(filename), "print-%s.c", filechunk);
+
+ p = (struct policy *)calloc(sizeof(*p), 1);
+ if (p == NULL)
+ err(1, "calloc");
+
+ p->filename = strdup(filename);
+ if (p->filename == NULL)
+ err(1, "strdup");
+
+ config_policy(p);
+}
+
+int
+check_policy(char *filename)
+{
+ struct tcpdump_conf *env = conf;
+ char *split;
+ struct policy *p;
+
+ split = strrchr(filename, '/');
+ if (split == NULL)
+ split = filename;
+ else
+ split++;
+
+ TAILQ_FOREACH(p, &env->policies, entry) {
+ if (strcmp(split, p->filename) == 0) {
+ return 0;
+ }
+ }
+
+ return (1);
+}
Index: print-arp.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-arp.c,v
retrieving revision 1.17
diff -u -p -u -r1.17 print-arp.c
--- print-arp.c 1 Dec 2021 18:28:45 -0000 1.17
+++ print-arp.c 7 Mar 2023 06:47:38 -0000
@@ -37,6 +37,9 @@
#include "ethertype.h"
#include "extract.h" /* must come after interface.h */
+
+extern int check_policy(char *filename);
+
/* Compatibility */
#ifndef REVARP_REQUEST
#define REVARP_REQUEST 3
@@ -54,6 +57,11 @@ arp_print(const u_char *bp, u_int length
const struct ether_header *eh;
u_short pro, hrd, op;
+ if (check_policy(__FILE__)) {
+ printf("[|arp policy violation] ");
+ return;
+ }
+
ap = (struct ether_arp *)bp;
if ((u_char *)(ap + 1) > snapend) {
printf("[|arp]");
Index: print-atalk.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-atalk.c,v
retrieving revision 1.35
diff -u -p -u -r1.35 print-atalk.c
--- print-atalk.c 1 Dec 2021 18:28:45 -0000 1.35
+++ print-atalk.c 7 Mar 2023 06:47:38 -0000
@@ -50,6 +50,8 @@
#include "savestr.h"
#include "privsep.h"
+extern int check_policy(char *filename);
+
static struct tok type2str[] = {
{ ddpRTMP, "rtmp" },
{ ddpRTMPrequest, "rtmpReq" },
@@ -95,6 +97,11 @@ atalk_print(const u_char *bp, u_int leng
{
const struct atDDP *dp;
u_short snet;
+
+ if (check_policy(__FILE__)) {
+ printf("[|ddp policy violation] ");
+ return;
+ }
if (length < ddpSize) {
printf(" [|ddp %d]", length);
Index: print-atm.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-atm.c,v
retrieving revision 1.15
diff -u -p -u -r1.15 print-atm.c
--- print-atm.c 1 Dec 2021 18:28:45 -0000 1.15
+++ print-atm.c 7 Mar 2023 06:47:38 -0000
@@ -41,6 +41,8 @@
#include "addrtoname.h"
#include "ethertype.h"
+extern int check_policy(char *filename);
+
/*
* This is the top level routine of the printer. 'p' is the points
* to the LLC/SNAP header of the packet, 'tvp' is the timestamp,
@@ -55,6 +57,11 @@ atm_if_print(u_char *user, const struct
u_short ethertype;
ts_print(&h->ts);
+
+ if (check_policy(__FILE__)) {
+ printf("[|atm policy violation] ");
+ return;
+ }
if (caplen < 8) {
printf("[|atm]");
Index: print-bgp.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-bgp.c,v
retrieving revision 1.32
diff -u -p -u -r1.32 print-bgp.c
--- print-bgp.c 25 May 2022 16:21:11 -0000 1.32
+++ print-bgp.c 7 Mar 2023 06:47:38 -0000
@@ -46,6 +46,8 @@
#include "extract.h"
#include "afnum.h"
+extern int check_policy(char *filename);
+
struct bgp {
u_int8_t bgp_marker[16];
u_int16_t bgp_len;
@@ -1153,6 +1155,12 @@ bgp_print(const u_char *dat, int length)
struct bgp bgp;
u_int16_t hlen;
int newline;
+
+
+ if (check_policy(__FILE__)) {
+ printf("[|BGP policy violation]");
+ return;
+ }
ep = dat + length;
if (snapend < dat + length)
Index: print-bootp.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-bootp.c,v
retrieving revision 1.25
diff -u -p -u -r1.25 print-bootp.c
--- print-bootp.c 1 Dec 2021 18:28:45 -0000 1.25
+++ print-bootp.c 7 Mar 2023 06:47:38 -0000
@@ -38,6 +38,7 @@
#include "addrtoname.h"
#include "bootp.h"
+extern int check_policy(char *filename);
static void rfc1048_print(const u_char *, u_int);
static void cmu_print(const u_char *, u_int);
@@ -53,6 +54,11 @@ bootp_print(const u_char *cp, u_int leng
const struct bootp *bp;
static u_char vm_cmu[4] = VM_CMU;
static u_char vm_rfc1048[4] = VM_RFC1048;
+
+ if (check_policy(__FILE__)) {
+ printf("[|bootp policy violation] ");
+ return;
+ }
bp = (struct bootp *)cp;
TCHECK(bp->bp_op);
Index: print-carp.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-carp.c,v
retrieving revision 1.7
diff -u -p -u -r1.7 print-carp.c
--- print-carp.c 15 Nov 2015 20:35:36 -0000 1.7
+++ print-carp.c 7 Mar 2023 06:47:38 -0000
@@ -42,11 +42,18 @@
#include "extract.h"
#include "addrtoname.h"
+extern int check_policy(char *filename);
+
void
carp_print(const u_char *bp, u_int len, int ttl)
{
int version, type;
char *type_s;
+
+ if (check_policy(__FILE__)) {
+ printf("[|carp policy violation] ");
+ return;
+ }
TCHECK(bp[0]);
version = (bp[0] & 0xf0) >> 4;
Index: print-cdp.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-cdp.c,v
retrieving revision 1.8
diff -u -p -u -r1.8 print-cdp.c
--- print-cdp.c 11 Sep 2019 15:20:30 -0000 1.8
+++ print-cdp.c 7 Mar 2023 06:47:38 -0000
@@ -39,6 +39,7 @@
#include "addrtoname.h"
#include "extract.h" /* must come after interface.h */
+extern int check_policy(char *filename);
int cdp_print_addr(const u_char * p, int l);
void cdp_print_prefixes(const u_char * p, int l);
@@ -51,6 +52,10 @@ cdp_print(const u_char *p, u_int length,
int type, len;
/* Cisco Discovery Protocol */
+ if (check_policy(__FILE__)) {
+ printf("[|cdp policy violation] ");
+ return;
+ }
if (caplen < i + 4) {
printf("[|cdp]");
Index: print-cnfp.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-cnfp.c,v
retrieving revision 1.11
diff -u -p -u -r1.11 print-cnfp.c
--- print-cnfp.c 5 Jan 2022 05:41:25 -0000 1.11
+++ print-cnfp.c 7 Mar 2023 06:47:38 -0000
@@ -42,6 +42,8 @@
#include "interface.h"
#include "addrtoname.h"
+extern int check_policy(char *filename);
+
struct nfhdr {
u_int32_t ver_cnt; /* version [15], and # of records */
u_int32_t msys_uptime;
@@ -73,6 +75,11 @@ cnfp_print(const u_char *cp, u_int len)
const struct nfhdr *nh;
const struct nfrec *nr;
int nrecs, ver, proto;
+
+ if (check_policy(__FILE__)) {
+ printf("[|cnfp policy violation] ");
+ return;
+ }
nh = (struct nfhdr *)cp;
Index: print-decnet.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-decnet.c,v
retrieving revision 1.19
diff -u -p -u -r1.19 print-decnet.c
--- print-decnet.c 1 Dec 2021 18:28:45 -0000 1.19
+++ print-decnet.c 7 Mar 2023 06:47:38 -0000
@@ -41,6 +41,8 @@
#include "interface.h"
#include "addrtoname.h"
+extern int check_policy(char *filename);
+
/* Forwards */
static int print_decnet_ctlmsg(const union routehdr *, u_int, u_int);
static void print_t_info(int);
@@ -67,6 +69,11 @@ decnet_print(const u_char *ap, u_int len
int dst, src, hops;
u_int rhlen, nsplen, pktlen;
const u_char *nspp;
+
+ if (check_policy(__FILE__)) {
+ printf("[|decnet policy violation] ");
+ return;
+ }
if (length < sizeof(struct shorthdr)) {
printf("[|decnet]");
Index: print-dhcp6.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-dhcp6.c,v
retrieving revision 1.13
diff -u -p -u -r1.13 print-dhcp6.c
--- print-dhcp6.c 1 Dec 2021 18:28:45 -0000 1.13
+++ print-dhcp6.c 7 Mar 2023 06:47:38 -0000
@@ -32,6 +32,8 @@
#include "extract.h"
#include "addrtoname.h"
+extern int check_policy(char *filename);
+
/* Message type */
#define DH6_SOLICIT 1
#define DH6_ADVERTISE 2
@@ -128,6 +130,11 @@ dhcp6_print(const u_char *cp, u_int leng
uint32_t hdr;
int l = snapend - cp;
const char *msgname;
+
+ if (check_policy(__FILE__)) {
+ printf("[|dhcp6 policy violation] ");
+ return;
+ }
printf("DHCPv6");
Index: print-domain.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-domain.c,v
retrieving revision 1.28
diff -u -p -u -r1.28 print-domain.c
--- print-domain.c 1 Mar 2023 08:15:58 -0000 1.28
+++ print-domain.c 7 Mar 2023 06:47:38 -0000
@@ -49,6 +49,8 @@
#include "addrtoname.h"
#include "extract.h" /* must come after interface.h */
+extern int check_policy(char *filename);
+
static const char *ns_ops[] = {
"", " inv_q", " stat", " op3", " notify", " update", " op6", " op7",
" op8", " updataA", " updateD", " updateDA",
@@ -576,6 +578,11 @@ ns_print(const u_char *bp, u_int length,
int qdcount, ancount, nscount, arcount;
const u_char *cp;
u_int16_t b2;
+
+ if (check_policy(__FILE__)) {
+ printf("[|domain policy violation] ");
+ return;
+ }
np = (const HEADER *)bp;
TCHECK(*np);
Index: print-dvmrp.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-dvmrp.c,v
retrieving revision 1.9
diff -u -p -u -r1.9 print-dvmrp.c
--- print-dvmrp.c 16 Nov 2015 00:16:39 -0000 1.9
+++ print-dvmrp.c 7 Mar 2023 06:47:38 -0000
@@ -39,6 +39,8 @@
#include "interface.h"
#include "addrtoname.h"
+extern int check_policy(char *filename);
+
/*
* DVMRP message types and flag values shamelessly stolen from
* mrouted/dvmrp.h.
@@ -81,6 +83,11 @@ dvmrp_print(const u_char *bp, u_int len)
const u_char *ep;
u_char type;
+ if (check_policy(__FILE__)) {
+ printf("[|dvmrp policy violation] ");
+ return;
+ }
+
ep = (const u_char *)snapend;
if (bp >= ep)
return;
Index: print-enc.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-enc.c,v
retrieving revision 1.17
diff -u -p -u -r1.17 print-enc.c
--- print-enc.c 1 Dec 2021 18:28:45 -0000 1.17
+++ print-enc.c 7 Mar 2023 06:47:38 -0000
@@ -46,6 +46,8 @@
#include "interface.h"
#include "addrtoname.h"
+extern int check_policy(char *filename);
+
#define ENC_PRINT_TYPE(wh, xf, nam) \
if ((wh) & (xf)) { \
printf("%s%s", nam, (wh) == (xf) ? "): " : ","); \
@@ -60,6 +62,11 @@ enc_if_print(u_char *user, const struct
int flags;
ts_print(&h->ts);
+
+ if (check_policy(__FILE__)) {
+ printf("[|enc policy violation] ");
+ goto out;
+ }
if (caplen < ENC_HDRLEN) {
printf("[|enc]");
Index: print-ether.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-ether.c,v
retrieving revision 1.42
diff -u -p -u -r1.42 print-ether.c
--- print-ether.c 9 Jun 2022 12:56:14 -0000 1.42
+++ print-ether.c 7 Mar 2023 06:47:38 -0000
@@ -45,6 +45,8 @@
#include "ethertype.h"
#include "extract.h"
+extern int check_policy(char *filename);
+
const u_char *packetp;
const u_char *snapend;
@@ -106,6 +108,11 @@ ether_tryprint(const u_char *p, u_int le
struct ether_header *ep;
u_int caplen = snapend - p;
u_short ether_type;
+
+ if (check_policy(__FILE__)) {
+ printf("[|ether policy violation] ");
+ goto out;
+ }
if (caplen < sizeof(struct ether_header)) {
printf("[|ether]");
Index: print-etherip.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-etherip.c,v
retrieving revision 1.10
diff -u -p -u -r1.10 print-etherip.c
--- print-etherip.c 10 Feb 2018 10:00:32 -0000 1.10
+++ print-etherip.c 7 Mar 2023 06:47:38 -0000
@@ -53,6 +53,8 @@
#include "interface.h"
#include "extract.h" /* must come after interface.h */
+extern int check_policy(char *filename);
+
extern u_short extracted_ethertype;
void
@@ -62,6 +64,11 @@ etherip_print(const u_char *bp, u_int ca
const u_char *pbuf = bp;
u_int plen = caplen, hlen;
u_int16_t etype;
+
+ if (check_policy(__FILE__)) {
+ printf("[|etherip policy violation] ");
+ return;
+ }
printf("etherip ");
Index: print-fddi.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-fddi.c,v
retrieving revision 1.19
diff -u -p -u -r1.19 print-fddi.c
--- print-fddi.c 1 Dec 2021 18:28:46 -0000 1.19
+++ print-fddi.c 7 Mar 2023 06:47:38 -0000
@@ -45,6 +45,8 @@
#include "fddi.h"
+extern int check_policy(char *filename);
+
/*
* Some FDDI interfaces use bit-swapped addresses.
*/
@@ -223,6 +225,12 @@ fddi_print(const struct fddi_header *fdd
{
char *srcname, *dstname;
+
+ if (check_policy(__FILE__)) {
+ printf("[|fddi policy violation] ");
+ return;
+ }
+
srcname = etheraddr_string(fsrc);
dstname = etheraddr_string(fdst);
@@ -262,6 +270,11 @@ fddi_if_print(u_char *pcap, const struct
struct ether_header ehdr;
ts_print(&h->ts);
+
+ if (check_policy(__FILE__)) {
+ printf("[|fddi policy violation]");
+ goto out;
+ }
if (caplen < FDDI_HDRLEN) {
printf("[|fddi]");
Index: print-gre.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-gre.c,v
retrieving revision 1.34
diff -u -p -u -r1.34 print-gre.c
--- print-gre.c 17 Aug 2020 07:09:25 -0000 1.34
+++ print-gre.c 7 Mar 2023 06:47:38 -0000
@@ -48,6 +48,8 @@
#include "addrtoname.h"
#include "extract.h"
+extern int check_policy(char *filename);
+
#define GRE_CP 0x8000 /* checksum present */
#define GRE_RP 0x4000 /* routing present */
#define GRE_KP 0x2000 /* key present */
@@ -94,6 +96,11 @@ gre_print(const u_char *p, u_int length)
{
uint16_t vers;
int l;
+
+ if (check_policy(__FILE__)) {
+ printf("[|gre policy violation] ");
+ return;
+ }
l = snapend - p;
Index: print-gtp.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-gtp.c,v
retrieving revision 1.13
diff -u -p -u -r1.13 print-gtp.c
--- print-gtp.c 26 Oct 2020 23:19:18 -0000 1.13
+++ print-gtp.c 7 Mar 2023 06:47:38 -0000
@@ -57,6 +57,8 @@
#include "interface.h"
#include "gtp.h"
+extern int check_policy(char *filename);
+
#ifndef nitems
#define nitems(_a) (sizeof((_a)) / sizeof((_a)[0]))
#endif
@@ -298,6 +300,11 @@ void
gtp_print(const u_char *cp, u_int length, u_short sport, u_short dport)
{
int version;
+
+ if (check_policy(__FILE__)) {
+ printf("[|gtp policy violation] ");
+ return;
+ }
/* Decode GTP version. */
TCHECK(cp[0]);
Index: print-hsrp.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-hsrp.c,v
retrieving revision 1.5
diff -u -p -u -r1.5 print-hsrp.c
--- print-hsrp.c 16 Nov 2015 00:16:39 -0000 1.5
+++ print-hsrp.c 7 Mar 2023 06:47:38 -0000
@@ -43,6 +43,8 @@
#include "interface.h"
#include "addrtoname.h"
+extern int check_policy(char *filename);
+
/* HSRP op code types. */
static const char *op_code_str[] = {
"hello",
@@ -99,6 +101,11 @@ void
hsrp_print(const u_char *bp, u_int len)
{
struct hsrp *hp = (struct hsrp *) bp;
+
+ if (check_policy(__FILE__)) {
+ printf("[|hsrp policy violation] ");
+ return;
+ }
TCHECK(hp->hsrp_version);
printf("HSRPv%d", hp->hsrp_version);
Index: print-iapp.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-iapp.c,v
retrieving revision 1.6
diff -u -p -u -r1.6 print-iapp.c
--- print-iapp.c 6 Jul 2018 05:47:22 -0000 1.6
+++ print-iapp.c 7 Mar 2023 06:47:38 -0000
@@ -40,6 +40,7 @@ const char *ieee80211_iapp_frame_type_na
IEEE80211_IAPP_FRAME_TYPE_NAME;
extern int ieee80211_encap;
+extern int check_policy(char *filename);
void
iapp_print(const u_char *p, u_int len)
@@ -48,6 +49,11 @@ iapp_print(const u_char *p, u_int len)
struct ieee80211_iapp_add_notify *add;
struct pcap_pkthdr fakeh;
const u_char *data;
+
+ if (check_policy(__FILE__)) {
+ printf("[|iapp policy violation] ");
+ return;
+ }
TCHECK2(*wf, sizeof(struct ieee80211_iapp_frame));
Index: print-icmp.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-icmp.c,v
retrieving revision 1.27
diff -u -p -u -r1.27 print-icmp.c
--- print-icmp.c 1 Dec 2021 18:28:46 -0000 1.27
+++ print-icmp.c 7 Mar 2023 06:47:38 -0000
@@ -43,6 +43,8 @@
#include "addrtoname.h"
#include "extract.h" /* must come after interface.h */
+extern int check_policy(char *filename);
+
/* rfc1700 */
#ifndef ICMP_UNREACH_NET_UNKNOWN
#define ICMP_UNREACH_NET_UNKNOWN 6 /* destination net unknown */
@@ -171,6 +173,11 @@ icmp_print(const u_char *bp, u_int lengt
u_int hlen, dport, mtu;
char buf[HOST_NAME_MAX+1+256];
char buf2[HOST_NAME_MAX+1+256];
+
+ if (check_policy(__FILE__)) {
+ printf("[|icmp policy violation] ");
+ return;
+ }
dp = (struct icmp *)bp;
ip = (struct ip *)bp2;
Index: print-icmp6.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-icmp6.c,v
retrieving revision 1.25
diff -u -p -u -r1.25 print-icmp6.c
--- print-icmp6.c 28 Dec 2022 21:30:19 -0000 1.25
+++ print-icmp6.c 7 Mar 2023 06:47:38 -0000
@@ -52,6 +52,8 @@
#include "addrtoname.h"
#include "extract.h"
+extern int check_policy(char *filename);
+
void icmp6_opt_print(const u_char *, int);
void mld6_print(const u_char *);
void mldv2_query_print(const u_char *, u_int);
@@ -135,6 +137,11 @@ icmp6_print(const u_char *bp, u_int leng
#if 0
#define TCHECK(var) if ((u_char *)&(var) > ep - sizeof(var)) goto trunc
#endif
+
+ if (check_policy(__FILE__)) {
+ printf("[|icmp6 policy violation] ");
+ return;
+ }
dp = (struct icmp6_hdr *)bp;
ip = (struct ip6_hdr *)bp2;
Index: print-igrp.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-igrp.c,v
retrieving revision 1.9
diff -u -p -u -r1.9 print-igrp.c
--- print-igrp.c 24 Jan 2020 22:46:36 -0000 1.9
+++ print-igrp.c 7 Mar 2023 06:47:38 -0000
@@ -40,6 +40,8 @@
#include "igrp.h"
#include "extract.h" /* must come after interface.h */
+extern int check_policy(char *filename);
+
static void
igrp_entry_print(struct igrprte *igr, int is_interior, int is_exterior)
{
@@ -82,6 +84,12 @@ igrp_print(const u_char *bp, u_int lengt
struct ip *ip;
u_char *cp;
u_int nint, nsys, next;
+
+
+ if (check_policy(__FILE__)) {
+ printf("[|igrp policy violation] ");
+ return;
+ }
hdr = (struct igrphdr *)bp;
ip = (struct ip *)bp2;
Index: print-ike.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-ike.c,v
retrieving revision 1.41
diff -u -p -u -r1.41 print-ike.c
--- print-ike.c 28 Dec 2022 21:30:19 -0000 1.41
+++ print-ike.c 7 Mar 2023 06:47:38 -0000
@@ -42,6 +42,8 @@
#include "addrtoname.h"
#include "ike.h"
+extern int check_policy(char *filename);
+
struct isakmp_header {
u_int8_t init_cookie[8];
u_int8_t resp_cookie[8];
@@ -185,6 +187,11 @@ ike_print (const u_int8_t *cp, u_int len
u_int8_t *payload, next_payload;
int encrypted;
static const char *exgtypes[] = IKE_EXCHANGE_TYPES_INITIALIZER;
+
+ if (check_policy(__FILE__)) {
+ printf("[|ike policy violation] ");
+ return;
+ }
encrypted = 0;
Index: print-ip.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-ip.c,v
retrieving revision 1.53
diff -u -p -u -r1.53 print-ip.c
--- print-ip.c 24 Jan 2020 22:46:36 -0000 1.53
+++ print-ip.c 7 Mar 2023 06:47:38 -0000
@@ -41,6 +41,8 @@
#include "interface.h"
#include "extract.h" /* must come after interface.h */
+extern int check_policy(char *filename);
+
/* Compatibility */
#ifndef IPPROTO_ND
#define IPPROTO_ND 77
@@ -322,6 +324,11 @@ ip_print(const u_char *bp, u_int length)
const u_char *cp;
const u_char *pktp = packetp;
const u_char *send = snapend;
+
+ if (check_policy(__FILE__)) {
+ printf("[|ip policy violation] ");
+ return;
+ }
TCHECK2(bp[0], 1);
ip = (const struct ip *)bp;
Index: print-ip6.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-ip6.c,v
retrieving revision 1.30
diff -u -p -u -r1.30 print-ip6.c
--- print-ip6.c 24 Jan 2020 22:46:37 -0000 1.30
+++ print-ip6.c 7 Mar 2023 06:47:38 -0000
@@ -43,6 +43,8 @@
#include <netinet/ip6.h>
+extern int check_policy(char *filename);
+
/*
* print an IP6 datagram.
*/
@@ -57,6 +59,11 @@ ip6_print(const u_char *bp, u_int length
const u_char *send = snapend;
int nh;
u_int flow;
+
+ if (check_policy(__FILE__)) {
+ printf("[|ip6 policy violation] ");
+ return;
+ }
ip6 = (const struct ip6_hdr *)bp;
if ((u_char *)(ip6 + 1) > snapend) {
Index: print-ipsec.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-ipsec.c,v
retrieving revision 1.27
diff -u -p -u -r1.27 print-ipsec.c
--- print-ipsec.c 29 Nov 2021 18:50:16 -0000 1.27
+++ print-ipsec.c 7 Mar 2023 06:47:38 -0000
@@ -49,6 +49,9 @@
#include <openssl/evp.h>
#include <ctype.h>
+extern int check_policy(char *filename);
+
+
/*
* IPsec/ESP header
*/
@@ -207,6 +210,11 @@ esp_print (const u_char *bp, u_int len,
{
const struct esp_hdr *esp;
+ if (check_policy(__FILE__)) {
+ printf("[|esp/ipsec policy violation] ");
+ return;
+ }
+
if (len < sizeof(struct esp_hdr)) {
printf("[|esp]");
return;
@@ -238,6 +246,11 @@ ah_print (const u_char *bp, u_int len, c
const struct ah_hdr *ah;
u_int pl_len = len;
const struct ip6_hdr *ip6;
+
+ if (check_policy(__FILE__)) {
+ printf("[|ah/ipsec policy violation] ");
+ return;
+ }
ip = (const struct ip *)bp2;
if (ip->ip_v == 6) {
@@ -326,6 +339,11 @@ ipcomp_print (const u_char *bp, u_int le
const struct ipcomp_hdr *ipc;
u_int plen = len;
+ if (check_policy(__FILE__)) {
+ printf("[|ipcomp/ipsec policy violation] ");
+ return;
+ }
+
ip = (const struct ip *)bp2;
printf("ipcomp %s > %s",
Index: print-ipx.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-ipx.c,v
retrieving revision 1.16
diff -u -p -u -r1.16 print-ipx.c
--- print-ipx.c 24 Jan 2020 22:46:37 -0000 1.16
+++ print-ipx.c 7 Mar 2023 06:47:38 -0000
@@ -43,6 +43,7 @@
#include "ipx.h"
#include "extract.h"
+extern int check_policy(char *filename);
static const char *ipxaddr_string(u_int32_t, const u_char *);
void ipx_decode(const struct ipxHdr *, const u_char *, u_int);
@@ -56,6 +57,11 @@ void
ipx_print(const u_char *p, u_int length)
{
const struct ipxHdr *ipx = (const struct ipxHdr *)p;
+
+ if (check_policy(__FILE__)) {
+ printf("[|ipx policy violation] ");
+ return;
+ }
TCHECK(ipx->srcSkt);
printf("%s.%x > ",
Index: print-isoclns.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-isoclns.c,v
retrieving revision 1.16
diff -u -p -u -r1.16 print-isoclns.c
--- print-isoclns.c 28 Feb 2023 10:04:50 -0000 1.16
+++ print-isoclns.c 7 Mar 2023 06:47:38 -0000
@@ -38,6 +38,8 @@
#include "addrtoname.h"
#include "ethertype.h"
+extern int check_policy(char *filename);
+
#define CLNS 129
#define ESIS 130
#define ISIS 131
@@ -50,6 +52,12 @@ void
isoclns_print(const u_char *p, u_int length, u_int caplen,
const u_char *esrc, const u_char *edst)
{
+
+ if (check_policy(__FILE__)) {
+ printf("|iso-clns policy violation] ");
+ return;
+ }
+
if (caplen < 1) {
printf("[|iso-clns] ");
if (!eflag)
Index: print-krb.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-krb.c,v
retrieving revision 1.13
diff -u -p -u -r1.13 print-krb.c
--- print-krb.c 24 Jan 2020 22:46:37 -0000 1.13
+++ print-krb.c 7 Mar 2023 06:47:38 -0000
@@ -39,6 +39,8 @@
#include "interface.h"
#include "addrtoname.h"
+extern int check_policy(char *filename);
+
const u_char *c_print(const u_char *, const u_char *);
const u_char *krb4_print_hdr(const u_char *);
void krb4_print(const u_char *);
@@ -183,6 +185,11 @@ krb4_print(const u_char *cp)
/* True if struct krb is little endian */
#define IS_LENDIAN(kp) (((kp)->type & 0x01) != 0)
#define KTOHSP(kp, cp) (IS_LENDIAN(kp) ? vtohsp(cp) : ntohsp(cp))
+
+ if (check_policy(__FILE__)) {
+ printf("|krb policy violation] ");
+ return;
+ }
kp = (struct krb *)cp;
Index: print-l2tp.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-l2tp.c,v
retrieving revision 1.11
diff -u -p -u -r1.11 print-l2tp.c
--- print-l2tp.c 5 Jan 2022 05:46:18 -0000 1.11
+++ print-l2tp.c 7 Mar 2023 06:47:38 -0000
@@ -30,6 +30,7 @@
#include "l2tp.h"
#include "interface.h"
+extern int check_policy(char *filename);
static char tstr[] = " [|l2tp]";
#ifndef TRUE
@@ -618,6 +619,11 @@ l2tp_print(const u_char *dat, u_int leng
u_int cnt = 0; /* total octets consumed */
u_short pad, val;
int flag_t, flag_l, flag_s, flag_o, flag_p;
+
+ if (check_policy(__FILE__)) {
+ printf("|l2tp policy violation] ");
+ return;
+ }
flag_t = flag_l = flag_s = flag_o = flag_p = FALSE;
Index: print-llc.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-llc.c,v
retrieving revision 1.23
diff -u -p -u -r1.23 print-llc.c
--- print-llc.c 28 Feb 2023 10:04:50 -0000 1.23
+++ print-llc.c 7 Mar 2023 06:47:38 -0000
@@ -41,6 +41,8 @@
#include "llc.h"
+extern int check_policy(char *filename);
+
static struct tok cmd2str[] = {
{ LLC_UI, "ui" },
{ LLC_TEST, "test" },
@@ -66,6 +68,11 @@ llc_print(const u_char *p, u_int length,
u_short control;
#endif
int ret;
+
+ if (check_policy(__FILE__)) {
+ printf("[|llc policy violation] ");
+ return (1);
+ }
if (caplen < 3) {
printf("[|llc]");
Index: print-lldp.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-lldp.c,v
retrieving revision 1.9
diff -u -p -u -r1.9 print-lldp.c
--- print-lldp.c 28 Nov 2016 17:47:15 -0000 1.9
+++ print-lldp.c 7 Mar 2023 06:47:38 -0000
@@ -34,6 +34,8 @@
#include "interface.h"
#include "afnum.h"
+extern int check_policy(char *filename);
+
enum {
LLDP_TLV_END = 0,
LLDP_TLV_CHASSIS_ID = 1,
@@ -191,6 +193,12 @@ lldp_print(const u_char *p, u_int len)
u_int16_t tlv;
u_int8_t *ptr = (u_int8_t *)p, v = 0;
int n, type, vlen, alen;
+
+
+ if (check_policy(__FILE__)) {
+ printf("[|LLDP policy violation] ");
+ return;
+ }
printf("LLDP");
Index: print-lwres.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-lwres.c,v
retrieving revision 1.12
diff -u -p -u -r1.12 print-lwres.c
--- print-lwres.c 28 Dec 2022 21:30:19 -0000 1.12
+++ print-lwres.c 7 Mar 2023 06:47:38 -0000
@@ -52,6 +52,8 @@
#include "addrtoname.h"
#include "extract.h" /* must come after interface.h */
+extern int check_policy(char *filename);
+
/* BIND9 lib/lwres/include/lwres */
typedef u_int32_t lwres_uint32_t;
typedef u_int16_t lwres_uint16_t;
@@ -348,6 +350,11 @@ lwres_print(const u_char *bp, u_int leng
int response;
int advance;
int unsupported = 0;
+
+ if (check_policy(__FILE__)) {
+ printf("[|lwres policy violation] ");
+ return;
+ }
np = (const struct lwres_lwpacket *)bp;
TCHECK(np->authlength);
Index: print-mobile.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-mobile.c,v
retrieving revision 1.7
diff -u -p -u -r1.7 print-mobile.c
--- print-mobile.c 5 Jan 2022 05:46:18 -0000 1.7
+++ print-mobile.c 7 Mar 2023 06:47:38 -0000
@@ -44,6 +44,8 @@
#include "addrtoname.h"
#include "extract.h" /* must come after interface.h */
+extern int check_policy(char *filename);
+
#define MOBILE_SIZE (8)
struct mobile_ip {
@@ -66,6 +68,11 @@ mobile_print(const u_char *bp, u_int len
const struct mobile_ip *mob;
u_short proto,crc;
u_char osp =0; /* old source address present */
+
+ if (check_policy(__FILE__)) {
+ printf("[|mobile policy violation] ");
+ return;
+ }
mob = (const struct mobile_ip *)bp;
Index: print-mpls.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-mpls.c,v
retrieving revision 1.4
diff -u -p -u -r1.4 print-mpls.c
--- print-mpls.c 6 Jul 2018 07:00:49 -0000 1.4
+++ print-mpls.c 7 Mar 2023 06:47:38 -0000
@@ -35,6 +35,8 @@
#include "interface.h"
#include "extract.h" /* must come after interface.h */
+extern int check_policy(char *filename);
+
#define CW_SEQUENCE_MASK (0x0000ffffU)
int controlword_tryprint(const u_char **, u_int *);
@@ -44,6 +46,11 @@ mpls_print(const u_char *bp, u_int len)
{
u_int32_t tag, label, exp, bottom, ttl;
int has_cw;
+
+ if (check_policy(__FILE__)) {
+ printf("[|mpls policy violation] ");
+ return;
+ }
do {
if (bp + sizeof(tag) > snapend)
Index: print-netbios.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-netbios.c,v
retrieving revision 1.10
diff -u -p -u -r1.10 print-netbios.c
--- print-netbios.c 16 Jan 2015 06:40:21 -0000 1.10
+++ print-netbios.c 7 Mar 2023 06:47:38 -0000
@@ -42,12 +42,19 @@
#include "netbios.h"
#include "extract.h"
+extern int check_policy(char *filename);
+
/*
* Print NETBIOS packets.
*/
void
netbios_print(struct p8022Hdr *nb, u_int length)
{
+ if (check_policy(__FILE__)) {
+ printf("[|netbios policy violation] ");
+ return;
+ }
+
if (length < p8022Size) {
printf(" truncated-netbios %d", length);
return;
Index: print-nfs.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-nfs.c,v
retrieving revision 1.25
diff -u -p -u -r1.25 print-nfs.c
--- print-nfs.c 1 Dec 2021 18:28:46 -0000 1.25
+++ print-nfs.c 7 Mar 2023 06:47:38 -0000
@@ -45,6 +45,8 @@
#include "nfs.h"
#include "nfsfh.h"
+extern int check_policy(char *filename);
+
static void nfs_printfh(const u_int32_t *, const u_int);
static void xid_map_enter(const struct rpc_msg *, const u_char *);
static int32_t xid_map_find(const struct rpc_msg *, const u_char *,
@@ -412,6 +414,11 @@ nfsreq_print(const u_char *bp, u_int len
int v3 = 0;
u_int32_t proc;
struct nfsv3_sattr sa3;
+
+ if (check_policy(__FILE__)) {
+ printf("[|nfs policy violation] ");
+ return;
+ }
nfserr = 0; /* assume no error */
rp = (const struct rpc_msg *)bp;
Index: print-nhrp.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-nhrp.c,v
retrieving revision 1.2
diff -u -p -u -r1.2 print-nhrp.c
--- print-nhrp.c 28 Dec 2022 21:30:19 -0000 1.2
+++ print-nhrp.c 7 Mar 2023 06:47:38 -0000
@@ -39,6 +39,8 @@
#include "interface.h"
#include "extract.h"
+extern int check_policy(char *filename);
+
#define NHRP_VER_RFC2332 1
#define NHRP_PKG_RESOLUTION_REQUEST 1
@@ -99,6 +101,11 @@ nhrp_print(const u_char *p, u_int length
{
struct nhrp_header *hdr;
const u_char *nhrpext, *nhrpend;
+
+ if (check_policy(__FILE__)) {
+ printf("[|nhrp policy violation] ");
+ return;
+ }
printf("NHRP: ");
Index: print-nsh.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-nsh.c,v
retrieving revision 1.2
diff -u -p -u -r1.2 print-nsh.c
--- print-nsh.c 28 Feb 2023 10:04:50 -0000 1.2
+++ print-nsh.c 7 Mar 2023 06:47:38 -0000
@@ -36,6 +36,8 @@
#include "addrtoname.h"
#include "extract.h"
+extern int check_policy(char *filename);
+
#ifndef roundup
#define roundup(x, y) ((((x)+((y)-1))/(y))*(y))
#endif
@@ -104,6 +106,11 @@ nsh_print(const u_char *p, u_int length)
struct nsh_header nsh;
uint32_t field, len, proto;
int l = snapend - p;
+
+ if (check_policy(__FILE__)) {
+ printf("[|nsh policy violation] ");
+ return;
+ }
printf("NSH");
Index: print-ntp.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-ntp.c,v
retrieving revision 1.20
diff -u -p -u -r1.20 print-ntp.c
--- print-ntp.c 1 Dec 2021 18:28:46 -0000 1.20
+++ print-ntp.c 7 Mar 2023 06:47:38 -0000
@@ -44,6 +44,8 @@
#endif
#include "ntp.h"
+extern int check_policy(char *filename);
+
static void p_sfix(const struct s_fixedpt *);
static void p_ntp_time(const struct l_fixedpt *);
static void p_ntp_delta(const struct l_fixedpt *, const struct l_fixedpt *);
@@ -56,6 +58,11 @@ ntp_print(const u_char *cp, u_int length
{
const struct ntpdata *bp;
int mode, version, leapind;
+
+ if (check_policy(__FILE__)) {
+ printf("[|ntp policy violation] ");
+ return;
+ }
bp = (struct ntpdata *)cp;
/* Note funny sized packets */
Index: print-null.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-null.c,v
retrieving revision 1.25
diff -u -p -u -r1.25 print-null.c
--- print-null.c 1 Dec 2021 18:28:46 -0000 1.25
+++ print-null.c 7 Mar 2023 06:47:38 -0000
@@ -44,6 +44,8 @@
#include "interface.h"
#include "addrtoname.h"
+extern int check_policy(char *filename);
+
#ifndef AF_NS
#define AF_NS 6 /* XEROX NS protocols */
#endif
@@ -58,6 +60,11 @@ static void
null_print(const u_char *p, const struct ip *ip, u_int length)
{
u_int family;
+
+ if (check_policy(__FILE__)) {
+ printf("[|null policy violation] ");
+ return;
+ }
memcpy((char *)&family, (char *)p, sizeof(family));
Index: print-ofp.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-ofp.c,v
retrieving revision 1.12
diff -u -p -u -r1.12 print-ofp.c
--- print-ofp.c 27 Nov 2019 17:37:32 -0000 1.12
+++ print-ofp.c 7 Mar 2023 06:47:38 -0000
@@ -29,6 +29,8 @@
#include "interface.h"
#include "ofp_map.h"
+extern int check_policy(char *filename);
+
/* Size of action header without the padding. */
#define AH_UNPADDED (offsetof(struct ofp_action_header, ah_pad))
@@ -560,6 +562,11 @@ ofp_print(const u_char *bp, u_int length
{
struct ofp_header *oh;
unsigned int ohlen, snaplen;
+
+ if (check_policy(__FILE__)) {
+ printf("[|ofp policy violation] ");
+ return;
+ }
/* The captured data might be smaller than indicated */
snaplen = snapend - bp;
Index: print-ospf.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-ospf.c,v
retrieving revision 1.22
diff -u -p -u -r1.22 print-ospf.c
--- print-ospf.c 24 Jan 2020 22:46:37 -0000 1.22
+++ print-ospf.c 7 Mar 2023 06:47:38 -0000
@@ -39,6 +39,8 @@
#include "ospf.h"
+extern int check_policy(char *filename);
+
struct bits {
u_int32_t bit;
const char *str;
@@ -497,6 +499,11 @@ ospf_print(const u_char *bp, u_int lengt
const struct ip *ip;
const u_char *dataend;
const char *cp;
+
+ if (check_policy(__FILE__)) {
+ printf("[|ospf policy violation] ");
+ return;
+ }
op = (struct ospfhdr *)bp;
ip = (struct ip *)bp2;
Index: print-ospf6.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-ospf6.c,v
retrieving revision 1.11
diff -u -p -u -r1.11 print-ospf6.c
--- print-ospf6.c 24 Jan 2020 22:46:37 -0000 1.11
+++ print-ospf6.c 7 Mar 2023 06:47:38 -0000
@@ -40,6 +40,8 @@
#include "ospf6.h"
+extern int check_policy(char *filename);
+
struct bits {
u_int32_t bit;
const char *str;
@@ -607,6 +609,11 @@ ospf6_print(const u_char *bp, u_int leng
const struct ospf6hdr *op;
const u_char *dataend;
const char *cp;
+
+ if (check_policy(__FILE__)) {
+ printf("[|ospf policy violation] ");
+ return;
+ }
op = (struct ospf6hdr *)bp;
Index: print-pflog.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-pflog.c,v
retrieving revision 1.35
diff -u -p -u -r1.35 print-pflog.c
--- print-pflog.c 22 Feb 2022 17:35:01 -0000 1.35
+++ print-pflog.c 7 Mar 2023 06:47:38 -0000
@@ -49,6 +49,8 @@
#include "interface.h"
#include "addrtoname.h"
+extern int check_policy(char *filename);
+
char *pf_reasons[PFRES_MAX+2] = PFRES_NAMES;
void
@@ -63,6 +65,11 @@ pflog_if_print(u_char *user, const struc
const struct pfloghdr *hdr;
ts_print(&h->ts);
+
+ if (check_policy(__FILE__)) {
+ printf("[|pflog policy violation] ");
+ goto out;
+ }
/* check length */
if (caplen < sizeof(u_int8_t)) {
Index: print-pfsync.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-pfsync.c,v
retrieving revision 1.44
diff -u -p -u -r1.44 print-pfsync.c
--- print-pfsync.c 1 Dec 2021 18:28:46 -0000 1.44
+++ print-pfsync.c 7 Mar 2023 06:47:38 -0000
@@ -53,6 +53,8 @@
#include "pfctl_parser.h"
#include "pfctl.h"
+extern int check_policy(char *filename);
+
void pfsync_print(struct pfsync_header *, const u_char *, int);
void
@@ -63,6 +65,11 @@ pfsync_if_print(u_char *user, const stru
ts_print(&h->ts);
+ if (check_policy(__FILE__)) {
+ printf("[|pfsync policy violation] ");
+ goto out;
+ }
+
if (caplen < PFSYNC_HDRLEN) {
printf("[|pfsync]");
goto out;
@@ -140,6 +147,11 @@ pfsync_print(struct pfsync_header *hdr,
struct pfsync_subheader *subh;
int count, plen, alen, flags = 0;
int i;
+
+ if (check_policy(__FILE__)) {
+ printf("[|pfsync policy violation] ");
+ return;
+ }
plen = ntohs(hdr->len);
Index: print-pim.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-pim.c,v
retrieving revision 1.9
diff -u -p -u -r1.9 print-pim.c
--- print-pim.c 24 Jan 2020 22:46:37 -0000 1.9
+++ print-pim.c 7 Mar 2023 06:47:38 -0000
@@ -38,11 +38,18 @@
#include "interface.h"
#include "addrtoname.h"
+extern int check_policy(char *filename);
+
void
pim_print(const u_char *bp, u_int len)
{
const u_char *ep;
u_char type;
+
+ if (check_policy(__FILE__)) {
+ printf("[|pim policy violation] ");
+ return;
+ }
ep = (const u_char *)snapend;
if (bp >= ep)
Index: print-ppp.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-ppp.c,v
retrieving revision 1.36
diff -u -p -u -r1.36 print-ppp.c
--- print-ppp.c 1 Dec 2021 18:28:46 -0000 1.36
+++ print-ppp.c 7 Mar 2023 06:47:38 -0000
@@ -46,6 +46,8 @@
#include "addrtoname.h"
#include "extract.h"
+extern int check_policy(char *filename);
+
#ifndef nitems
#define nitems(_a) (sizeof((_a)) / sizeof((_a)[0]))
#endif
@@ -338,6 +340,11 @@ ppp_print(const u_char *p, u_int length)
uint16_t proto;
int l;
+ if (check_policy(__FILE__)) {
+ printf("[|ppp policy violation] ");
+ return;
+ }
+
l = snapend - p;
if (l < sizeof(proto)) {
@@ -1157,6 +1164,11 @@ ppp_if_print(u_char *user, const struct
ts_print(&h->ts);
+ if (check_policy(__FILE__)) {
+ printf("[|ppp policy violation] ");
+ return;
+ }
+
ppp_hdlc_print(p, length);
if (xflag)
@@ -1178,6 +1190,11 @@ ppp_ether_if_print(u_char *user, const s
ts_print(&h->ts);
+ if (check_policy(__FILE__)) {
+ printf("[|pppoe/ppp policy violation] ");
+ return;
+ }
+
if (eflag)
printf("PPPoE ");
@@ -1236,6 +1253,11 @@ int
pppoe_if_print(u_short ethertype, const u_char *p, u_int length, u_int l)
{
uint16_t pppoe_sid, pppoe_len;
+
+ if (check_policy(__FILE__)) {
+ printf("[|ppp policy violation] ");
+ return (1);
+ }
if (ethertype == ETHERTYPE_PPPOEDISC)
printf("PPPoE-Discovery");
Index: print-radius.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-radius.c,v
retrieving revision 1.13
diff -u -p -u -r1.13 print-radius.c
--- print-radius.c 24 Jan 2020 22:46:37 -0000 1.13
+++ print-radius.c 7 Mar 2023 06:47:38 -0000
@@ -39,6 +39,8 @@
#include "interface.h"
#include "radius.h"
+extern int check_policy(char *filename);
+
static void r_print_att(int code, int len, const u_char *val);
static void r_print_int(int code, int len, const u_char *val);
static void r_print_address(int code, int len, const u_char *val);
@@ -239,6 +241,11 @@ void radius_print(const u_char *data, u_
const struct radius_header *rhp;
const u_char *pp;
int first, l, ac, al;
+
+ if (check_policy(__FILE__)) {
+ printf("[|radius policy violation] ");
+ return;
+ }
if(len < sizeof(struct radius_header)) {
printf("[|radius]");
Index: print-raw.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-raw.c,v
retrieving revision 1.9
diff -u -p -u -r1.9 print-raw.c
--- print-raw.c 1 Dec 2021 18:28:46 -0000 1.9
+++ print-raw.c 7 Mar 2023 06:47:38 -0000
@@ -43,6 +43,8 @@
#include "addrtoname.h"
#include "interface.h"
+extern int check_policy(char *filename);
+
#ifndef AF_NS
#define AF_NS 6 /* XEROX NS protocols */
#endif
@@ -58,6 +60,11 @@ raw_if_print(u_char *user, const struct
u_int caplen = h->caplen;
ts_print(&h->ts);
+
+ if (check_policy(__FILE__)) {
+ printf("[|raw policy violation] ");
+ return;
+ }
/*
* Some printers want to get back at the link level addresses,
Index: print-rip.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-rip.c,v
retrieving revision 1.18
diff -u -p -u -r1.18 print-rip.c
--- print-rip.c 24 Jan 2020 22:46:37 -0000 1.18
+++ print-rip.c 7 Mar 2023 06:47:38 -0000
@@ -38,6 +38,8 @@
#include "addrtoname.h"
#include "extract.h" /* must come after interface.h */
+extern int check_policy(char *filename);
+
struct rip {
u_char rip_cmd; /* request/response */
u_char rip_vers; /* protocol version # */
@@ -156,6 +158,11 @@ rip_print(const u_char *dat, u_int lengt
const struct rip *rp;
const struct rip_netinfo *ni;
int i, j, trunc;
+
+ if (check_policy(__FILE__)) {
+ printf("[|rip policy violation] ");
+ return;
+ }
i = min(length, snapend - dat) - sizeof(*rp);
if (i < 0) {
Index: print-ripng.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-ripng.c,v
retrieving revision 1.7
diff -u -p -u -r1.7 print-ripng.c
--- print-ripng.c 22 Oct 2018 16:12:45 -0000 1.7
+++ print-ripng.c 7 Mar 2023 06:47:38 -0000
@@ -40,6 +40,8 @@
#include "interface.h"
#include "addrtoname.h"
+extern int check_policy(char *filename);
+
static int
rip6_entry_print(const struct netinfo6 *ni, int metric)
{
@@ -62,6 +64,11 @@ ripng_print(const u_char *dat, int lengt
(sizeof(struct rip6) - sizeof(struct netinfo6));
int j;
int trunc;
+
+ if (check_policy(__FILE__)) {
+ printf("[|ripng policy violation] ");
+ return;
+ }
if (i < 0)
return;
Index: print-rt6.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-rt6.c,v
retrieving revision 1.10
diff -u -p -u -r1.10 print-rt6.c
--- print-rt6.c 28 Dec 2022 21:30:19 -0000 1.10
+++ print-rt6.c 7 Mar 2023 06:47:38 -0000
@@ -44,6 +44,8 @@
#include "interface.h"
#include "addrtoname.h"
+extern int check_policy(char *filename);
+
int
rt6_print(const u_char *bp, const u_char *bp2)
{
@@ -51,6 +53,11 @@ rt6_print(const u_char *bp, const u_char
const struct ip6_rthdr0 *dp0;
const u_char *ep;
int i, len;
+
+ if (check_policy(__FILE__)) {
+ printf("[|rt6 policy violation] ");
+ return 65535; /* XXX */
+ }
dp = (struct ip6_rthdr *)bp;
len = dp->ip6r_len;
Index: print-sl.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-sl.c,v
retrieving revision 1.22
diff -u -p -u -r1.22 print-sl.c
--- print-sl.c 1 Dec 2021 18:28:46 -0000 1.22
+++ print-sl.c 7 Mar 2023 06:47:38 -0000
@@ -46,6 +46,8 @@
#include "addrtoname.h"
#include "extract.h" /* must come after interface.h */
+extern int check_policy(char *filename);
+
static u_int lastlen[2][256];
static u_int lastconn = 255;
@@ -76,6 +78,11 @@ sl_if_print(u_char *user, const struct p
const struct ip *ip;
ts_print(&h->ts);
+
+ if (check_policy(__FILE__)) {
+ printf("[|sl policy violation] ");
+ goto out;
+ }
if (caplen < SLIP_HDRLEN || length < SLIP_HDRLEN) {
printf("[|slip]");
Index: print-slow.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-slow.c,v
retrieving revision 1.4
diff -u -p -u -r1.4 print-slow.c
--- print-slow.c 16 Nov 2015 00:16:39 -0000 1.4
+++ print-slow.c 7 Mar 2023 06:47:38 -0000
@@ -37,6 +37,7 @@
#include "extract.h"
#include "addrtoname.h"
+extern int check_policy(char *filename);
struct slow_common_header {
u_int8_t proto_subtype;
@@ -130,6 +131,11 @@ slow_print(const u_char *pptr, u_int len
struct lacp_tlv_collector_info_t *collector_info;
struct marker_tlv_marker_info_t *marker_tlv_marker_info;
} tlv_ptr;
+
+ if (check_policy(__FILE__)) {
+ printf("[|slow policy violation] ");
+ return;
+ }
tptr = pptr;
slow_com_header = (const struct slow_common_header *)pptr;
Index: print-snmp.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-snmp.c,v
retrieving revision 1.28
diff -u -p -u -r1.28 print-snmp.c
--- print-snmp.c 23 Oct 2021 10:47:50 -0000 1.28
+++ print-snmp.c 7 Mar 2023 06:47:38 -0000
@@ -64,6 +64,9 @@
#include "interface.h"
#include "addrtoname.h"
+extern int check_policy(char *filename);
+
+
/*
* Universal ASN.1 types
* (we only care about the tag values for those allowed in the Internet SMI)
@@ -1428,6 +1431,11 @@ snmp_print(const u_char *np, u_int lengt
{
struct be elem;
int count = 0;
+
+ if (check_policy(__FILE__)) {
+ printf("[|snmp policy violation] ");
+ return;
+ }
truncated = 0;
Index: print-stp.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-stp.c,v
retrieving revision 1.10
diff -u -p -u -r1.10 print-stp.c
--- print-stp.c 1 Dec 2021 18:28:46 -0000 1.10
+++ print-stp.c 7 Mar 2023 06:47:38 -0000
@@ -55,6 +55,8 @@
#include "extract.h"
#include "llc.h"
+extern int check_policy(char *filename);
+
#define STP_MSGTYPE_CBPDU 0x00
#define STP_MSGTYPE_RSTP 0x02
#define STP_MSGTYPE_TBPDU 0x80
@@ -91,6 +93,11 @@ stp_print(p, len)
{
u_int16_t id;
int proto = STP_PROTO_STP;
+
+ if (check_policy(__FILE__)) {
+ printf("[|stp policy violation] ");
+ return;
+ }
if (len < 3)
goto truncated;
Index: print-sunrpc.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-sunrpc.c,v
retrieving revision 1.22
diff -u -p -u -r1.22 print-sunrpc.c
--- print-sunrpc.c 5 Jan 2022 05:29:54 -0000 1.22
+++ print-sunrpc.c 7 Mar 2023 06:47:38 -0000
@@ -46,6 +46,8 @@
#include "addrtoname.h"
#include "privsep.h"
+extern int check_policy(char *filename);
+
static struct tok proc2str[] = {
{ PMAPPROC_NULL, "null" },
{ PMAPPROC_SET, "set" },
@@ -64,6 +66,11 @@ sunrpcrequest_print(const u_char *bp, u_
{
const struct rpc_msg *rp;
u_int32_t x;
+
+ if (check_policy(__FILE__)) {
+ printf("[|sunrpc policy violation] ");
+ return;
+ }
rp = (struct rpc_msg *)bp;
Index: print-tcp.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-tcp.c,v
retrieving revision 1.39
diff -u -p -u -r1.39 print-tcp.c
--- print-tcp.c 24 Jan 2020 22:46:37 -0000 1.39
+++ print-tcp.c 7 Mar 2023 06:47:38 -0000
@@ -45,6 +45,8 @@
#include "nfs.h"
+extern int check_policy(char *filename);
+
static void print_tcp_rst_data(const u_char *sp, u_int length);
#define MAX_RST_DATA_LEN 30
@@ -189,6 +191,11 @@ tcp_print(const u_char *bp, u_int length
u_int16_t sport, dport, win, urp;
tcp_seq seq, ack;
const struct ip6_hdr *ip6;
+
+ if (check_policy(__FILE__)) {
+ printf("[|tcp policy violation] ");
+ return;
+ }
tp = (struct tcphdr *)bp;
switch (((struct ip *)bp2)->ip_v) {
Index: print-tftp.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-tftp.c,v
retrieving revision 1.14
diff -u -p -u -r1.14 print-tftp.c
--- print-tftp.c 24 Jan 2020 22:46:37 -0000 1.14
+++ print-tftp.c 7 Mar 2023 06:47:38 -0000
@@ -39,6 +39,8 @@
#include "interface.h"
#include "addrtoname.h"
+extern int check_policy(char *filename);
+
/* op code to string mapping */
static struct tok op2str[] = {
{ RRQ, "RRQ" }, /* read request */
@@ -73,6 +75,11 @@ tftp_print(const u_char *bp, u_int lengt
const u_char *p;
int opcode, i;
static char tstr[] = " [|tftp]";
+
+ if (check_policy(__FILE__)) {
+ printf("[|tftp policy violation] ");
+ return;
+ }
tp = (const struct tftphdr *)bp;
Index: print-timed.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-timed.c,v
retrieving revision 1.8
diff -u -p -u -r1.8 print-timed.c
--- print-timed.c 24 Jan 2020 22:46:37 -0000 1.8
+++ print-timed.c 7 Mar 2023 06:47:39 -0000
@@ -42,6 +42,8 @@
#include "addrtoname.h"
#include "extract.h" /* must come after interface.h */
+extern int check_policy(char *filename);
+
static const char *tsptype[TSPTYPENUMBER] =
{ "ANY", "ADJTIME", "ACK", "MASTERREQ", "MASTERACK", "SETTIME", "MASTERUP",
"SLAVEUP", "ELECTION", "ACCEPT", "REFUSE", "CONFLICT", "RESOLVE", "QUIT",
@@ -55,6 +57,11 @@ timed_print(const u_char *bp, u_int leng
struct tsp *tsp = (struct tsp *)bp;
long sec, usec;
const u_char *end;
+
+ if (check_policy(__FILE__)) {
+ printf("[|timed policy violation] ");
+ return;
+ }
TCHECK(tsp->tsp_type);
if (tsp->tsp_type < TSPTYPENUMBER)
Index: print-udp.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-udp.c,v
retrieving revision 1.56
diff -u -p -u -r1.56 print-udp.c
--- print-udp.c 17 Aug 2020 06:29:29 -0000 1.56
+++ print-udp.c 7 Mar 2023 06:47:39 -0000
@@ -59,6 +59,8 @@
#include "bootp.h"
#include "iapp.h"
+extern int check_policy(char *filename);
+
struct rtcphdr {
u_short rh_flags; /* T:2 P:1 CNT:5 PT:8 */
u_short rh_len; /* length of message (in words) */
@@ -326,6 +328,11 @@ udp_print(const u_char *bp, u_int length
const char *ipsrc = NULL, *ipdst = NULL;
unsigned int ipv = 0;
uint32_t cksum = 0;
+
+ if (check_policy(__FILE__)) {
+ printf("[|udp policy violation] ");
+ return;
+ }
if (ep > snapend)
ep = snapend;
Index: print-udpencap.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-udpencap.c,v
retrieving revision 1.7
diff -u -p -u -r1.7 print-udpencap.c
--- print-udpencap.c 24 Jan 2020 22:46:37 -0000 1.7
+++ print-udpencap.c 7 Mar 2023 06:47:39 -0000
@@ -29,10 +29,17 @@
#include "interface.h"
+extern int check_policy(char *filename);
+
void
udpencap_print(const u_char *bp, u_int len, const u_char *bp2)
{
u_int32_t *spi;
+
+ if (check_policy(__FILE__)) {
+ printf("[|udpencap policy violation] ");
+ return;
+ }
/* Recognize NAT-T Keepalive msgs. (draft-ietf-ipsec-udp-encaps-nn) */
if (len == 1 && *bp == 0xFF) {
Index: print-usbpcap.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-usbpcap.c,v
retrieving revision 1.5
diff -u -p -u -r1.5 print-usbpcap.c
--- print-usbpcap.c 23 Mar 2020 09:38:26 -0000 1.5
+++ print-usbpcap.c 7 Mar 2023 06:47:39 -0000
@@ -23,6 +23,8 @@
#include "interface.h"
+extern int check_policy(char *filename);
+
#ifndef nitems
#define nitems(_a) (sizeof((_a)) / sizeof((_a)[0]))
#endif
@@ -47,6 +49,11 @@ usbpcap_if_print(u_char *user, const str
u_int16_t hdrlen;
ts_print(&h->ts);
+
+ if (check_policy(__FILE__)) {
+ printf("[|usbpcap policy violation] ");
+ return;
+ }
/* check length */
if (caplen < sizeof(uint16_t) || length < sizeof(*uph))
Index: print-vqp.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-vqp.c,v
retrieving revision 1.8
diff -u -p -u -r1.8 print-vqp.c
--- print-vqp.c 6 Jul 2018 05:47:22 -0000 1.8
+++ print-vqp.c 7 Mar 2023 06:47:39 -0000
@@ -58,6 +58,8 @@
#include "addrtoname.h"
#include "extract.h"
+extern int check_policy(char *filename);
+
struct vqp_hdr {
u_char version;
u_char opcode;
@@ -215,6 +217,11 @@ vqp_print(const u_char *bp, u_int len)
{
struct vqp_hdr *p = (struct vqp_hdr *)bp;
u_int dcount;
+
+ if (check_policy(__FILE__)) {
+ printf("[|vqp policy violation] ");
+ return;
+ }
TCHECK(p->version);
printf("VQPv%u", p->version);
Index: print-vrrp.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-vrrp.c,v
retrieving revision 1.4
diff -u -p -u -r1.4 print-vrrp.c
--- print-vrrp.c 16 Nov 2015 00:16:39 -0000 1.4
+++ print-vrrp.c 7 Mar 2023 06:47:39 -0000
@@ -42,6 +42,8 @@
#include "extract.h"
#include "addrtoname.h"
+extern int check_policy(char *filename);
+
/*
* RFC 2338:
* 0 1 2 3
@@ -69,6 +71,11 @@ vrrp_print(const u_char *bp, u_int len,
{
int version, type, auth_type;
char *type_s;
+
+ if (check_policy(__FILE__)) {
+ printf("[|vrrp policy violation] ");
+ return;
+ }
TCHECK(bp[0]);
version = (bp[0] & 0xf0) >> 4;
Index: print-wb.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-wb.c,v
retrieving revision 1.11
diff -u -p -u -r1.11 print-wb.c
--- print-wb.c 6 Jul 2018 05:47:22 -0000 1.11
+++ print-wb.c 7 Mar 2023 06:47:39 -0000
@@ -31,6 +31,8 @@
#include "interface.h"
#include "addrtoname.h"
+extern int check_policy(char *filename);
+
/* XXX need to add byte-swapping macros! */
/*
@@ -379,6 +381,11 @@ void
wb_print(const void *hdr, u_int len)
{
const struct pkt_hdr *ph;
+
+ if (check_policy(__FILE__)) {
+ printf("[|wb policy violation] ");
+ return;
+ }
ph = (const struct pkt_hdr *)hdr;
len -= sizeof(*ph);
Index: print-wg.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-wg.c,v
retrieving revision 1.7
diff -u -p -u -r1.7 print-wg.c
--- print-wg.c 16 Sep 2021 12:35:20 -0000 1.7
+++ print-wg.c 7 Mar 2023 06:47:39 -0000
@@ -25,6 +25,8 @@
#include "interface.h"
#include "extract.h"
+extern int check_policy(char *filename);
+
#define INITIATION 1
#define RESPONSE 2
#define COOKIE 3
@@ -103,6 +105,11 @@ wg_print(const u_char *bp, u_int length)
struct wg_cookie *cookie = (void *)bp;
struct wg_data *data = (void *)bp;
u_int caplen;
+
+ if (check_policy(__FILE__)) {
+ printf("[|wg policy violation] ");
+ return;
+ }
caplen = snapend - bp;
if (caplen < sizeof(type))
Index: privsep.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/privsep.c,v
retrieving revision 1.57
diff -u -p -u -r1.57 privsep.c
--- privsep.c 24 Oct 2021 21:24:19 -0000 1.57
+++ privsep.c 7 Mar 2023 06:47:39 -0000
@@ -71,7 +71,7 @@ enum priv_state {
*/
static const int allowed_max[] = {
/* INIT */ ALLOW(PRIV_OPEN_BPF) | ALLOW(PRIV_OPEN_DUMP) |
- ALLOW(PRIV_SETFILTER),
+ ALLOW(PRIV_SETFILTER) | ALLOW(PRIV_OPEN_CONF),
/* BPF */ ALLOW(PRIV_SETFILTER),
/* FILTER */ ALLOW(PRIV_OPEN_PFOSFP) | ALLOW(PRIV_OPEN_OUTPUT) |
ALLOW(PRIV_GETSERVENTRIES) |
@@ -88,7 +88,7 @@ static const int allowed_max[] = {
* later depending on the supplied parameters.
*/
static int allowed_ext[] = {
- /* INIT */ ALLOW(PRIV_SETFILTER),
+ /* INIT */ ALLOW(PRIV_SETFILTER) | ALLOW(PRIV_OPEN_CONF),
/* BPF */ ALLOW(PRIV_SETFILTER),
/* FILTER */ ALLOW(PRIV_GETSERVENTRIES),
/* RUN */ ALLOW(PRIV_LOCALTIME) | ALLOW(PRIV_PCAP_STATS),
@@ -106,6 +106,7 @@ static void drop_privs(int);
static void impl_open_bpf(int, int *);
static void impl_open_dump(int, const char *);
+static void impl_open_conf(int, const char *);
static void impl_open_pfosfp(int);
static void impl_open_output(int, const char *);
static void impl_setfilter(int, char *, int *);
@@ -224,7 +225,7 @@ priv_exec(int argc, char *argv[])
/* parse the arguments for required options */
opterr = 0;
while ((i = getopt(argc, argv,
- "aB:c:D:deE:fF:i:lLnNOopPqr:s:StT:vw:xXy:")) != -1) {
+ "aB:c:D:deE:fF:i:lLnNOopPqr:s:StT:vw:xXY:y:")) != -1) {
switch (i) {
case 'n':
nflag++;
@@ -250,6 +251,7 @@ priv_exec(int argc, char *argv[])
Pflag = 1;
break;
+ case 'Y':
default:
/* nothing */
break;
@@ -259,6 +261,9 @@ priv_exec(int argc, char *argv[])
if (!Pflag)
errx(1, "exec without priv");
+ /* /etc/tcpdump.conf policies file */
+ allowed_ext[STATE_INIT] |= ALLOW(PRIV_OPEN_CONF);
+
if (RFileName != NULL) {
if (strcmp(RFileName, "-") != 0)
allowed_ext[STATE_INIT] |= ALLOW(PRIV_OPEN_DUMP);
@@ -298,6 +303,10 @@ priv_exec(int argc, char *argv[])
test_state(cmd, STATE_BPF);
impl_open_dump(sock, RFileName);
break;
+ case PRIV_OPEN_CONF:
+ test_state(cmd, STATE_INIT);
+ impl_open_conf(sock, "/etc/tcpdump.conf");
+ break;
case PRIV_OPEN_PFOSFP:
test_state(cmd, STATE_FILTER);
impl_open_pfosfp(sock);
@@ -392,6 +401,29 @@ impl_open_bpf(int fd, int *bpfd)
}
static void
+impl_open_conf(int fd, const char *FileName)
+{
+ int file, err = 0;
+
+ logmsg(LOG_DEBUG, "[priv]: msg PRIV_OPEN_CONF received");
+
+ if (FileName == NULL) {
+ file = -1;
+ logmsg(LOG_ERR, "[priv]: No offline conf file specified");
+ } else {
+ file = open(FileName, O_RDONLY);
+ err = errno;
+ if (file == -1)
+ logmsg(LOG_DEBUG, "[priv]: failed to open %s: %s",
+ FileName, strerror(errno));
+ }
+ send_fd(fd, file);
+ must_write(fd, &err, sizeof(int));
+ if (file >= 0)
+ close(file);
+}
+
+static void
impl_open_dump(int fd, const char *RFileName)
{
int file, err = 0;
@@ -775,6 +807,22 @@ priv_open_pfosfp(void)
must_read(priv_fd, &err, sizeof(int));
if (fd < 0) {
warnc(err, "%s", PF_OSFP_FILE);
+ return (-1);
+ }
+
+ return (fd);
+}
+
+int
+priv_open_conf(void)
+{
+ int fd, err = 0;
+ write_command(priv_fd, PRIV_OPEN_CONF);
+
+ fd = receive_fd(priv_fd);
+ must_read(priv_fd, &err, sizeof(int));
+ if (fd < 0) {
+ warnc(err, "/etc/tcpdump.conf");
return (-1);
}
Index: privsep.h
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/privsep.h,v
retrieving revision 1.12
diff -u -p -u -r1.12 privsep.h
--- privsep.h 18 Mar 2019 00:09:22 -0000 1.12
+++ privsep.h 7 Mar 2023 06:47:39 -0000
@@ -34,7 +34,8 @@ enum cmd_types {
PRIV_GETPROTOENTRIES, /* get the ip protocol entries table */
PRIV_LOCALTIME, /* return localtime */
PRIV_INIT_DONE, /* signal that the initialization is done */
- PRIV_PCAP_STATS /* get pcap_stats() results */
+ PRIV_PCAP_STATS, /* get pcap_stats() results */
+ PRIV_OPEN_CONF /* open /etc/tcpdump.conf for policies */
};
struct ether_addr;
@@ -74,6 +75,9 @@ size_t priv_getprotoentry(char *, size_t
/* Retrieve pf.os(5) fingerprints file descriptor */
int priv_open_pfosfp();
+
+/* Retrieve /etc/tcpdump.conf */
+int priv_open_conf(void);
/* Return the pcap statistics upon completion */
int priv_pcap_stats(struct pcap_stat *);
Index: tcpdump.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/tcpdump.c,v
retrieving revision 1.99
diff -u -p -u -r1.99 tcpdump.c
--- tcpdump.c 3 Mar 2023 13:03:29 -0000 1.99
+++ tcpdump.c 7 Mar 2023 06:47:39 -0000
@@ -84,12 +84,14 @@ int packettype;
char *program_name;
char *device = NULL;
+char *policyname = "default";
int32_t thiszone; /* seconds offset from gmt to local time */
extern volatile pid_t child_pid;
/* Externs */
+extern struct tcpdump_conf * tcpd_parse_config(int);
extern void bpf_dump(struct bpf_program *, int);
extern int esp_init(char *);
@@ -233,7 +235,7 @@ main(int argc, char **argv)
opterr = 0;
while ((op = getopt(argc, argv,
- "AaB:c:D:deE:fF:i:IlLnNOopqr:s:StT:vw:xXy:")) != -1)
+ "AaB:c:D:deE:fF:i:IlLnNOopqr:s:StT:vw:xXY:y:")) != -1)
switch (op) {
case 'A':
@@ -393,6 +395,10 @@ main(int argc, char **argv)
WFileName = optarg;
break;
+ case 'Y':
+ policyname = optarg;
+ break;
+
case 'y':
i = pcap_datalink_name_to_val(optarg);
if (i < 0)
@@ -418,6 +424,9 @@ main(int argc, char **argv)
usage();
/* NOTREACHED */
}
+
+ if (tcpd_parse_config(0) == NULL)
+ exit(1);
if (snaplen == 0) {
switch (dlt) {
Index: tcpdump.conf
===================================================================
RCS file: tcpdump.conf
diff -N tcpdump.conf
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ tcpdump.conf 7 Mar 2023 06:47:39 -0000
@@ -0,0 +1,13 @@
+# $OpenBSD$
+# /etc/tcpdump.conf policy file
+
+L2="ether, llc"
+L3="ip, ip6, arp"
+L4="icmp, tcp, udp, icmp6"
+L7="domain"
+
+# the default policy
+policy default { $L2, $L3, $L4, $L7 }
+
+# only allow ethernet
+policy ethernet { ether, llc }
dmesg:
see previous mails...