[PATCH 8/8] tcpdump: Do not use signals and chroot

Sebastian Huber sebastian.huber at embedded-brains.de
Wed May 11 06:56:41 UTC 2022


Update #4650.
---
 freebsd/contrib/tcpdump/tcpdump.c | 22 ++++++++++++++++++++--
 1 file changed, 20 insertions(+), 2 deletions(-)

diff --git a/freebsd/contrib/tcpdump/tcpdump.c b/freebsd/contrib/tcpdump/tcpdump.c
index 73e2e844..5b658412 100644
--- a/freebsd/contrib/tcpdump/tcpdump.c
+++ b/freebsd/contrib/tcpdump/tcpdump.c
@@ -207,8 +207,10 @@ cap_channel_t *capdns;
 static void error(FORMAT_STRING(const char *), ...) NORETURN PRINTFLIKE(1, 2);
 static void warning(FORMAT_STRING(const char *), ...) PRINTFLIKE(1, 2);
 static void exit_tcpdump(int) NORETURN;
+#ifndef __rtems__
 static RETSIGTYPE cleanup(int);
 static RETSIGTYPE child_cleanup(int);
+#endif /* __rtems__ */
 static void print_version(void);
 static void print_usage(void);
 static void show_tstamp_types_and_exit(pcap_t *, const char *device) NORETURN;
@@ -220,6 +222,7 @@ static void show_devices_and_exit (void) NORETURN;
 static void print_packet(u_char *, const struct pcap_pkthdr *, const u_char *);
 static void dump_packet_and_trunc(u_char *, const struct pcap_pkthdr *, const u_char *);
 static void dump_packet(u_char *, const struct pcap_pkthdr *, const u_char *);
+#ifndef __rtems__
 static void droproot(const char *, const char *);
 
 #ifdef SIGNAL_REQ_INFO
@@ -233,6 +236,7 @@ RETSIGTYPE requestinfo(int);
 #elif defined(HAVE_ALARM)
   static void verbose_stats_dump(int sig);
 #endif
+#endif /* __rtems__ */
 
 static void info(int);
 static u_int packets_captured;
@@ -624,6 +628,7 @@ static const struct option longopts[] = {
 	{ NULL, 0, NULL, 0 }
 };
 
+#ifndef __rtems__
 #ifndef _WIN32
 /* Drop root privileges and chroot if necessary */
 static void
@@ -655,7 +660,6 @@ droproot(const char *username, const char *chroot_dir)
 				fprintf(stderr, "dropped privs to %s\n", username);
 		}
 #else
-#ifndef __rtems__
 		if (initgroups(pw->pw_name, pw->pw_gid) != 0 ||
 		    setgid(pw->pw_gid) != 0 || setuid(pw->pw_uid) != 0) {
 			fprintf(stderr, "%s: Couldn't change to '%.32s' uid=%lu gid=%lu: %s\n",
@@ -668,7 +672,6 @@ droproot(const char *username, const char *chroot_dir)
 		else {
 			fprintf(stderr, "dropped privs to %s\n", username);
 		}
-#endif /* __rtems__ */
 #endif /* HAVE_LIBCAP_NG */
 	}
 	else {
@@ -690,6 +693,7 @@ droproot(const char *username, const char *chroot_dir)
 
 }
 #endif /* _WIN32 */
+#endif /* __rtems__ */
 
 static int
 getWflagChars(int x)
@@ -1294,15 +1298,19 @@ main(int argc, char **argv)
 	int dlt;
 	const char *dlt_name;
 	struct bpf_program fcode;
+#ifndef __rtems__
 #ifndef _WIN32
 	RETSIGTYPE (*oldhandler)(int);
 #endif
+#endif /* __rtems__ */
 	struct dump_info dumpinfo;
 	u_char *pcap_userdata;
 	char ebuf[PCAP_ERRBUF_SIZE];
 	char VFileLine[PATH_MAX + 1];
+#ifndef __rtems__
 	char *username = NULL;
 	char *chroot_dir = NULL;
+#endif /* __rtems__ */
 	char *ret = NULL;
 	char *end;
 #ifdef HAVE_PCAP_FINDALLDEVS
@@ -1674,9 +1682,11 @@ main(int argc, char **argv)
 			zflag = optarg;
 			break;
 
+#ifndef __rtems__
 		case 'Z':
 			username = optarg;
 			break;
+#endif /* __rtems__ */
 
 		case '#':
 			ndo->ndo_packet_number = 1;
@@ -1973,6 +1983,7 @@ main(int argc, char **argv)
 
 	init_print(ndo, localnet, netmask, timezone_offset);
 
+#ifndef __rtems__
 #ifndef _WIN32
 	(void)setsignal(SIGPIPE, cleanup);
 	(void)setsignal(SIGTERM, cleanup);
@@ -2040,6 +2051,7 @@ main(int argc, char **argv)
 
 	}
 #endif /* _WIN32 */
+#endif /* __rtems__ */
 
 	if (pcap_setfilter(pd, &fcode) < 0)
 		error("%s", pcap_geterr(pd));
@@ -2147,6 +2159,7 @@ main(int argc, char **argv)
 		pcap_userdata = (u_char *)ndo;
 	}
 
+#ifndef __rtems__
 #ifdef SIGNAL_REQ_INFO
 	/*
 	 * We can't get statistics when reading from a file rather
@@ -2171,6 +2184,7 @@ main(int argc, char **argv)
 		alarm(1);
 #endif
 	}
+#endif /* __rtems__ */
 
 	if (RFileName == NULL) {
 		/*
@@ -2344,6 +2358,7 @@ main(int argc, char **argv)
 	exit_tcpdump(status == -1 ? 1 : 0);
 }
 
+#ifndef __rtems__
 /* make a clean exit on interrupts */
 static RETSIGTYPE
 cleanup(int signo _U_)
@@ -2396,6 +2411,7 @@ child_cleanup(int signo _U_)
   wait(NULL);
 }
 #endif /* HAVE_FORK && HAVE_VFORK */
+#endif /* __rtems__ */
 
 static void
 info(register int verbose)
@@ -2756,6 +2772,7 @@ print_packet(u_char *user, const struct pcap_pkthdr *h, const u_char *sp)
 	char Wpcap_version[]="3.1";
 #endif
 
+#ifndef __rtems__
 #ifdef SIGNAL_REQ_INFO
 RETSIGTYPE requestinfo(int signo _U_)
 {
@@ -2784,6 +2801,7 @@ static void verbose_stats_dump(int sig _U_)
 	alarm(1);
 }
 #endif
+#endif /* __rtems__ */
 
 USES_APPLE_DEPRECATED_API
 static void
-- 
2.35.3



More information about the devel mailing list