git: 26f21a6494b4 - stable/14 - libpcap: Update to 1.10.5
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 08 Oct 2024 00:31:51 UTC
The branch stable/14 has been updated by jrm: URL: https://cgit.FreeBSD.org/src/commit/?id=26f21a6494b4cf791bc45d7ed3138bfab9f8f854 commit 26f21a6494b4cf791bc45d7ed3138bfab9f8f854 Author: Joseph Mingrone <jrm@FreeBSD.org> AuthorDate: 2024-09-14 17:09:34 +0000 Commit: Joseph Mingrone <jrm@FreeBSD.org> CommitDate: 2024-10-07 17:27:04 +0000 libpcap: Update to 1.10.5 Changes: https://git.tcpdump.org/libpcap/blob/bbcbc9174df3298a854daee2b3e666a4b6e5383a:/CHANGES Reviewed by: emaste Obtained from: https://www.tcpdump.org/release/libpcap-1.10.5.tar.gz Sponsored by: The FreeBSD Foundation (cherry picked from commit afdbf109c6a661a729938f68211054a0a50d38ac) (cherry picked from commit ecb75be376a3e18d3e4836b6ee07015264784694) (cherry picked from commit f0bcebe67ef6cf9f104535d6cd9f151c1b61dd6a) (cherry picked from commit 34aa6f2c2db5cc9655f201a1ef01adbb9fb484d5) --- contrib/libpcap/CHANGES | 181 +- contrib/libpcap/CMakeLists.txt | 1021 +- contrib/libpcap/CREDITS | 17 + contrib/libpcap/INSTALL.md | 84 +- contrib/libpcap/Makefile.in | 168 +- contrib/libpcap/TODO | 5 - contrib/libpcap/VERSION | 2 +- contrib/libpcap/aclocal.m4 | 227 +- contrib/libpcap/atmuni31.h | 2 +- contrib/libpcap/autogen.sh | 25 + contrib/libpcap/bpf_dump.c | 2 - contrib/libpcap/bpf_filter.c | 16 +- contrib/libpcap/bpf_image.c | 6 +- contrib/libpcap/charconv.c | 4 +- contrib/libpcap/cmake/Modules/Finddpdk.cmake | 2 +- contrib/libpcap/cmakeconfig.h.in | 6 +- contrib/libpcap/config.guess | 62 +- contrib/libpcap/config.h.in | 28 +- contrib/libpcap/config.sub | 230 +- contrib/libpcap/configure | 10815 ++++++++++--------- contrib/libpcap/configure.ac | 145 +- contrib/libpcap/diag-control.h | 174 +- contrib/libpcap/dlpisubs.c | 22 +- contrib/libpcap/doc/README.haiku.md | 57 + contrib/libpcap/doc/README.hpux | 2 +- .../doc/{README.Win32.md => README.windows.md} | 0 contrib/libpcap/etherent.c | 6 +- contrib/libpcap/extract.h | 2 +- contrib/libpcap/fad-getad.c | 30 +- contrib/libpcap/fad-gifc.c | 24 +- contrib/libpcap/fad-glifc.c | 28 +- contrib/libpcap/fmtutils.c | 59 +- contrib/libpcap/fmtutils.h | 10 +- contrib/libpcap/ftmacros.h | 4 +- contrib/libpcap/gencode.c | 596 +- contrib/libpcap/gencode.h | 4 +- contrib/libpcap/grammar.y.in | 140 +- contrib/libpcap/install-sh | 689 +- contrib/libpcap/missing/asprintf.c | 8 +- contrib/libpcap/missing/strlcat.c | 6 +- contrib/libpcap/missing/strlcpy.c | 6 +- contrib/libpcap/missing/strtok_r.c | 4 +- contrib/libpcap/missing/win_asprintf.c | 6 +- contrib/libpcap/mkdep | 28 +- contrib/libpcap/msdos/makefile | 2 +- contrib/libpcap/msdos/makefile.dj | 4 +- contrib/libpcap/msdos/makefile.wc | 6 +- contrib/libpcap/msdos/pktdrvr.c | 2 +- contrib/libpcap/msdos/pktdrvr.h | 2 +- contrib/libpcap/msdos/readme.dos | 4 +- contrib/libpcap/nametoaddr.c | 57 +- contrib/libpcap/nlpid.h | 2 +- contrib/libpcap/optimize.c | 34 +- contrib/libpcap/pcap-airpcap.c | 53 +- contrib/libpcap/pcap-bpf.c | 417 +- contrib/libpcap/pcap-bt-linux.c | 56 +- contrib/libpcap/pcap-bt-monitor-linux.c | 38 +- contrib/libpcap/pcap-common.c | 405 +- contrib/libpcap/pcap-config.1 | 108 +- contrib/libpcap/pcap-config.in | 11 +- contrib/libpcap/pcap-dag.c | 103 +- contrib/libpcap/pcap-dbus.c | 12 +- contrib/libpcap/pcap-dlpi.c | 72 +- contrib/libpcap/pcap-dos.c | 22 +- contrib/libpcap/pcap-dpdk.c | 32 +- contrib/libpcap/pcap-enet.c | 6 +- contrib/libpcap/pcap-filter.manmisc.in | 15 +- contrib/libpcap/pcap-haiku.c | 504 + contrib/libpcap/pcap-haiku.cpp | 305 - contrib/libpcap/pcap-int.h | 187 +- contrib/libpcap/pcap-libdlpi.c | 26 +- contrib/libpcap/pcap-linux.c | 654 +- contrib/libpcap/pcap-netfilter-linux.c | 61 +- contrib/libpcap/pcap-netmap.c | 24 +- contrib/libpcap/pcap-new.c | 31 +- contrib/libpcap/pcap-nit.c | 44 +- contrib/libpcap/pcap-npf.c | 296 +- contrib/libpcap/pcap-null.c | 10 +- contrib/libpcap/pcap-pf.c | 59 +- contrib/libpcap/pcap-rdmasniff.c | 16 +- contrib/libpcap/pcap-rpcap-int.h | 75 - contrib/libpcap/pcap-rpcap.c | 199 +- contrib/libpcap/pcap-savefile.manfile.in | 64 +- contrib/libpcap/pcap-septel.c | 14 +- contrib/libpcap/pcap-sita.c | 42 +- contrib/libpcap/pcap-sita.html | 4 +- contrib/libpcap/pcap-snf.c | 46 +- contrib/libpcap/pcap-snit.c | 57 +- contrib/libpcap/pcap-snoop.c | 54 +- contrib/libpcap/pcap-tc.c | 66 +- contrib/libpcap/pcap-tstamp.manmisc.in | 7 +- contrib/libpcap/pcap-usb-linux-common.c | 130 - contrib/libpcap/pcap-usb-linux-common.h | 107 +- contrib/libpcap/pcap-usb-linux.c | 95 +- contrib/libpcap/pcap-util.c | 287 +- contrib/libpcap/pcap-util.h | 6 +- contrib/libpcap/pcap.3pcap.in | 24 +- contrib/libpcap/pcap.c | 439 +- contrib/libpcap/pcap/can_socketcan.h | 25 +- contrib/libpcap/pcap/dlt.h | 75 +- contrib/libpcap/pcap/funcattrs.h | 106 +- contrib/libpcap/pcap/namedb.h | 27 +- contrib/libpcap/pcap/nflog.h | 2 +- contrib/libpcap/pcap/pcap-inttypes.h | 2 +- contrib/libpcap/pcap/pcap.h | 89 +- contrib/libpcap/pcap/sll.h | 1 + contrib/libpcap/pcap/socket.h | 56 +- contrib/libpcap/pcap/usb.h | 6 + contrib/libpcap/pcap_activate.3pcap | 12 +- contrib/libpcap/pcap_breakloop.3pcap | 2 +- contrib/libpcap/pcap_compile.3pcap.in | 3 +- contrib/libpcap/pcap_create.3pcap | 12 +- contrib/libpcap/pcap_dump.3pcap | 3 +- contrib/libpcap/pcap_findalldevs.3pcap | 43 +- contrib/libpcap/pcap_init.3pcap | 15 +- contrib/libpcap/pcap_lookupdev.3pcap | 10 +- contrib/libpcap/pcap_lookupnet.3pcap | 21 +- contrib/libpcap/pcap_loop.3pcap | 24 +- contrib/libpcap/pcap_next_ex.3pcap | 11 +- contrib/libpcap/pcap_offline_filter.3pcap | 3 +- contrib/libpcap/pcap_open_live.3pcap | 30 +- contrib/libpcap/pcap_open_offline.3pcap.in | 13 +- contrib/libpcap/pcap_set_tstamp_precision.3pcap.in | 3 +- contrib/libpcap/pcap_setnonblock.3pcap | 40 +- contrib/libpcap/pcap_strerror.3pcap | 14 +- contrib/libpcap/portability.h | 27 +- contrib/libpcap/ppp.h | 2 +- contrib/libpcap/rpcap-protocol.c | 4 +- contrib/libpcap/rpcap-protocol.h | 6 +- contrib/libpcap/rpcapd/CMakeLists.txt | 29 +- contrib/libpcap/rpcapd/Makefile.in | 4 +- contrib/libpcap/rpcapd/config_params.h | 2 +- contrib/libpcap/rpcapd/daemon.c | 70 +- contrib/libpcap/rpcapd/daemon.h | 4 +- contrib/libpcap/rpcapd/fileconf.c | 18 +- contrib/libpcap/rpcapd/log.c | 2 - contrib/libpcap/rpcapd/rpcapd-config.manfile.in | 12 +- contrib/libpcap/rpcapd/rpcapd.c | 62 +- contrib/libpcap/rpcapd/rpcapd.manadmin.in | 54 +- contrib/libpcap/rpcapd/win32-svc.c | 2 +- contrib/libpcap/savefile.c | 38 +- contrib/libpcap/scanner.l | 171 +- contrib/libpcap/sf-pcap.c | 150 +- contrib/libpcap/sf-pcapng.c | 24 +- contrib/libpcap/sockutils.c | 123 +- contrib/libpcap/sockutils.h | 26 +- contrib/libpcap/sslutils.c | 4 +- contrib/libpcap/sslutils.h | 10 +- contrib/libpcap/testprogs/Makefile.in | 2 +- contrib/libpcap/testprogs/filtertest.c | 6 +- contrib/libpcap/testprogs/findalldevstest-perf.c | 2 - contrib/libpcap/testprogs/findalldevstest.c | 8 +- contrib/libpcap/testprogs/valgrindtest.c | 4 +- contrib/libpcap/thread-local.h | 72 + contrib/pf/pflogd/pflogd.c | 11 + lib/libpcap/Makefile | 1 - lib/libpcap/config.h | 4 +- 157 files changed, 12381 insertions(+), 9570 deletions(-) diff --git a/contrib/libpcap/CHANGES b/contrib/libpcap/CHANGES index c574a278064f..bf8701c829a0 100644 --- a/contrib/libpcap/CHANGES +++ b/contrib/libpcap/CHANGES @@ -1,3 +1,168 @@ +Friday, August 30, 2024 / The Tcpdump Group + Summary for 1.10.5 libpcap release + Source code: + Spell WirelessHART details properly. + Mark pcap_vasprintf() as printf-like. + Finalize moving of bpf_filter.c. (GH #1166) + Remove an unneeded argument from gen_mcode6(). + Don't do some Berkeley YACC workarounds with YACC releases not + requiring them. + Use correct data types rather than int in some cases. + Squelch compiler warning in grammar.c. + Fix findalldevtest compilation if IPv6 isn't enabled. + Rename helper routines for pcap modules to have names beginning with + pcapint_, to avoid namespace collisions for code linking statically + with libpcap. + Avoid casting hack for the Windows cleanup-on-exit routine. + Use %zu format for one case of printing a size_t. + Fix some Coverity errors. + Fix availabilities of some functions to match reality. + pcap: make the seconds and microseconds/nanoseconds fields unsigned. + Remove the unused pcap-rpcap-int.h header file. + Thread safety: + Make some static variables thread-local; fixes issue #1174. + Packet filtering: + Improve reporting of some invalid filter expressions. + Return an error from pcap_compile() if the scanner fails to initialize. + Optimizer fix from Archit Shah to recompute dominators after + moving code (#976); fixes #945 (although the resulting filter + isn't empty). + Optimizer fix from Archit Shah to mark value as unknown when store + of that value is deleted (#972); fixes #143, #434, #436, #437, + and #1076. + Linux: + Properly return warnings. + Don't use DLT_LINUX_SLL2 for anything other than the "any" device. + Avoid 32-bit unsigned integer overflow in USB captures. Fixes + issues #1134 and #1205. + Fix a file descriptor leak. + Properly report warnings about unknown ARPHRD_ types. + Fix DLT_CAN_SOCKETCAN handling of CAN FD. + Add CAN XL support to DLT_CAN_SOCKETCAN. + Clean up the code that sets the "real" ("original") length for + isochronous USB transfers. + Avoid unnecessary blocking on recvmsg() in the Bluetooth monitor and + Bluetoth modules. + Solaris: + Handle BPF returning ESRCH for unknown devices. + List the "any" device if it's supported. + Report {non-existent zone}/{interface} errors appropriately. + Allow attaching to links owned by a non-global zone. (Based on + pull request #1202.) + Fix AF_LINK handling on illumos. + macOS: + Redid the availability macros to be closer to what Apple's doing + in recent SDKs, including tagging pcap-namedb.h routines. + Fix the install name of the installed shared library to have a + full path when building with CMake. + Fix universal builds. + Haiku: + Convert the module to C. Fixes issue #1114. + Address a few compiler warnings. Fixes issue #1114. + Fix various build problems. Fixes issue #1114. + Report non-existent devices correctly. + Fix handling of packet statistics. + Fix packet timestamping. + Fix packet filtering with low snaplen. + Improve connection status reporting. + Add support for promiscuous mode. + Detect DLTs and loopback capture support at run time. + Report IEEE 802.11 as PCAP_IF_WIRELESS. + Windows: + Fix internal handling of "not supported" error codes from NPF. + Work around a bug in Npcap 1.00 in case of driver version mismatch. + Don't call WSACleanup() when handling a failed WSAStartup(). + BSD, macOS, AIX, Solaris 11, Linux: + Add a new error PCAP_ERROR_CAPTURE_NOTSUP, for use if a capture + mechanism is not present, in the hopes that, for example, + attempts to capture on Windows Services for Linux 1, in which + the NT kernel attempts to simulate Linux system calls but does + not support packet sockets, can get an error that better + indicates the underlying problem. + AirPcap: + Format an error message if we run out of memory. + nflog: + Fix count of dropped packets. + Make sure we don't overflow when rounding up the TLV length. + rpcap: + Handle routines removed in at least some OpenSSL libraries. + CVE-2023-7256: Clean up sock_initaddress() and its callers to avoid + double frees in some cases. + Don't define SOCKET ourselves; instead, define PCAP_SOCKET as int + on UN*Xes and as SOCKET on Windows. + CVE-2024-8006: Fix pcap_findalldevs_ex() not to crash if passed a + file:// URL with a path to a directory that cannot be opened. + Savefiles: + Handle DLT_/LINKTYPE_ mapping better, to handle some + OpenBSD-specific link types better. + Treat if_tsoffset as signed in pcapng files, as the spec says. + Don't try to fix the "real" length for isochronous USB + transfers if the number of USB descriptors is too large. + Reject pcap files where one of the reserved fields in the + "link-layer type plus other stuff" is non-zero. + Building and testing: + Add a configure option to help debugging (--enable-instrument-functions). + Improved tests and error reporting for uses of pkg-config, and + improve help message. + Fix Haiku build. + With CMake, install headers in CMAKE_INSTALL_INCLUDEDIR rather + than just include. + Build libpcap.a before building test programs. + Print address family numerically, as well as symbolically, + in findalldevstest. + Fail with suggestions, rather than failing over to no capture + support, if no capture mechanism was found. Fixes issue #1016. + Don't indent comments in Make, as that may cause them not to be + recognized as comments. + Don't check for libssl if we aren't going to use it. + Better handle enabling and disabling of sanitizers. Fixes issue + #1171. + CMakeLists.txt: Print "Symlinking: /some/path to ..." conditionally. + Evaluate CMAKE_INSTALL_PREFIX at install time. + cmake: Update the minimum required version to 2.8.12 (except Windows). + cmake: suppress CMP0042 OLD deprecated warning. + Makefile.in: Add the releasecheck target. + Cirrus CI: Add the "make releasecheck" command in the Linux task. + Makefile.in: Add the whitespacecheck target. + Cirrus CI: Run the "make whitespacecheck" command in the Linux task. + Autoconf: Update config.{guess,sub}, timestamps 2024-01-01. + Autoconf: Update the install-sh script to the 2020-11-14.01 version. + Compile with '-Wnull-pointer-subtraction', + '-Wunused-but-set-parameter', and '-Wunused-but-set-variable' in + devel mode if supported. + Don't ignore spaces between CMAKE_C_FLAGS and DPDK_C_FLAGS with + CMake. + Use noreturn and __format__ with XL C 7.0 and later. + Check for the same -W flags in autotools and CMake. + Autoconf: Add autogen.sh, remove configure and config.h.in and put + these generated files in the release tarball. + Autoconf: Get the size of a time_t. + Fix propagation of cc_werr_cflags() output. + Makefile.in(s): Fix the depend target. + mkdep: Exit with a non-zero status if a command fails. + Fix HCI_CHANNEL_MONITOR detection with musl libc. + Extend "make shellcheck" onto mkdep too. + Add initial support for building with TinyCC. + Address all known compiler warnings specific to illumos, Linux, NetBSD, + Solaris and Sun C; in CI expect warnings specific to TinyCC only. + Documentation: + Update and fix pcap-filter man page. + Add a README.haiku.md file. + Document pcap-config better. + Man page formatting and prose fixes. + Rename doc/README.Win32.md to doc/README.windows.md. + Update pcap-savefile man page to match the Internet-Draft for + pcap. + Fix CMake issues for target used by other projects. + Explain "any" device better in pcap_open_live(3PCAP). + Update INSTALL.md. + Note in man pages that errbuf arguments must point to an error + buffer. + Note that if pcap_findalldevs() fails it sets *alldevsp to NULL; + there's no devices list to free. + Explain "other addresses" in pcap_findalldevs(3PCAP). + Document pcap_lookupnet(3PCAP) a bit better. + Friday, April 7, 2023 / The Tcpdump Group Summary for 1.10.4 libpcap release Source code: @@ -58,7 +223,7 @@ Saturday, December 31, 2022 / The Tcpdump Group when reading a LINKTYPE_PFLOG file. Put CAN ID field in CAN pseudo-headers for LINUX_SLL2, as we do for LINUX_SLL. - Fix inorrectly-computed "real" length for isochronous USB + Fix incorrectly-computed "real" length for isochronous USB transfers when reading savefiles. Don't crash if pcap_can_set_rfmon() is called. Fix pcap_offline_read() loop. @@ -139,7 +304,7 @@ Saturday, December 31, 2022 / The Tcpdump Group Return an error if the driver reports 0 timestamp modes supported. Close the ADAPTER handle for some errors in pcap_create_interface(). - Get rid of old umaintained VS project files. + Get rid of old unmaintained VS project files. Fix deprecation warning for pcap_handle(). Npcap is now at npcap.com, not npcap.org. Make sure "no such device" and "no permission to open device" @@ -307,7 +472,7 @@ Tuesday, December 29, 2020 Remove (unused) SITA support Capture file reading: Correctly handle pcapng captures with more than one IDB with a - snspshot length greater than the supported maximum + snapshot length greater than the supported maximum Capture file writing: Create the file in pcap_dump_open_append() if it doesn't exist Packet filtering: @@ -421,7 +586,7 @@ Tuesday, December 29, 2020 isn't called Fix compilation on Cygwin/MSYS Add pcap_handle(), and deprecate pcap_fileno() - Report PCAP_ERROR_NO_SUCH_DEVICE for a non-existent device + Report PCAP_ERROR_NO_SUCH_DEVICE for a nonexistent device Return an appropriate error message for device removed or device unusable due to a suspend/resume Report a warning for unknown NdisMedium types @@ -503,7 +668,7 @@ Sunday, July 22, 2018 Windows with WinPcap/Npcap (GitHub issue #824) Have pcap_dump_open_append() create the dump file if it doesn't exists (GitHub issue #247) - Fix the maxmum snapshot length for DLT_USBPCAP + Fix the maximum snapshot length for DLT_USBPCAP Use -fPIC when building for 64-bit SPARC on Linux (GitHub issue #837) Fix CMake 64-bit library installation directory on some Linux distributions @@ -668,7 +833,7 @@ Wednesday Nov. 12, 2014 guy@alum.mit.edu/mcr@sandelman.ca Monday Aug. 12, 2014 guy@alum.mit.edu Summary for 1.6.2 libpcap release - Don't crash on filters testing a non-existent link-layer type + Don't crash on filters testing a nonexistent link-layer type field. Fix sending in non-blocking mode on Linux with memory-mapped capture. @@ -956,7 +1121,7 @@ Mon. October 27, 2008. ken@netfunctional.ca. Summary for 1.0.0 libpcap rele Autogenerate VERSION numbers better Mon. September 10, 2007. ken@xelerance.com. Summary for 0.9.8 libpcap release - Change build process to put public libpcap headers into pcap subir + Change build process to put public libpcap headers into pcap subdir DLT: Add value for IPMI IPMB packets DLT: Add value for u10 Networks boards Require <net/pfvar.h> for pf definitions - allows reading of pflog formatted @@ -1285,7 +1450,7 @@ v0.2.1 Sun Jul 14 03:02:26 PDT 1996 (steve@research.oknet.com) - Fixed to handle raw ip addresses such as 0.0.0.1 without "left - justifing" + justifying" - Add "sca" keyword (for DEC cluster services) as suggested by Terry Kennedy (terry@spcvxa.spc.edu) diff --git a/contrib/libpcap/CMakeLists.txt b/contrib/libpcap/CMakeLists.txt index 58c5159905d0..9012ef41769f 100644 --- a/contrib/libpcap/CMakeLists.txt +++ b/contrib/libpcap/CMakeLists.txt @@ -2,9 +2,26 @@ if(WIN32) # # We need 3.12 or later, so that we can set policy CMP0074; see # below. + # cmake_minimum_required(VERSION 3.12) else(WIN32) - cmake_minimum_required(VERSION 2.8.6) + # + # For now: + # + # if this is a version of CMake less than 3.5, require only + # 2.8.12, just in case somebody is configuring with CMake + # on a "long-term support" version # of some OS and that + # version supplies an older version of CMake; + # + # otherwise, require 3.5, so we don't get messages warning + # that support for versions of CMake lower than 3.5 is + # deprecated. + # + if(CMAKE_VERSION VERSION_LESS "3.5") + cmake_minimum_required(VERSION 2.8.12) + else() + cmake_minimum_required(VERSION 3.5) + endif() endif(WIN32) # @@ -12,8 +29,15 @@ endif(WIN32) # neither do we with autotools; don't do so with CMake, either, and # suppress warnings about that. # +# Setting CMAKE_MACOSX_RPATH to FALSE uses the old behavior, +# but removes the POLICY CMP0042 OLD deprecated warning. +# See https://cmake.org/cmake/help/latest/policy/CMP0042.html +# +if (NOT DEFINED CMAKE_MACOSX_RPATH) + set(CMAKE_MACOSX_RPATH FALSE) +endif() if(POLICY CMP0042) - cmake_policy(SET CMP0042 OLD) + cmake_policy(SET CMP0042 NEW) endif() # @@ -47,20 +71,52 @@ endif() set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules) # -# We only need a C++ compiler for Haiku; all code except for its -# pcap module is in C. +# We explicitly indicate what languages are used in libpcap to avoid +# checking for a C++ compiler. +# +# One reason to avoid that check is that there's no need to waste +# configuration time performing it. +# +# Another reason is that: +# +# CMake will try to determine the sizes of some data types, including +# void *, early in the process of configuration; apparently, it's done +# as part of processing the project() command. # -# We do that by specifying just C in the project() call and, after -# that finishes, checking for Haiku and, if we're building for -# Haiku, use enable_language() to check for C++. This means that -# we don't require a C++ compiler on platforms other than Haiku. +# At least as of CMake 2.8.6, it does so by checking the size of +# "void *" in C, setting CMAKE_C_SIZEOF_DATA_PTR based on that, +# setting CMAKE_SIZEOF_VOID_P to that, and then checking the size +# of "void *" in C++, setting CMAKE_CXX_SIZEOF_DATA_PTR based on +# that, and then setting CMAKE_SIZEOF_VOID_P to *that*. # -# CMAKE_SYSTEM_NAME is set by project(), so we can't do this by -# testing CMAKE_SYSTEM_NAME and then passing different language -# lists to project() based on the system. +# The compile tests include whatever C flags may have been provided +# to CMake in the CFLAGS and CXXFLAGS environment variables. +# +# If you set an architecture flag such as -m32 or -m64 in CFLAGS +# but *not* in CXXFLAGS, the size for C++ will win, and hilarity +# will ensue. +# +# Or if, at least on Solaris, you have a newer version of GCC +# installed, but *not* a newer version of G++, and you have Oracle +# Studio installed, it will find GCC, which will default to building +# 64-bit, and Oracle Studio's C++ compiler, which will default to +# building 32-bit, the size for C++ will win, and, again, hilarity +# will ensue. # project(pcap C) +# +# Setting CMAKE_MACOSX_RPATH to FALSE causes the installed +# libpcap.A.dylib to have just libpcap.A.dylib as the install +# name; Apple built libpcap with an install_name of /usr/lib/libpcap.A.dylib +# (back when they still shipped individual system dylibs rather than +# shipping a pre-built shared library cache, at least), and we do the +# same with autotools; do the same with CMake. +# +if (NOT DEFINED CMAKE_INSTALL_NAME_DIR) + set(CMAKE_INSTALL_NAME_DIR ${CMAKE_INSTALL_PREFIX}/lib) +endif() + # # For getting raw lists of --libs and --libs --static information from a # pkg-config module. @@ -190,55 +246,6 @@ macro(get_link_info_from_library_path _library_prefix _library_name) endif() endmacro() -if(CMAKE_SYSTEM_NAME STREQUAL "Haiku") - enable_language(CXX) - - # - # OK, this is a royal pain. - # - # CMake will try to determine the sizes of some data types, including - # void *, early in the process of configuration; apparently, it's done - # as part of processing the project() command. - # - # At least as of CMake 2.8.6, it does so by checking the size of - # "void *" in C, setting CMAKE_C_SIZEOF_DATA_PTR based on that, - # setting CMAKE_SIZEOF_VOID_P to that, and then checking the size - # of "void *" in C++, setting CMAKE_CXX_SIZEOF_DATA_PTR based on - # that, and then setting CMAKE_SIZEOF_VOID_P to *that*. - # - # The compile tests include whatever C flags may have been provided - # to CMake in the CFLAGS and CXXFLAGS environment variables. - # - # If you set an architecture flag such as -m32 or -m64 in CFLAGS - # but *not* in CXXFLAGS, the size for C++ will win, and hilarity - # will ensue. - # - # Or if, at least on Solaris, you have a newer version of GCC - # installed, but *not* a newer version of G++, and you have Oracle - # Studio installed, it will find GCC, which will default to building - # 64-bit, and Oracle Studio's C++ compiler, which will default to - # building 32-bit, the size for C++ will win, and, again, hilarity - # will ensue. - # - # So we make sure both languages have the same pointer sizes with - # the flags they're given; if they don't, it means that the - # compilers for the languages will, with those flags, not produce - # code that can be linked together. - # - # This is unlikely to happen on Haiku, but it *has* happened on - # Solaris; we do this for future-proofing, in case we ever need - # C++ on a platform where that can happen. - # - if(NOT ${CMAKE_C_SIZEOF_DATA_PTR} EQUAL ${CMAKE_CXX_SIZEOF_DATA_PTR}) - message(FATAL_ERROR -"C compiler ${CMAKE_C_COMPILER} produces code with \ -${CMAKE_C_SIZEOF_DATA_PTR}-byte pointers while C++ compiler \ -${CMAKE_CXX_COMPILER} produces code with \ -${CMAKE_CXX_SIZEOF_DATA_PTR}-byte pointers. \ -This prevents code in these languages from being combined.") - endif() -endif() - # # Show the bit width for which we're compiling. # This can help debug problems if you're dealing with a compiler that @@ -256,7 +263,7 @@ endif() # Solaris pkg-config is annoying. For at least one package (D-Bus, I'm # looking at *you*!), there are separate include files for 32-bit and # 64-bit builds (I guess using "unsigned long long" as a 64-bit integer -# type on a 64-bit build is like crossing the beams or soething), and +# type on a 64-bit build is like crossing the beams or something), and # there are two separate .pc files, so if we're doing a 32-bit build we # should make sure we look in /usr/lib/pkgconfig for .pc files and if # we're doing a 64-bit build we should make sure we look in @@ -563,8 +570,6 @@ set(PACKAGE_STRING "${LIBRARY_NAME} ${PACKAGE_VERSION}") # Project settings ###################################### -add_definitions(-DHAVE_CONFIG_H) - include_directories( ${CMAKE_CURRENT_BINARY_DIR} ${pcap_SOURCE_DIR} @@ -615,9 +620,7 @@ if(USE_STATIC_RT) if(MSVC) foreach(RT_FLAG CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE - CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO - CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE - CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) + CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO) string(REGEX REPLACE "/MD" "/MT" ${RT_FLAG} "${${RT_FLAG}}") endforeach(RT_FLAG) elseif(MINGW) @@ -699,7 +702,6 @@ main(void) # # Now check for various system functions. # -check_function_exists(strerror HAVE_STRERROR) check_function_exists(strerror_r HAVE_STRERROR_R) if(HAVE_STRERROR_R) # @@ -755,29 +757,26 @@ if(NOT WIN32) endif() # -# These tests are for network applications that need socket functions -# and getaddrinfo()/getnameinfo()-ish functions. We now require -# getaddrinfo() and getnameinfo(). On UN*X systems, we also prefer -# versions of recvmsg() that conform to the Single UNIX Specification, -# so that we can check whether a datagram received with recvmsg() was -# truncated when received due to the buffer being too small. +# Look for various networking-related libraries that we may need. # -# On Windows, getaddrinfo() is in the ws2_32 library. - -# On most UN*X systems, they're available in the system library. +# We need getaddrinfo() to translate host names in filters to IP +# addresses. We use getaddrinfo() because we want a portable +# thread-safe way of getting information for a host name or port; +# there exist _r versions of gethostbyname() and getservbyname() on +# some platforms, but not on all platforms. # -# Under Solaris, we need to link with libsocket and libnsl to get -# getaddrinfo() and getnameinfo() and, if we have libxnet, we need to -# link with libxnet before libsocket to get a version of recvmsg() -# that conforms to the Single UNIX Specification. +# We may also need socket() and other socket functions to support: # -# We use getaddrinfo() because we want a portable thread-safe way -# of getting information for a host name or port; there exist _r -# versions of gethostbyname() and getservbyname() on some platforms, -# but not on all platforms. +# Local packet capture with capture mechanisms that use sockets. # -# NOTE: if you hand check_library_exists as its last argument a variable -# that's been set, it skips the test, so we need different variables. +# Local capture device enumeration if a socket call is needed to +# enumerate devices or get device attributes. +# +# Packet capture from services that put captured packets on the +# network, such as rpcap servers. +# +# We may also need getnameinfo() for packet capture from services +# that put packets on the network. # set(PCAP_LINK_LIBRARIES "") set(LIBS "") @@ -786,9 +785,13 @@ set(REQUIRES_PRIVATE "") set(LIBS_PRIVATE "") include(CheckLibraryExists) if(WIN32) + # + # Windows. # # We need winsock2.h and ws2tcpip.h. # + # On Windows, getaddrinfo() is in the ws2_32 library. + # cmake_push_check_state() set(CMAKE_REQUIRED_LIBRARIES ws2_32) check_symbol_exists(getaddrinfo "winsock2.h;ws2tcpip.h" LIBWS2_32_HAS_GETADDRINFO) @@ -800,16 +803,28 @@ if(WIN32) endif(LIBWS2_32_HAS_GETADDRINFO) else(WIN32) # - # UN*X. First try the system libraries, then try the libraries - # for Solaris and possibly other systems that picked up the - # System V library split. + # UN*X. + # + # Most UN*Xes have getaddrinfo(), and the other routines we may + # need, in the default searched libraries (e.g., libc). + # Check there first. + # + # NOTE: if you hand check_library_exists as its last argument a + # variable that's been set, it skips the test, so we need different + # variables for different libraries. # check_function_exists(getaddrinfo STDLIBS_HAVE_GETADDRINFO) if(NOT STDLIBS_HAVE_GETADDRINFO) - # - # Not found in the standard system libraries. - # Try libsocket, which requires libnsl. - # + # + # Not found in the standard system libraries. + # + # In some versions of Solaris, we need to link with libsocket + # and libnsl, so check in libsocket and also link with liblnsl + # when doing this test. + # + # Linking with libsocket and libnsl will find all the routines + # we need. + # cmake_push_check_state() set(CMAKE_REQUIRED_LIBRARIES nsl) check_library_exists(socket getaddrinfo "" LIBSOCKET_HAS_GETADDRINFO) @@ -823,10 +838,17 @@ else(WIN32) set(LIBS_STATIC "-lsocket -lnsl ${LIBS_STATIC}") set(LIBS_PRIVATE "-lsocket -lnsl ${LIBS_PRIVATE}") else(LIBSOCKET_HAS_GETADDRINFO) + # + # Not found in libsocket; test for it in libnetwork, which + # is where it is in Haiku. + # + # Linking with libnetwork will find all the routines we + # need. + # check_library_exists(network getaddrinfo "" LIBNETWORK_HAS_GETADDRINFO) if(LIBNETWORK_HAS_GETADDRINFO) # - # OK, we found it in libnetwork (Haiku). + # OK, we found it in libnetwork. # set(PCAP_LINK_LIBRARIES network ${PCAP_LINK_LIBRARIES}) set(LIBS "-lnetwork ${LIBS}") @@ -840,17 +862,32 @@ else(WIN32) endif(LIBNETWORK_HAS_GETADDRINFO) endif(LIBSOCKET_HAS_GETADDRINFO) - # - # OK, do we have recvmsg() in libxnet? - # We also link with libsocket and libnsl. - # + # + # We require a version of recvmsg() that conforms to the Single + # UNIX Specification, so that we can check whether a datagram + # received with recvmsg() was truncated when received due to the + # buffer being too small. + # + # On most systems, the version of recvmsg() in the libraries + # found above conforms to the SUS. + # + # On at least some versions of Solaris, it does not conform to + # the SUS, and we need the version in libxnet, which does + # conform. + # + # Check whether libxnet exists and has a version of recvmsg(); + # if it does, link with libxnet before we link with libsocket, + # to get that version. + # + # This test also links with libsocket and libnsl. + # cmake_push_check_state() set(CMAKE_REQUIRED_LIBRARIES socket nsl) check_library_exists(xnet recvmsg "" LIBXNET_HAS_RECVMSG) cmake_pop_check_state() if(LIBXNET_HAS_RECVMSG) # - # Yes - link with it as well. + # libxnet has recvmsg(); link with it as well. # set(PCAP_LINK_LIBRARIES xnet ${PCAP_LINK_LIBRARIES}) set(LIBSC "-lxnet ${LIBS_LIBS}") @@ -859,7 +896,9 @@ else(WIN32) endif(LIBXNET_HAS_RECVMSG) endif(NOT STDLIBS_HAVE_GETADDRINFO) - # DLPI needs putmsg under HPUX so test for -lstr while we're at it + # + # DLPI needs putmsg under HP-UX, so test for -lstr while we're at it. + # check_function_exists(putmsg STDLIBS_HAVE_PUTMSG) if(NOT STDLIBS_HAVE_PUTMSG) check_library_exists(str putmsg "" LIBSTR_HAS_PUTMSG) @@ -1231,7 +1270,6 @@ endif(NOT WIN32) if(ENABLE_PROFILING) if(NOT MSVC) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pg") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pg") endif() endif() @@ -1264,7 +1302,7 @@ endif() # # Test if the each of the sanitizers in the ENABLE_SANITIZERS list are # supported by the compiler, and, if so, adds the appropriate flags to -# CMAKE_C_FLAGS, CMAKE_CXX_FLAGS, and SANITIZER_FLAGS. If not, it fails. +# CMAKE_C_FLAGS, and SANITIZER_FLAGS. If not, it fails. # # Do this last, in the hope that it will prevent configuration on Linux # from somehow deciding it doesn't need -lpthread when building rpcapd @@ -1272,17 +1310,25 @@ endif() # obvious CMake debugging flag reveals, it doesn't realize that if we # turn sanitizer stuff on). # -set(SANITIZER_FLAGS "") -foreach(sanitizer IN LISTS ENABLE_SANITIZERS) +# Note: apparently, some projects have decided that ENABLE_SANITIZERS +# is a Boolean, with OFF meaning "no sanitizers" and ON meaning "all +# sanitizers". Whoever decided that didn't put it up as a common +# CMake idiom, as far as I can tell; we only discovered this because +# JetBrains' CLion "helpfully" appears to pass -DENABLE_SANITIZERS=OFF +# to CMake by default, which causes CMake to fail on libpcap. Thanks! +# +# We thus also allow a setting of OFF to mean "no sanitizers" and ON to +# mean "all supported sanitizers that we know about and that can all +# be used together". +# +macro(test_sanitizer _sanitizer _sanitizer_flag) + message(STATUS "Checking sanitizer ${_sanitizer}") + set(sanitizer_variable "sanitize_${_sanitizer}") # Set -Werror to catch "argument unused during compilation" warnings - - message(STATUS "Checking sanitizer ${sanitizer}") - set(sanitizer_variable "sanitize_${sanitizer}") - set(CMAKE_REQUIRED_FLAGS "-Werror -fsanitize=${sanitizer}") - check_c_compiler_flag("-fsanitize=${sanitizer}" ${sanitizer_variable}) + set(CMAKE_REQUIRED_FLAGS "-Werror -fsanitize=${_sanitizer}") + check_c_compiler_flag("-fsanitize=${_sanitizer}" ${sanitizer_variable}) if(${${sanitizer_variable}}) - set(SANITIZER_FLAGS "${SANITIZER_FLAGS} -fsanitize=${sanitizer}") - message(STATUS "${sanitizer} sanitizer supported using -fsanitizer=${sanitizer}") + set(${_sanitizer_flag} "-fsanitize=${_sanitizer}") else() # # Try the versions supported prior to Clang 3.2. @@ -1291,119 +1337,397 @@ foreach(sanitizer IN LISTS ENABLE_SANITIZERS) # Otherwise, give up. # set(sanitizer_variable "OLD_${sanitizer_variable}") - if ("${sanitizer}" STREQUAL "address") + if ("${_sanitizer}" STREQUAL "address") set(CMAKE_REQUIRED_FLAGS "-Werror -fsanitize-address") check_c_compiler_flag("-fsanitize-address" ${sanitizer_variable}) if(${${sanitizer_variable}}) - set(SANITIZER_FLAGS "${SANITIZER_FLAGS} -fsanitize-address") - message(STATUS "${sanitizer} sanitizer supported using -fsanitize-address") - else() - message(FATAL_ERROR "${sanitizer} isn't a supported sanitizer") + set(${_sanitizer_flag} "-fsanitize-address") endif() - elseif("${sanitizer}" STREQUAL "undefined") + elseif("${_sanitizer}" STREQUAL "undefined") set(CMAKE_REQUIRED_FLAGS "-Werror -fcatch-undefined-behavior") check_c_compiler_flag("-fcatch-undefined-behavior" ${sanitizer_variable}) if(${${sanitizer_variable}}) - set(SANITIZER_FLAGS "${SANITIZER_FLAGS} -fcatch-undefined-behavior") - message(STATUS "${sanitizer} sanitizer supported using catch-undefined-behavior") - else() - message(FATAL_ERROR "${sanitizer} isn't a supported sanitizer") + set(${_sanitizer_flag} "-fcatch-undefined-behavior") endif() - else() - message(FATAL_ERROR "${sanitizer} isn't a supported sanitizer") endif() endif() - unset(CMAKE_REQUIRED_FLAGS) -endforeach() +endmacro(test_sanitizer) + +set(SANITIZER_FLAGS "") +if("${ENABLE_SANITIZERS}") + # + # This appears to indicate that ENABLE_SANITIZERS was set to a + # string value that is "one of the true constants", meaning + # "1, ON, YES, TRUE, Y, or a non-zero number". + # + # It does not appear to happen for other settings, including + # setting it to a list of one or more sanitizers. + # + # This setting means "enable all sanitizers that the compiler + # supports". + # + foreach(sanitizer "address" "undefined") + unset(SANITIZER_FLAG) + test_sanitizer(${sanitizer} SANITIZER_FLAG) + if(SANITIZER_FLAG) + message(STATUS "${sanitizer} sanitizer supported using ${SANITIZER_FLAG}") + set(SANITIZER_FLAGS "${SANITIZER_FLAGS} ${SANITIZER_FLAG}") + else() + message(STATUS "${sanitizer} isn't a supported sanitizer") + endif() + endforeach() + if("${SANITIZER_FLAGS}" STREQUAL "") + message(FATAL_ERROR "No supported sanitizers found") + endif() +else() + # + # This appears to indicate that ENABLE_SANITIZERS was either: + # + # not set; + # set to a set to a string value that is not "one of the true + # constants", meaning "1, ON, YES, TRUE, Y, or a non-zero number". + # + # The latter includes setting it to "one of the false constants", + # meaning the string "is 0, OFF, NO, FALSE, N, IGNORE, NOTFOUND, + # the empty string, or ends in the suffix -NOTFOUND." + # + # It also includes setting it to a list of one or more sanitizers. + # + # We want to treat "not set" and "set to one of the false constants" + # as meaning "do not enable any sanitizers". + # + # We want to treat "set to a list of one or more sanitizers" as + # meaning "enable all the sanitizers in the list". + # + # This requires that we distinguish between those two cases. + # + if(ENABLE_SANITIZERS) + # + # This appears to indicate that ENABLE_SANITIZERS was set to + # a string value that is "not one of the false constants". + # + # We already know it's "not one of the true constants", so + # we treat it as a list of sanitizers. + # + foreach(sanitizer IN LISTS ENABLE_SANITIZERS) + unset(SANITIZER_FLAG) + test_sanitizer(${sanitizer} SANITIZER_FLAG) + if(SANITIZER_FLAG) + message(STATUS "${sanitizer} sanitizer supported using ${SANITIZER_FLAG}") + set(SANITIZER_FLAGS "${SANITIZER_FLAGS} ${SANITIZER_FLAG}") + else() + message(FATAL_ERROR "${sanitizer} isn't a supported sanitizer") + endif() + endforeach() + else() + # + # This appears to indicate that ENABLE_SANITIZERS was either: + # + # not set; + # set to a value that's "one of the false constants"; + # + # so we don't enable any sanitizers. + # + message(STATUS "Not enabling sanitizers") + endif() +endif() if(NOT "${SANITIZER_FLAGS}" STREQUAL "") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O1 -g ${SANITIZER_FLAGS} -fno-omit-frame-pointer -fno-optimize-sibling-calls") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O1 -g ${SANITIZER_FLAGS} -fno-omit-frame-pointer -fno-optimize-sibling-calls") endif() -# -# OpenSSL/libressl. -# -find_package(OpenSSL) -if(OPENSSL_FOUND) +if(ENABLE_REMOTE) # - # We have OpenSSL. + # OpenSSL/libressl. # - include_directories(SYSTEM ${OPENSSL_INCLUDE_DIR}) - set(PCAP_LINK_LIBRARIES ${PCAP_LINK_LIBRARIES} ${OPENSSL_LIBRARIES}) + find_package(OpenSSL) + if(OPENSSL_FOUND) + # + # We have OpenSSL. + # + include_directories(SYSTEM ${OPENSSL_INCLUDE_DIR}) + set(PCAP_LINK_LIBRARIES ${PCAP_LINK_LIBRARIES} ${OPENSSL_LIBRARIES}) - # - # The find_package() module CMake provides for OpenSSL uses does not *** 38674 LINES SKIPPED ***