]> The Tcpdump Group git mirrors - tcpdump/blobdiff - tcpdump.c
domain: handle too-short URI RRs correctly.
[tcpdump] / tcpdump.c
index 0b6541589f018fd61121bcb66a9fd6262d44346d..c657707fbb40019ebecdfa09f2a583af82ff3b0b 100644 (file)
--- a/tcpdump.c
+++ b/tcpdump.c
@@ -38,7 +38,7 @@
 #endif
 
 /*
- * Some older versions of Mac OS X may ship pcap.h from libpcap 0.6 with a
+ * Some older versions of Mac OS X ship pcap.h from libpcap 0.6 with a
  * libpcap based on 0.8.  That means it has pcap_findalldevs() but the
  * header doesn't define pcap_if_t, meaning that we can't actually *use*
  * pcap_findalldevs().
@@ -433,15 +433,15 @@ show_tstamp_types_and_exit(pcap_t *pc, const char *device)
                    device);
                exit_tcpdump(S_SUCCESS);
        }
-       fprintf(stderr, "Time stamp types for %s (use option -j to set):\n",
+       fprintf(stdout, "Time stamp types for %s (use option -j to set):\n",
            device);
        for (i = 0; i < n_tstamp_types; i++) {
                tstamp_type_name = pcap_tstamp_type_val_to_name(tstamp_types[i]);
                if (tstamp_type_name != NULL) {
-                       (void) fprintf(stderr, "  %s (%s)\n", tstamp_type_name,
+                       (void) fprintf(stdout, "  %s (%s)\n", tstamp_type_name,
                            pcap_tstamp_type_val_to_description(tstamp_types[i]));
                } else {
-                       (void) fprintf(stderr, "  %d\n", tstamp_types[i]);
+                       (void) fprintf(stdout, "  %d\n", tstamp_types[i]);
                }
        }
        pcap_free_tstamp_types(tstamp_types);
@@ -470,28 +470,30 @@ show_dlts_and_exit(pcap_t *pc, const char *device)
         * monitor mode might be different from the ones available when
         * not in monitor mode).
         */
+       (void) fprintf(stdout, "Data link types for ");
        if (supports_monitor_mode)
