Replace hacky code to set install dirs in config.h and use path definitions
only where required.
Change-Id: I78735f730725382c1b3aca876705e5e6e1872d78
Reviewed-on: https://code.wireshark.org/review/14033
Reviewed-by: João Valverde <j@v6e.pt>
Change size_t to something that is guaranteed to fit in a socklen_t.
Fix incorrect AC_DEFINE too.
Change-Id: I710f32fb1e5bd4f51843d380aa8ed8b6acd98c02
Reviewed-on: https://code.wireshark.org/review/14009
Petri-Dish: Alexis La Goutte <alexis.lagoutte@gmail.com>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: João Valverde <j@v6e.pt>
Add an option to decode the packet bytes from base64 or zlib compressed.
Also add configurable start byte and end byte to make it possible to
decode a subset of bytes. It's also possible to select a range in ASCII
view and select "Show selected" from the context menu to make a subset.
In ASCII view a null terminator is replaced by UTF8 symbol for NULL,
and a CR is replaced by UTF8 symbol for carriage return. This is done
to make it possible to "Show selected" from the context menu.
Change-Id: Ie03c9912c304c121af6ca9e998a6e8445b5382c5
Reviewed-on: https://code.wireshark.org/review/13958
Petri-Dish: Stig Bjørlykke <stig@bjorlykke.org>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Alexis La Goutte <alexis.lagoutte@gmail.com>
No need for platform-specific system header boilerplate.
Change-Id: I5387a0005ddb0d7aab3c5b9f28d6282053c1b0fd
Reviewed-on: https://code.wireshark.org/review/13865
Petri-Dish: João Valverde <j@v6e.pt>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: João Valverde <j@v6e.pt>
Change-Id: Iddd21c8786e679eef51024a172403200ee6652cb
Reviewed-on: https://code.wireshark.org/review/13902
Reviewed-by: Michael Mann <mmann78@netscape.net>
Petri-Dish: Michael Mann <mmann78@netscape.net>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Alexis La Goutte <alexis.lagoutte@gmail.com>
Change-Id: I1ccd9885746a6044f298d7d531a9bc009a70288e
Reviewed-on: https://code.wireshark.org/review/13802
Petri-Dish: Martin Kaiser <wireshark@kaiser.cx>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Anders Broman <a.broman58@gmail.com>
-Add AES-CMAC encryption need to check MIC when deriving TDLS keys (802.11)
-Tested against NIST test vector for AES128-CMAC
Bug: 11312
Change-Id: Id4fd839bdedd3aa135823334e59d98271aea7c2b
Reviewed-on: https://code.wireshark.org/review/13663
Petri-Dish: Alexis La Goutte <alexis.lagoutte@gmail.com>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Anders Broman <a.broman58@gmail.com>
- Use same API as SHA-1
- Tested against NIST's test vectors (byte oriented implementation)
Bug: 11312
Change-Id: I7fea7d13c43da059138153b17de7084ef9d81ac5
Reviewed-on: https://code.wireshark.org/review/13662
Petri-Dish: Alexis La Goutte <alexis.lagoutte@gmail.com>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Anders Broman <a.broman58@gmail.com>
Clang's ASAN reported an ODR violation when plugins were loaded. Sure
enough, symbols did actually get loaded twice:
==5898==ERROR: AddressSanitizer: odr-violation (0x7fffd95a35e0):
[1] size=7 'version' plugins/mate/plugin.c:19:31
[2] size=6 'version' plugins/opcua/plugin.c:19:31
After this change, plugins cannot insert new symbols in the global
namespace.
Change-Id: Ib11f7263e9c586f8e7c1f8f5fb239b20d46ddd2f
Reviewed-on: https://code.wireshark.org/review/13260
Reviewed-by: Alexis La Goutte <alexis.lagoutte@gmail.com>
Petri-Dish: Alexis La Goutte <alexis.lagoutte@gmail.com>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Michael Mann <mmann78@netscape.net>
GNU coding standards recommend against it and automake is designed
around it.
This allows overriding the global build flags using AM_CFLAGS, etc.,
or per object flags, something that is difficult or impossible currently
because of automake precedence rules.
Change-Id: I3f1ea12e560af5a46b2f04b342b1882bbf123f12
Reviewed-on: https://code.wireshark.org/review/13455
Petri-Dish: João Valverde <j@v6e.pt>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: João Valverde <j@v6e.pt>
Output from BASE_HEX et al has always been zero-padded to according to
the field type - 8 digits for FT_UINT32, etc.
When the field has a bitmask, this is definitely not appropriate - the
field type is used to indicate the size of the bitfield container, and
tells us nothing about the size of this field.
Instead, determine the actual size of the field by inspecting the
bitmask, and output the corresponding number of hex digits.
Change-Id: I10ec4e93e1e40e8b1354d5368cc8945cf671a617
Reviewed-on: https://code.wireshark.org/review/13225
Reviewed-by: João Valverde <j@v6e.pt>
Petri-Dish: João Valverde <j@v6e.pt>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Michael Mann <mmann78@netscape.net>
If the error is something other than ENOENT, return that error
indication.
Change-Id: If866cab5f0de0e4fa8b1ed1cead1290feb88a3cb
Reviewed-on: https://code.wireshark.org/review/13091
Reviewed-by: Guy Harris <guy@alum.mit.edu>
(That should also keep people from deciding that they don't want to
include <wsutil/nstime.h>, but still want to use Wireshark nanosecond
times, and do so by sticking a private incomplete definition of "struct
nstime_t" into the code.)
Change-Id: I94e863fe7083ebba254c3a718b85088a89fb6b7d
Reviewed-on: https://code.wireshark.org/review/13022
Reviewed-by: Guy Harris <guy@alum.mit.edu>
The "-Wwrite-strings" flag produces nuisance warnings. These warnings are
not useful, they're impossible to fix in a sane way and therefore are being
handled with casts of static strings to (char *).
This just moves the warning to [-Wcast-qual] and a compiler pragma is
in turn required (and used) to squelch that warning.
Remove the Wwrite-strings warning. Let that responsibility fall on the
programmer (as is done by casting).
Change-Id: I5a44dfd9decd6d80797a521a3373593074962fb5
Reviewed-on: https://code.wireshark.org/review/12162
Petri-Dish: Alexis La Goutte <alexis.lagoutte@gmail.com>
Reviewed-by: Alexis La Goutte <alexis.lagoutte@gmail.com>
Reviewed-by: Michael Mann <mmann78@netscape.net>
Change-Id: I463f93e515ebe12ed30b1f08cca7d29a7bd535ae
Reviewed-on: https://code.wireshark.org/review/12552
Reviewed-by: Alexis La Goutte <alexis.lagoutte@gmail.com>
Petri-Dish: Alexis La Goutte <alexis.lagoutte@gmail.com>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Michael Mann <mmann78@netscape.net>
Change-Id: Ia2ce54592485d2995bcfd56bd127a2fedb1a7d07
Reviewed-on: https://code.wireshark.org/review/12293
Reviewed-by: Alexis La Goutte <alexis.lagoutte@gmail.com>
Petri-Dish: Alexis La Goutte <alexis.lagoutte@gmail.com>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Michael Mann <mmann78@netscape.net>
Disable shorten-64-to-32 in ws80211_create_on_demand_interface,
which calls NLA_PUT_STRING, which passes the output of strlen to an
int parameter. NLA_PUT_STRING is defined in netlink/attr.h so there's
not much we can do to fix it directly.
Suppress -Wpragmas before suppressing warnings in gcc so that we can
use DIAG_OFF with clang-only warnings.
Change-Id: I1180950edd93c056b8fbfbed164e482024aee90a
Reviewed-on: https://code.wireshark.org/review/12314
Petri-Dish: Gerald Combs <gerald@wireshark.org>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Gerald Combs <gerald@wireshark.org>
Be more consistent about using the ws_ routines, as we suggest in
README.developer.
In C++ on UN*X, define ws_close as ::close rather than close, so that it
works even in classes with methods or members named "close".
Change-Id: Ide2652229e6b6b4624cbddae0e909a4ea1efa591
Reviewed-on: https://code.wireshark.org/review/11637
Reviewed-by: Guy Harris <guy@alum.mit.edu>
Have wsutil/file_util.h include them on UN*X, just as it includes io.h
on Windows, so we can have a rule of "if you do file operations, include
<wsutil/file_util.h> and use the routines in it".
Remove includes of unistd.h, fcntl.h, and sys/stat.h that aren't
necessary (whether because of the addition of them to wsutil/file_util.h
or because they weren't needed in the first place).
Change-Id: Ie241dd74deff284e39a5f690a297dbb6e1dc485f
Reviewed-on: https://code.wireshark.org/review/11619
Petri-Dish: Guy Harris <guy@alum.mit.edu>
Reviewed-by: Guy Harris <guy@alum.mit.edu>
While we're at it, get rid of a commented-out include, and update a
comment to give more information.
Change-Id: I910a26a3d7f4a50f0559abe5f2ab97a93c80357f
Reviewed-on: https://code.wireshark.org/review/11610
Petri-Dish: Guy Harris <guy@alum.mit.edu>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Guy Harris <guy@alum.mit.edu>
I don't know where Matthew Gast got his 4.9 GHz channels, but IEEE Std
802.11-2012 and ARIB STD T-71 have something different.
Change-Id: I5d86b12193e38422d3702f36cb106fe858daa4b5
Reviewed-on: https://code.wireshark.org/review/11585
Reviewed-by: Guy Harris <guy@alum.mit.edu>
It ends up dragging in libwireshark headers, which programs not linking
with libwireshark shouldn't do. In particular, including
<epan/address.h> causes some functions that refer to libwireshark
functions to be defined if the compiler doesn't handle "static inline"
the way GCC does, and you end up requiring libwireshark even though you
shouldn't require it.
Move plurality() to wsutil/str_util.h, so that non-libwireshark code can
get it without include epan/packet.h. Fix includes as necessary.
Change-Id: Ie4819719da4c2b349f61445112aa419e99b977d3
Reviewed-on: https://code.wireshark.org/review/11545
Reviewed-by: Guy Harris <guy@alum.mit.edu>
It will create all the relevant directories (if it can), using
g_mkdir(), which is a wrapper for mkdir() on UN*X - just as ws_mkdir()
is, so we don't need to make our own copy that uses ws_mkdir.
Bug: 11645
Change-Id: I68affc6fabccf58dace75af078d9bfd67a1b47b2
Reviewed-on: https://code.wireshark.org/review/11373
Reviewed-by: Guy Harris <guy@alum.mit.edu>
~ obviously exists, but ~/.config might not, making it impossible to
create ~/.config/wireshark.
Bug: 11645
Change-Id: Ia267b168eb7b1438d4c35a6bb89df9d7bfcbd3f3
Reviewed-on: https://code.wireshark.org/review/11368
Reviewed-by: Guy Harris <guy@alum.mit.edu>
If it doesn't exist, but ~/.wireshark does, continue to use that, for
backwards compatibility.
Derived from change I7fa64d6e8bd43c6a5dec93e30a4f69a747c34256.
Bug: 6353
Change-Id: I937f94b19a371486b7ea2228e51994cc4c72b501
Reviewed-on: https://code.wireshark.org/review/11137
Petri-Dish: Guy Harris <guy@alum.mit.edu>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: João Valverde <j@v6e.pt>
Reviewed-by: Michael Mann <mmann78@netscape.net>
Add a #define giving the UTF-8 sequence for DEGREE SIGN, and use it in
packet-synphasor.c rather than having it define its own version. Use it
in some other places rather than a string of two octal values.
Change-Id: Ic0f3b23ae0165c9824d89304d683f45bce31dced
Reviewed-on: https://code.wireshark.org/review/11102
Reviewed-by: Guy Harris <guy@alum.mit.edu>
Add "/WX" to the Visual C++ compiler flags if DISABLE_WERROR is off,
similar to config.nmake.
We haven't compiled C++ code with -Wshorten-64-to-32 for quite
some time so there's no need to add -Wno-shorten-64-to-32 in
ui/qt/CMakeLists.txt.
Additionally, squelch
----
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\INCLUDE\algorithm(3050) : warning C4267: 'argument' : conversion from 'size_t' to 'int', possible loss of data (.\rpc_service_response_time_dialog.cpp)
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\INCLUDE\algorithm(3065) : see reference to function template instantiation 'void std::_Median<_RanIt,bool(__cdecl *)(const QString &,const QString &)>(_RanIt,_RanIt,_RanIt,_Pr)' being compiled
with
[
_RanIt=QList<QString>::iterator
, _Pr=bool (__cdecl *)(const QString &,const QString &)
]
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\INCLUDE\algorithm(3127) : see reference to function template instantiation 'std::pair<_RanIt,_RanIt> std::_Unguarded_partition<_RanIt,bool(__cdecl *)(const QString &,const QString &)>(_RanIt,_RanIt,_Pr)' being compiled
with
[
_RanIt=QList<QString>::iterator
, _Pr=bool (__cdecl *)(const QString &,const QString &)
]
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\INCLUDE\algorithm(3157) : see reference to function template instantiation 'void std::_Sort<_Iter,int,bool(__cdecl *)(const QString &,const QString &)>(_RanIt,_RanIt,_Diff,_Pr)' being compiled
with
[
_Iter=QList<QString>::iterator
, _RanIt=QList<QString>::iterator
, _Diff=int
, _Pr=bool (__cdecl *)(const QString &,const QString &)
]
.\rpc_service_response_time_dialog.cpp(130) : see reference to function template instantiation 'void std::sort<QList<QString>::iterator,bool(__cdecl *)(const QString &,const QString &)>(_RanIt,_RanIt,_Pr)' being compiled
with
[
_RanIt=QList<QString>::iterator
, _Pr=bool (__cdecl *)(const QString &,const QString &)
]
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\INCLUDE\algorithm(3051) : warning C4267: 'argument' : conversion from 'size_t' to 'int', possible loss of data (.\rpc_service_response_time_dialog.cpp)
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\INCLUDE\algorithm(3052) : warning C4267: 'argument' : conversion from 'size_t' to 'int', possible loss of data (.\rpc_service_response_time_dialog.cpp)
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\INCLUDE\algorithm(3053) : warning C4267: 'argument' : conversion from 'size_t' to 'int', possible loss of data (.\rpc_service_response_time_dialog.cpp)
----
in both rpc_service_response_time_dialog.cpp and wireshark_application.cpp
so that we'll compile successfully.
Change-Id: I457bcede99dcb1f3c1001f1f559c4901bb000357
Reviewed-on: https://code.wireshark.org/review/10533
Petri-Dish: Gerald Combs <gerald@wireshark.org>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Gerald Combs <gerald@wireshark.org>
wsutil/filesystem.c uses dladdr (when available), but does not declare a
dependency on it. Adding it fixes a CMAKE_C(XX)_FLAGS=-fuse-ld=gold
build failure:
run/libwsutil.so.0.0.0: error: undefined reference to 'dladdr'
This change is somehow not necessary for autotools, just for cmake.
Change-Id: I642a7d85f9c33541831262f930e73d1f47c58b60
Reviewed-on: https://code.wireshark.org/review/10906
Petri-Dish: Peter Wu <peter@lekensteyn.nl>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Jörg Mayer <jmayer@loplof.de>
Reviewed-by: Peter Wu <peter@lekensteyn.nl>
Don't display duplicate ports if transport name resolution is not
enabled (for UDP/TCP/DCCP).
Also introduce col_append_port() to handle info column port display
with name resolution in a uniform format.
Change-Id: Icb8ac45f726b7c539b4534c62061473e9b582753
Reviewed-on: https://code.wireshark.org/review/10804
Petri-Dish: Michael Mann <mmann78@netscape.net>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Michael Mann <mmann78@netscape.net>
Even if the result of the negative shift (in TIME_T_MIN) is not used
because the signedness check happens before, it still causes a
compile-time warning. Fix this by shifting on an unsigned value, then
truncate by casting it.
While at it, remove a "fix for broken SCO compiler", it might not apply
to us (fingers crossed).
Change-Id: Id9603149d8063e9eaaa65cf028323f10e60a6c42
Reviewed-on: https://code.wireshark.org/review/10862
Petri-Dish: Peter Wu <peter@lekensteyn.nl>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Peter Wu <peter@lekensteyn.nl>
Change-Id: I6298b3de5f0a1cb988014ff16082eaf8c2a3c3c0
Reviewed-on: https://code.wireshark.org/review/10786
Petri-Dish: Alexis La Goutte <alexis.lagoutte@gmail.com>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Michael Mann <mmann78@netscape.net>
It's _WIN32, with a leading underscore, not WIN32. See, for example:
https://sourceforge.net/p/predef/wiki/OperatingSystems/
and
https://msdn.microsoft.com/en-us/library/b0084kay.aspx
*Some* environments may also define WIN32, but we shouldn't depend on
that.
Replace all-caps "WIN32" referring to Windows in comments and other text
with "Windows" or "Win32". (The two are pretty much equivalent, these
days; nobody much cares about Win16, not that we ever ran on it, and
64-bit Windows is just a 64-bitified Win32.)
Change-Id: Id327bcd4b1e9baa4f27055eff08c2d9e594d6f70
Reviewed-on: https://code.wireshark.org/review/10367
Petri-Dish: Guy Harris <guy@alum.mit.edu>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Guy Harris <guy@alum.mit.edu>
It wasn't working on my system: I kept seeing the old git revision
in '...shark -v' even after deleting version.h
Change-Id: I75f41a7afcee4b9384f33a56014e4af6b527fec5
Reviewed-on: https://code.wireshark.org/review/10265
Petri-Dish: Jörg Mayer <jmayer@loplof.de>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Jörg Mayer <jmayer@loplof.de>
Add the UDP multicast stream dialog. Abuse TapParameterDialog a bit more
so that we can edit parameters.
Remove some unused struct members and an unused function.
Change-Id: I962c70344e792f0959527e4bcba8a20bd7e8acf9
Reviewed-on: https://code.wireshark.org/review/10084
Petri-Dish: Gerald Combs <gerald@wireshark.org>
Reviewed-by: Gerald Combs <gerald@wireshark.org>
The CMake dumpbabi targets collectively copy over 800 files. Do
that when when we build the actual targets instead of at configure
time. Hopefully this will speed up initial CMake runs.
Change-Id: I6e4d691e24c73ea05d638a0f897f570541c84e38
Reviewed-on: https://code.wireshark.org/review/10052
Reviewed-by: Gerald Combs <gerald@wireshark.org>
The readlink function does not guarantee to nul-terminate its result string.
Therefore, it should be done in wsutil/filesystem.c.
Change-Id: Id96533e825a302a1922ce9ac7ee47d5525ac9c39
Reviewed-on: https://code.wireshark.org/review/9597
Reviewed-by: Guy Harris <guy@alum.mit.edu>
Why, oh why, are channel numbers used for 802.11?
Change-Id: Ie26987dfeaad2ce0ead0eef72339f966aadeeecd
Reviewed-on: https://code.wireshark.org/review/9510
Reviewed-by: Guy Harris <guy@alum.mit.edu>
fseek() to the end, followed by ftell(), is a bit of an odd way to get
the file size. Use ws_fstat64() instead.
Check that the file is a regular file, while we're at it. This means we
don't have to check before opening.
Bug: 11268
Change-Id: I31ee20dd5568d10541375cf97b286abfc1384d1c
Reviewed-on: https://code.wireshark.org/review/9230
Petri-Dish: Guy Harris <guy@alum.mit.edu>
Reviewed-by: Guy Harris <guy@alum.mit.edu>
Otherwise it breaks a bunch of stuff on Linux machines because of the way gcc's
preprocessor works (buildbot decryption tests, extcap, etc).
Originally added in Ic5360089f96be620fbe99ba4e819e0caa5ca0215
Change-Id: Iad43fa1415aa331ae375771adac0818ea1b99060
Reviewed-on: https://code.wireshark.org/review/9091
Reviewed-by: Evan Huus <eapache@gmail.com>
to zero in the function call if the file does not exist. The general code
seems to work with MSVC2015 so use that.
Change-Id: Ic5360089f96be620fbe99ba4e819e0caa5ca0215
Reviewed-on: https://code.wireshark.org/review/9070
Reviewed-by: Anders Broman <a.broman58@gmail.com>
QCoreApplication visits eldritch horrors upon argv on Windows. Keep a
local copy for our own processing.
---
[ Pascal's original comments ]
g6c4ec4a introduced the use of arg_list_utf_16to8 that triggers a crash on my
computer when freeing the g_allocated memory.
Let's do a similar work but with a memory allocator that does not trigger an exception.
Also fix a memory leak in arg_list_utf_16to8 while we are at it.
Change-Id: I93d899af20b09c9a5d584a46297f715591502df9
Reviewed-on: https://code.wireshark.org/review/8961
Reviewed-by: Pascal Quantin <pascal.quantin@gmail.com>
Reviewed-by: Gerald Combs <gerald@wireshark.org>
Reviewed-by: Guy Harris <guy@alum.mit.edu>
Call arg_list_utf_16to8 in wireshark-qt.cpp on Windows. Set our default
codec in Qt4 to UTF-8 before doing so.
Bug: 11276
Change-Id: I8e0afb9523ddb5956d30424b7b7ad7f3ea0838c7
Reviewed-on: https://code.wireshark.org/review/8954
Reviewed-by: Gerald Combs <gerald@wireshark.org>
Add the wireless toolbar to the Qt UI.
Start adding AirPcap support to ui/80211_utils. Add FCS validation
routines to ws80211_utils.
Move a bunch of AirPcap routines that require epan from caputils to
ui/gtk. They were required for driver key management, which we'll
leave to the AirPcap Control Panel in the Qt UI.
Move frequency-utils to wsutil.
Change-Id: I44446758046621d183f5c2ba9f6526bf01e084f1
Reviewed-on: https://code.wireshark.org/review/8910
Petri-Dish: Gerald Combs <gerald@wireshark.org>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Gerald Combs <gerald@wireshark.org>
Define WS_INVALID_PID to be the appropriate "there is no process" value.
On UN*X, -1 works; the "pid" is actually a HANDLE for the process on
Windows, so INVALID_HANDLE is appropriate.
Cast HANDLE to intptr_t in the _cwait() call.
Change-Id: Ica2d2319f5c95ba41f590776a745fe040fe494d2
Reviewed-on: https://code.wireshark.org/review/8871
Reviewed-by: Guy Harris <guy@alum.mit.edu>
The MSVC rules for searching for headers are a huge barrel of fun; it
appears that, for some files that need the MSVC <process.h> to declare
getpid(), they're getting our <wsutil/process.h> instead, as that's in
the current directory. Rename it to avoid the collision.
Change-Id: I88eb70237062fa7957e38d7ff8132524390a6a5c
Reviewed-on: https://code.wireshark.org/review/8870
Reviewed-by: Guy Harris <guy@alum.mit.edu>
This avoids type punning; at least with Xcode 7 beta on El Capitan beta,
that produces warnings that get turned into errors.
Change-Id: I57f47455b9630f359828c07c92a190b5cb33816f
Reviewed-on: https://code.wireshark.org/review/8862
Reviewed-by: Guy Harris <guy@alum.mit.edu>
Hopefully that'll make it a little easier to make sure that we're not
overflowing arrays.
Change-Id: I770df045ef9a45fd486c1271ea424b3334bb39d2
Reviewed-on: https://code.wireshark.org/review/8370
Reviewed-by: Guy Harris <guy@alum.mit.edu>
This squelches a warning from Sun/Oracle C, and it's the right thing to
do in any case, as the LHS of the & operator is unsigned.
Change-Id: I824a82d945f8f2535282bbf466dcd65806c6f695
Reviewed-on: https://code.wireshark.org/review/8362
Reviewed-by: Guy Harris <guy@alum.mit.edu>
That's not valid in C99, at least, if the value is negative or if the
shift count is the number of bits in the value - 1, and we might get
compile-time or run-time complaints about that.
Also, make bit masks unsigned; to quote a run-time error reported in
https://www.wireshark.org/lists/wireshark-dev/201504/msg00084.html
"left shift of 1 by 31 places cannot be represented in type 'int'", so
use type "unsigned int" instead, by shifting 1U rather than 1 left.
Change-Id: I62220808058cb93f83329c1916b888a2067d524c
Reviewed-on: https://code.wireshark.org/review/8254
Reviewed-by: Guy Harris <guy@alum.mit.edu>
Add a variant of filetime_to_nstime() that takes a value that's like a
FILETIME but in units of nanoseconds rather than tenths of a
microsecond, and use that. (It looks as if they might just get FILETIME
values from the OS and multiply them by 100, as the nanosecond-FILETIME
values appear to be multiples of 100 in the captures I've seen, but they
might have chosen nanosecond resolution in case they need to support a
higher-resolution time stamp source, so we don't assume that the values
will always be a multiple of 100.)
Change-Id: If6a1cb2cb673688b042eb113b79cfd267f5454a5
Reviewed-on: https://code.wireshark.org/review/8150
Reviewed-by: Guy Harris <guy@alum.mit.edu>
We had several copies of that code; put it into a filetime_to_nstime()
routine in wsutil, and call that common routine instead.
Change-Id: I1eb5579c36c129ff8d23f9212285ab3f63be0f43
Reviewed-on: https://code.wireshark.org/review/8142
Reviewed-by: Guy Harris <guy@alum.mit.edu>
Make sure the target location for extcap executables and extcap_dir
match on OS X.
Set the extcap directory to Contents/MacOS/extcap. The Mac Developer
Library documentation doesn't explicitly define "Resources", but
examples include data files and not executables. It does state that
executables shouldn't go into PlugIns.
Make sure we rpathify androiddump.
Change-Id: If36c762e2a1991c26e5c01a870deaf191bcf9f94
Reviewed-on: https://code.wireshark.org/review/8093
Reviewed-by: Gerald Combs <gerald@wireshark.org>
Revert parts of g2ef72cb and g7710da4 so that the NSIS installer once
again places plugins in $INSTDIR\plugins\$VERSION. This matches the
behavior of Autotools and previous Windows installers, and reduces the
chances of a version mismatch if the user happens to install a custom
plugin.
Leave the development plugin path unversioned. Leave the extcap path
unversioned for now.
Change-Id: I861d4ee12975fba4b642e391871c5e852d92a2fe
Reviewed-on: https://code.wireshark.org/review/7976
Reviewed-by: Pascal Quantin <pascal.quantin@gmail.com>
Reviewed-by: Graham Bloice <graham.bloice@trihedral.com>
Petri-Dish: Graham Bloice <graham.bloice@trihedral.com>
Reviewed-by: Gerald Combs <gerald@wireshark.org>
Comment was, although accurate on the subject, not very well formulated
Change-Id: I4e6a4bdbc40f75b6bca72de4e71451c441d70d08
Reviewed-on: https://code.wireshark.org/review/7863
Reviewed-by: Roland Knall <rknall@gmail.com>
Reviewed-by: Michal Labedzki <michal.labedzki@tieto.com>
Reviewed-by: Anders Broman <a.broman58@gmail.com>
This can be useful when a user cannot modify the Wireshark installation folder (due to UAC restriction for example)
This is already supported on Linux / OSX
Change-Id: Icfcb43908de1fd8cd415cd31a98219eab1c757c8
Reviewed-on: https://code.wireshark.org/review/7809
Reviewed-by: Pascal Quantin <pascal.quantin@gmail.com>
Petri-Dish: Pascal Quantin <pascal.quantin@gmail.com>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Anders Broman <a.broman58@gmail.com>
Routines that don't take a tvbuff as an argument shouldn't have tvb_ in
the name.
Change-Id: I3550256551e30b3f329cbbfca71ef27c727d29c0
Reviewed-on: https://code.wireshark.org/review/7302
Reviewed-by: Guy Harris <guy@alum.mit.edu>
Put the internal routines, which are only to be used by the
implementation of the mempbrk functions, to a separate header file, so
that they're not exported even in the standard header file.
Change-Id: I92c39b138de3e4f9da1b102210b39d50728e2fd6
Reviewed-on: https://code.wireshark.org/review/7300
Reviewed-by: Guy Harris <guy@alum.mit.edu>
dladdr() takes a void * as a code pointer; have init_progfile_dir() do
so, and do the casting in the calls. We don't care about the signature
of the function whose address we're passing, we just want to pass a
pointer to *something* in the main program.
Change-Id: I9372620a97b0eb53c2bb3c0c41a238b4408f3709
Reviewed-on: https://code.wireshark.org/review/7270
Reviewed-by: Guy Harris <guy@alum.mit.edu>
If not, we can't use SSE 4.2, as we need to be able to include it in
files that use tvb_pbrk_compile()/tvb_pbrk_exec() even if they're not
compiled with -msse4.2 (most files aren't, as we need to isolate SSE 4.2
instructions to a small bit of code that uses them only if running on
hardware that supports them).
Change-Id: I62262a3c45fa14e200967916ac0ffc283f8e322c
Reviewed-on: https://code.wireshark.org/review/7246
Reviewed-by: Guy Harris <guy@alum.mit.edu>
The clang on my machine doesn't; just do "format" instead. (The best
way to handle this may be to do the formatting ourselves, so that we can
get thousands separators on *all* platforms, regardless of whether its
printf formatter supports it.)
Change-Id: I1948d1799688cb3cf1d7b0de0696c09f6bf23f1c
Reviewed-on: https://code.wireshark.org/review/7241
Reviewed-by: Guy Harris <guy@alum.mit.edu>
Suppress
warning: ISO C does not support the ''' printf flag [-Wformat=]
We verify that we *do* support it via HAVE_GLIB_PRINTF_GROUPING.
Change-Id: Iedcf1d1856238e05babde5fe8ec23f64fbf2cdcf
Reviewed-on: https://code.wireshark.org/review/7238
Reviewed-by: Gerald Combs <gerald@wireshark.org>
Squelch warnings due to (char *) casts.
Use "include_directories(SYSTEM..." in CMakeLists.txt so that we
don't get pedantic warnings about things we can't easily fix such
as QList loop optimizations. Not sure if there's an easy way to do
this in Autotools.
Pass get_gui_compiled_info to init_progfile_dir. C++ don't have to
show you any stinkin' ::main.
warning: ISO C++ forbids taking address of function ‘::main’ [-Wpedantic]
Change-Id: If1c77284ab0d1b4786bce4e926a4109dd9b1ae34
Reviewed-on: https://code.wireshark.org/review/7207
Petri-Dish: Gerald Combs <gerald@wireshark.org>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Gerald Combs <gerald@wireshark.org>
libjsmn has also been moved from epan/ to wsutil/ to make it visible from wiretap.
Change-Id: I59abb3419acb1baa83194b38152d3651ed5c123c
Bug: 10878
Reviewed-on: https://code.wireshark.org/review/6716
Reviewed-by: Pascal Quantin <pascal.quantin@gmail.com>
Test the compiler for "-Wpedantic" instead of "-pedantic" since DIAG_OFF
and DIAG_ON expect a "-W" flag prefix. Be more strict about the compiler
versions that DIAG_OFF and DIAG_ON support.
Change-Id: I9304c544912102f1719b79e9250f97b40a324430
Reviewed-on: https://code.wireshark.org/review/7123
Petri-Dish: Gerald Combs <gerald@wireshark.org>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Guy Harris <guy@alum.mit.edu>
Both clang and gcc define __GNUC__. Make sure we account for that when
defining diagnostic macros.
Use DIAG_OFF + DIAG_ON to suppress gcc -pedantic warnings about
frame_data.
Get rid of packet_char_enc casts.
Change-Id: Idbcc61bcdb35c1d20f185461c69451dcdf73bae9
Reviewed-on: https://code.wireshark.org/review/7106
Petri-Dish: Gerald Combs <gerald@wireshark.org>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Gerald Combs <gerald@wireshark.org>
Change-Id: If7a6f2697be732ae4f94ed8b845fd293c32510f7
Also: tabs-stops should be 8
Reviewed-on: https://code.wireshark.org/review/7100
Reviewed-by: Bill Meier <wmeier@newsguy.com>
There is no guarantee that a g_malloc'ed memory block will be aligned on a 128 bits boundary
Instead use a static variable definition (at the cost of exposing the HAVE_SSE4_2 compilation flag in ws_mempbrk.h)
Change-Id: I661bf479a9d458d64c96bafc940c519d29a4780b
Reviewed-on: https://code.wireshark.org/review/7070
Petri-Dish: Pascal Quantin <pascal.quantin@gmail.com>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Anders Broman <a.broman58@gmail.com>
Reviewed-by: Pascal Quantin <pascal.quantin@gmail.com>
CMake has "normal" and "cache" variables, and unexpected things happen
if you have a normal and a cache variable with the same name.
Apparently, check_c_compiler_flag() currently sets its result variable
as a cache variable, and set(), by default, sets it as a normal
variable.
This means that there are two different HAVE_SSE4_2 variables, and the
top-level CMakeLists.txt looks at the cache variable when it creates
config.h; this means that if the nmmintrin.h test fails, config.h still
says we have SSE 4.2.
Instead, use separate variables for the "compiler can be made to
generate SSE 4.2 code" test and the "nmmintr.h works" test; that way we
don't have to worry about normal vs. cache variables (and don't have to
worry about CMake changing what type of variable particular
functions/macros set).
Change-Id: I618ad402b248f35fffd822974b6a569d4e5d6398
Reviewed-on: https://code.wireshark.org/review/7073
Reviewed-by: Guy Harris <guy@alum.mit.edu>
This combines the SSE4.2 instructions usage, with pre-compiled
pattern searching usage, for a faster pbrk search method.
Testing against large files of HTTP and SIP, there is about
a 5% performance improvement by using pre-"compiled" patterns
for guint8_pbrk() instead of passing it the search string and
having it build the match array every time.
Similar to regular expressions, "compiling" the pattern match array
in advance only once and using the "compiled" patterns for
the searches is faster than compiling it every time.
Change-Id: Ifcbc14a6c93f32d15663a10d974bacdca5119a8e
Ping-Bug: 10798
Reviewed-on: https://code.wireshark.org/review/6990
Petri-Dish: Hadriel Kaplan <hadrielk@yahoo.com>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Anders Broman <a.broman58@gmail.com>
This is a longer term fix to disable _ws_mempbrk_sse42 in older
Apple compilers, which the buildbots currently use. This fix
is the longer-term fix for the temprorary one introduced in
g9a366b04/I2e438ff29.
Bug: 10798
Change-Id: I051ca003610c07f7d75cc19b20ff823fe4c1ce05
Reviewed-on: https://code.wireshark.org/review/6851
Petri-Dish: Hadriel Kaplan <hadrielk@yahoo.com>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Alexis La Goutte <alexis.lagoutte@gmail.com>
This is a (possibly) temporary change to master to
disable _ws_mempbrk_sse42 to see if that fixes bug
10798.
Ping-Bug: 10798
Change-Id: I2e438ff299f55709c66a37634d2a7e799c513ac9
Reviewed-on: https://code.wireshark.org/review/6844
Petri-Dish: Hadriel Kaplan <hadrielk@yahoo.com>
Reviewed-by: Evan Huus <eapache@gmail.com>
Reviewed-by: Alexis La Goutte <alexis.lagoutte@gmail.com>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Hadriel Kaplan <hadrielk@yahoo.com>
Tested-by: Hadriel Kaplan <hadrielk@yahoo.com>
The version number changed from 6.4 to 10.0
Change-Id: Ie749c97e8335f77d414d80edbd69373bd9a1cdad
Reviewed-on: https://code.wireshark.org/review/6820
Petri-Dish: Pascal Quantin <pascal.quantin@gmail.com>
Reviewed-by: Pascal Quantin <pascal.quantin@gmail.com>
That makes it more VCS-neutral - apparently some people maintain private
versions under VCSes other than Git, and make-version.pl still handles
those VCSes.
Change-Id: Ie4914b16fea8ce800582729260c5e9b9cf1111f4
Reviewed-on: https://code.wireshark.org/review/6779
Reviewed-by: Guy Harris <guy@alum.mit.edu>
If we aren't adding -Werror, just set it to a null string, so when we
fetch it to add the SSE 4.2 flag to it for ws_mempbrk_sse42.c, it
doesn't fail.
Change-Id: I53858130c025e094ed8d0d975451961506fb1a39
Reviewed-on: https://code.wireshark.org/review/6704
Reviewed-by: Guy Harris <guy@alum.mit.edu>
If we think the compiler supports SSE 4.2, check whether we can use
nmmintrin.h if we tell the compiler to compile with SSE 4.2 support; if
not, disable SSE 4.2 support.
This matches what we do in autotools.
Change-Id: I474d53d2fe7e2628faca7309efd7155b63bd7eab
Reviewed-on: https://code.wireshark.org/review/6702
Reviewed-by: Guy Harris <guy@alum.mit.edu>
Move all the SSE 4.2 stuff to wsutil/CMakeLists.txt.
Don't put ws_mempbrk_sse42.c in WSUTIL_FILES by default; add it if we
think the compiler supports compiling for SSE 4.2.
Add -msse4.2 to its COMPILE_FLAGS, but don't add it to any other
compiler flags - we don't want to build anything else with -msse4.2 by
default, as the only code that uses SSE 4.2 instructions but *only* does
so if the processor supports it is our mempbrk implementation. (And
*add* it, don't *replace* the existing flags with -msse4.2; that way,
-Werror is left in there as well.)
Change-Id: I979b37a37e4b88b3af11e2275e89441118c8ce0a
Reviewed-on: https://code.wireshark.org/review/6698
Reviewed-by: Guy Harris <guy@alum.mit.edu>
Redefine PLUGIN_DIR similar to DATAFILE_DIR and use it on all
platforms. Add WiresharkPlugin.cmake so that we can start defining common
macros for plugins/*/CMakeLists.txt. Load plugins in out-of-tree builds.
Change-Id: I8c1359ed3cf8a71788b8320ff89dfe2d3969def2
Reviewed-on: https://code.wireshark.org/review/6640
Reviewed-by: Gerald Combs <gerald@wireshark.org>
g_string_free(str, FALSE) frees the GString container but not the
underlying g_malloc()ed string; instead, it returns a pointer to the
g_malloc()ed string.
Fix those places that didn't already get the string pointer from
g_string_free() to do so rather than manually extracting the string
themselves.
And fix one place that didn't even need to use a string - it was just
scanning a C string without even modifying it.
Change-Id: Ibbf4872bf5b9935b9907f539b6edb1013f3053a5
Reviewed-on: https://code.wireshark.org/review/6532
Reviewed-by: Guy Harris <guy@alum.mit.edu>
CMake now generates local copies of .rc files for all the Windows
components and uses the files in the build of the components.
The .rc.in files that include an icon were modified to allow the icon
path to be set by CMake. The path is removed for nmake builds.
Updated build architecture detection, required for wireshark.manifest.in
Change-Id: I7b1ff43050e9b0efb861d1041636fb4aef49a4f8
Reviewed-on: https://code.wireshark.org/review/6482
Petri-Dish: Graham Bloice <graham.bloice@trihedral.com>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Graham Bloice <graham.bloice@trihedral.com>
Move capchild, caputils, codecs and wsutil into a Libs group
Move gtkui into UI group
Move update-sminmpec into tools group
Change-Id: Iaf2bfe4697265af2c3ed9c9d7de2d5d1ef3cafee
Reviewed-on: https://code.wireshark.org/review/6332
Reviewed-by: Graham Bloice <graham.bloice@trihedral.com>
Tested-by: Graham Bloice <graham.bloice@trihedral.com>
It got removed by the automatic include cleaning scripts
Also add it to text2pcap.c as it is used to get the version when writing a pcapng file
Change-Id: I3d56985fa1d04bcb066fe015a588c24cf3cb7267
Reviewed-on: https://code.wireshark.org/review/6248
Reviewed-by: Pascal Quantin <pascal.quantin@gmail.com>
This:
1) should work on Windows;
2) reflects what the C environment is actually set up to use,
rather than what the environment variables for locale are
set up to use - C programs default to the C locale and only
pick up the setting from the environment variables etc. if
you explicitly request the system locale with a setlocale()
call.
Change-Id: Iee064237e70501a5450d4daa9ab849391f200efd
Reviewed-on: https://code.wireshark.org/review/6195
Reviewed-by: Guy Harris <guy@alum.mit.edu>
It's not that complicated, so we might as well just do it in line.
Change-Id: I10809db554e668a853d28e7dca48b2de0ed51ad3
Reviewed-on: https://code.wireshark.org/review/6190
Reviewed-by: Guy Harris <guy@alum.mit.edu>
Also give more details, for future reference, on how to determine
whether the processor supports CPUID.
Change-Id: I01e7173e45b0079f02338e51248238c05302dbd2
Reviewed-on: https://code.wireshark.org/review/6189
Reviewed-by: Guy Harris <guy@alum.mit.edu>
In case we make ws_cpuid() work on IA-32 processors, add a separate
"always returns no" version of ws_cpuid() for non-x86 processors.
Change-Id: Id6fbd3e5c7d4f04063bc9bcd8f1644cd617b297e
Reviewed-on: https://code.wireshark.org/review/6184
Reviewed-by: Guy Harris <guy@alum.mit.edu>
The routines to get compiler, GLib version, CPU, and memory info are
used only in routines in ws_version_info.c; move them into
ws_version_info.c and make them static.
Change-Id: I58edd18da3301095012d2c7a3c5198e5a7073964
Reviewed-on: https://code.wireshark.org/review/6183
Reviewed-by: Guy Harris <guy@alum.mit.edu>
Have them start the string with "Compiled" or "Running on", and return
the string when done.
Change-Id: Ic4d290c963621fa0385dc5aab766fd4ad31d3810
Reviewed-on: https://code.wireshark.org/review/6155
Reviewed-by: Guy Harris <guy@alum.mit.edu>
Will look at cleaning up and committing script afterwards.
Change-Id: Id785e581740ab62fe9258ecfcb0926761ad9c527
Reviewed-on: https://code.wireshark.org/review/6086
Reviewed-by: Martin Mathieson <martin.r.mathieson@googlemail.com>
We support three types of platforms:
1) UN*Xes that have both getopt() and getopt_long();
2) UN*Xes that have getopt() but not getopt_long();
3) Windows, which has neither.
Checking for getopt_long() lets us distinguish between 1) and 2) and
build getopt_long() for them.
Change-Id: Iaf0f142f9bebaa2eed2128d544ec9786711def45
Reviewed-on: https://code.wireshark.org/review/6045
Reviewed-by: Guy Harris <guy@alum.mit.edu>
Rather than including wsgetopt.c, inet_aton.c, and strptime.c iff we're
building for Windows:
include wsgetopt.c iff we don't have getopt();
include inet_aton.c iff we don't have inet_aton();
include strptime.c iff we don't have strptime().
Change-Id: Ibd68306ac372a4ae102c3220a94cdf6ecb04e58c
Reviewed-on: https://code.wireshark.org/review/6044
Reviewed-by: Guy Harris <guy@alum.mit.edu>
Instead, just add to WSUTIL_FILES as necessary.
Change-Id: Iecadbd9a66ec54ee5d90aecfbfe5e636ae56e27e
Reviewed-on: https://code.wireshark.org/review/6043
Reviewed-by: Guy Harris <guy@alum.mit.edu>
Wireshark UI files into a single one in wsutil.
Change-Id: I0a64f0cc8106bd681bd185289c36272c4c43baad
Reviewed-on: https://code.wireshark.org/review/6026
Reviewed-by: Stephen Fisher <sfisher@sdf.org>
provide their own popcount().
Change-Id: Ic26f3b50cf0bd2b4af0d42e9c27488ebbac1ab33
Reviewed-on: https://code.wireshark.org/review/5998
Petri-Dish: Stephen Fisher <sfisher@sdf.org>
Reviewed-by: Stephen Fisher <sfisher@sdf.org>
At least as I read the GCC documentation, if GCC supports a builtin
floorl() at all, it will always treat floorl() and
__builtin_floorl() the same (it's reserved in C90 and defined in C99, so
nobody should ever write C code assuming floorl() won't be treated in
that afshion).
In addition, the GCC 3.3.6 manual says nothing about __builtin_floorl(),
so it probably won't help to use it. If it appears to help, there's
probably something else going on.
Also, GCC appears not to like "#ifdef (__GNUC__)", as the parentheses
mean it's testing an expression, not a macro name.
Change-Id: Ib88b52c366d7f3b1637bb408fb18d04b67c27e4b
Reviewed-on: https://code.wireshark.org/review/5909
Reviewed-by: Guy Harris <guy@alum.mit.edu>
That better indicates what they do - they don't supply floor(), as
that's a standard math.h feature dating back before C89, they supply
floorl().
Change-Id: Ib1278c51cdfc57680c28c51de87eafb2cb50c8eb
Reviewed-on: https://code.wireshark.org/review/5905
Reviewed-by: Guy Harris <guy@alum.mit.edu>
Add the closing brace for the function body while we're at it.
Change-Id: I73170fdc0885972dce531b553ff8601cceea182e
Reviewed-on: https://code.wireshark.org/review/5902
Reviewed-by: Guy Harris <guy@alum.mit.edu>
Use AC_CHECK_FUNC() for it, define FLOORL_LO to floorl.lo if we *don't*
have it, add FLOORL_LO to the list of items conditionally built in
libwsutil, and include "wsutil/floor.h" only if HAVE_FLOORL is *not*
defined, as that means it's *not* supplied by the platform and thus
*not* declared in <math.h>.
Also, use the standard export stuff in wsutil/floor.h.
Change-Id: Ic24aa69f65f2d15450d8b84b0c2b0c58f38edebe
Reviewed-on: https://code.wireshark.org/review/5901
Reviewed-by: Guy Harris <guy@alum.mit.edu>
__builtin_floorl() function) for systems which don't provide one.
Change-Id: Ie0140ff195f0eae525c7bd70c7c3e23039fde569
Reviewed-on: https://code.wireshark.org/review/5889
Reviewed-by: Stephen Fisher <sfisher@sdf.org>