-               (void) fprintf(stderr, "Data link types for %s %s (use option -y to set):\n",
+               (void) fprintf(stdout, "%s %s",
                    device,
                    Iflag ? "when in monitor mode" : "when not in monitor mode");
        else
-               (void) fprintf(stderr, "Data link types for %s (use option -y to set):\n",
+               (void) fprintf(stdout, "%s",
                    device);
+       (void) fprintf(stdout, " (use option -y to set):\n");
 
        for (i = 0; i < n_dlts; i++) {
                dlt_name = pcap_datalink_val_to_name(dlts[i]);
                if (dlt_name != NULL) {
-                       (void) fprintf(stderr, "  %s (%s)", dlt_name,
+                       (void) fprintf(stdout, "  %s (%s)", dlt_name,
                            pcap_datalink_val_to_description(dlts[i]));
 
                        /*
                         * OK, does tcpdump handle that type?
                         */
                        if (!has_printer(dlts[i]))
-                               (void) fprintf(stderr, " (printing not supported)");
-                       fprintf(stderr, "\n");
+                               (void) fprintf(stdout, " (printing not supported)");
+                       fprintf(stdout, "\n");
                } else {
-                       (void) fprintf(stderr, "  DLT %d (printing not supported)\n",
+                       (void) fprintf(stdout, "  DLT %d (printing not supported)\n",
                            dlts[i]);
                }
        }
@@ -806,7 +808,7 @@ droproot(const char *username, const char *chroot_dir)
        } else
                error("Couldn't find user '%.32s'", username);
 #ifdef HAVE_LIBCAP_NG
-       /* We don't need CAP_SETUID, CAP_SETGID and CAP_SYS_CHROOT any more. */
+       /* We don't need CAP_SETUID, CAP_SETGID and CAP_SYS_CHROOT anymore. */
 DIAG_OFF_ASSIGN_ENUM
        capng_updatev(
                CAPNG_DROP,
@@ -977,7 +979,7 @@ tstamp_precision_to_string(int precision)
  * along the lines of ioctl(), the fact that ioctl() operations are
  * largely specific to particular character devices but fcntl() operations
  * are either generic to all descriptors or generic to all descriptors for
- * regular files nonwithstanding.
+ * regular files notwithstanding.
  *
  * The Capsicum people decided that fine-grained control of descriptor
  * operations was required, so that you need to grant permission for
@@ -1558,6 +1560,13 @@ main(int argc, char **argv)
        if (abort_on_misalignment(ebuf, sizeof(ebuf)) < 0)
                error("%s", ebuf);
 
+       /*
+        * An explicit tzset() call is usually not needed as it happens
+        * implicitly the first time we call localtime() or mktime(),
+        * but in some cases (sandboxing, chroot) this may be too late.
+        */
+       tzset();
+
        while (
            (op = getopt_long(argc, argv, SHORTOPTS, longopts, NULL)) != -1)
                switch (op) {
@@ -1726,7 +1735,7 @@ main(int argc, char **argv)
                                if (nd_load_smi_module(optarg, ebuf, sizeof(ebuf)) == -1)
                                        error("%s", ebuf);
                        } else {
-                               (void)fprintf(stderr, "%s: ignoring option `-m %s' ",
+                               (void)fprintf(stderr, "%s: ignoring option '-m %s' ",
                                              program_name, optarg);
                                (void)fprintf(stderr, "(no libsmi support)\n");
                        }
@@ -1770,7 +1779,7 @@ main(int argc, char **argv)
                        else if (ascii_strcasecmp(optarg, "inout") == 0)
                                Qflag = PCAP_D_INOUT;
                        else
-                               error("unknown capture direction `%s'", optarg);
+                               error("unknown capture direction '%s'", optarg);
                        break;
 #endif /* HAVE_PCAP_SETDIRECTION */
 
@@ -1836,7 +1845,7 @@ main(int argc, char **argv)
                        else if (ascii_strcasecmp(optarg, "domain") == 0)
                                ndo->ndo_packettype = PT_DOMAIN;
                        else
-                               error("unknown packet type `%s'", optarg);
+                               error("unknown packet type '%s'", optarg);
                        break;
 
                case 'u':
@@ -1969,14 +1978,6 @@ main(int argc, char **argv)
                show_remote_devices_and_exit();
 #endif
 
-#if defined(DLT_LINUX_SLL2) && defined(HAVE_PCAP_SET_DATALINK)
-/* Set default linktype DLT_LINUX_SLL2 when capturing on the "any" device */
-               if (device != NULL &&
-                   strncmp (device, "any", strlen("any")) == 0
-                   && yflag_dlt == -1)
-                       yflag_dlt = DLT_LINUX_SLL2;
-#endif
-
        switch (ndo->ndo_tflag) {
 
        case 0: /* Default */
@@ -2026,6 +2027,8 @@ main(int argc, char **argv)
                /* Run with '-Z root' to restore old behaviour */
                if (!username)
                        username = WITH_USER;
+               else if (strcmp(username, "root") == 0)
+                       username = NULL;
        }
 #endif
 
@@ -2229,6 +2232,24 @@ main(int argc, char **argv)
                                      pcap_datalink_val_to_name(yflag_dlt));
                        (void)fflush(stderr);
                }
+#if defined(DLT_LINUX_SLL2) && defined(HAVE_PCAP_SET_DATALINK)
+               else {
+                       /*
+                        * Attempt to set default linktype to
+                        * DLT_LINUX_SLL2 when capturing on the
+                        * "any" device.
+                        *
+                        * If the attempt fails, just quietly drive
+                        * on; this may be a non-Linux "any" device
+                        * that doesn't support DLT_LINUX_SLL2.
+                        */
+                       if (strcmp(device, "any") == 0) {
+DIAG_OFF_WARN_UNUSED_RESULT
+                               (void) pcap_set_datalink(pd, DLT_LINUX_SLL2);
+DIAG_ON_WARN_UNUSED_RESULT
+                       }
+               }
+#endif
                i = pcap_snapshot(pd);
                if (ndo->ndo_snaplen < i) {
                        if (ndo->ndo_snaplen != 0)
@@ -2561,6 +2582,9 @@ DIAG_ON_ASSIGN_ENUM
 #else
        cansandbox = (cansandbox && ndo->ndo_nflag);
 #endif /* HAVE_CASPER */
+       cansandbox = (cansandbox && (pcap_fileno(pd) != -1 ||
+           RFileName != NULL));
+
        if (cansandbox && cap_enter() < 0 && errno != ENOSYS)
                error("unable to enter the capability mode");
 #endif /* HAVE_CAPSICUM */
@@ -2652,6 +2676,8 @@ DIAG_ON_ASSIGN_ENUM
                                         */
                                        dlt = new_dlt;
                                        ndo->ndo_if_printer = get_if_printer(dlt);
+                                       /* Free the old filter */
+                                       pcap_freecode(&fcode);
                                        if (pcap_compile(pd, &fcode, cmdbuf, Oflag, netmask) < 0)
                                                error("%s", pcap_geterr(pd));
                                }
@@ -2774,7 +2800,7 @@ cleanup(int signo _U_)
 static void
 child_cleanup(int signo _U_)
 {
-  wait(NULL);
+  while (waitpid(-1, NULL, WNOHANG) >= 0);
 }
 #endif /* HAVE_FORK && HAVE_VFORK */