This series contains a number of fixes for various recent issues with multipath-tools. The starting point was a use-after-free issue reported on GitHub [1]. The actual fixes for that are 02/21 and 06/21. Because this Patches 3-12 generally rework the freeing of maps, trying to avoid unexpected freeing of paths while freeing multipath structures.
Because this changes memory handling in multipathd, I ran a set of tests to make sure the series doesn't open up new memory leaks. The good news is that I haven't found any, except some trivial ones (15/21, 16/21). But I did see one minor issue related to libudev [2]. After I found a warning in the libudev man page about the library not being thread-safe, I suspected that this might be causing the leak, and came up with code wrapping all libudev calls with a mutex (18/21, 19/21). Unfortunately it didn't fix the observed leak, but I suppose it's still useful because multipathd is using libudev in a way that the authors of the library explicitly dismiss as unsupported. The release of cmocka 2.0 [3] necessitated rather large-ish adaptations in our unit test code (20/21, 21/21). Finally 13/21 and 17/21 are bug fixes; in particular the latter is rather nasty. [1] https://github.com/opensvc/multipath-tools/issues/128 [2] https://github.com/opensvc/multipath-tools/issues/130 [3] https://github.com/opensvc/multipath-tools/issues/129 Martin Wilck (21): libmultipath: drop drop_multipath libmultipath: don't access path members in free_pgvec() multipathd: free paths in checker_finished() libmultipath: don't touch mpvec in remove_map() libmpathutil: constify find_slot() libmultipath: don't free paths in orphan_paths() libmultipath: free orphaned paths in check_removed_paths() libmultipath: remove free_paths argument from free_pathgroup() libmultipath: fix numeric value of free_paths in free_multipaths() libmultipath: remove free_paths argument from free_pgvec() libmultipath: remove free_paths argument from free_multipathvec() libmultipath: free_multipath: fix FREE_PATHS case multipath-tools: Fix ISO C23 errors with strchr() libmultipath: simplify sysfs_get_target_nodename() multipathd: join the init_unwinder dummy thread kpartx: fix some memory leaks libmpathutil: use union for bitfield libmpathutil: add wrapper code for libudev multipath-tools: use the libudev wrapper functions Makefile: add functionality to determine cmocka version multipath-tools tests: adaptations for cmocka 2.0 Makefile.inc | 2 +- create-config.mk | 5 + kpartx/kpartx.c | 18 +- libdmmp/Makefile | 2 +- libdmmp/libdmmp.c | 2 +- libmpathpersist/mpath_persist.c | 2 +- libmpathpersist/mpath_persist_int.c | 2 +- libmpathpersist/mpath_pr_ioctl.c | 2 +- libmpathpersist/mpath_updatepr.c | 2 +- libmpathutil/Makefile | 2 +- libmpathutil/globals.c | 2 +- libmpathutil/libmpathutil.version | 62 ++ libmpathutil/mt-libudev.c | 776 ++++++++++++++++++++++++++ libmpathutil/mt-libudev.h | 120 ++++ libmpathutil/mt-udev-wrap.h | 90 +++ libmpathutil/parser.c | 2 +- libmpathutil/util.c | 12 +- libmpathutil/util.h | 43 +- libmpathutil/vector.c | 3 +- libmpathutil/vector.h | 2 +- libmpathvalid/mpath_valid.c | 2 +- libmultipath/blacklist.c | 2 +- libmultipath/blacklist.h | 2 +- libmultipath/config.c | 2 +- libmultipath/configure.c | 22 +- libmultipath/dict.c | 2 +- libmultipath/discovery.c | 36 +- libmultipath/dmparser.c | 6 +- libmultipath/foreign.c | 2 +- libmultipath/foreign.h | 2 +- libmultipath/foreign/nvme.c | 2 +- libmultipath/libmultipath.version | 2 + libmultipath/pgpolicies.c | 14 +- libmultipath/print.c | 2 +- libmultipath/prio.c | 2 +- libmultipath/prioritizers/alua_rtpg.c | 2 +- libmultipath/prioritizers/ana.c | 2 +- libmultipath/prkey.c | 4 +- libmultipath/prkey.h | 2 +- libmultipath/propsel.c | 2 +- libmultipath/structs.c | 94 ++-- libmultipath/structs.h | 7 +- libmultipath/structs_vec.c | 58 +- libmultipath/structs_vec.h | 4 +- libmultipath/sysfs.c | 2 +- libmultipath/uevent.c | 2 +- libmultipath/valid.c | 2 +- mpathpersist/main.c | 2 +- multipath/main.c | 16 +- multipathd/cli_handlers.c | 2 +- multipathd/fpin_handlers.c | 2 +- multipathd/init_unwinder.c | 4 +- multipathd/main.c | 20 +- tests/Makefile | 22 +- tests/alias.c | 44 +- tests/blacklist.c | 2 +- tests/cli.c | 8 +- tests/cmocka-compat.h | 16 + tests/devt.c | 6 +- tests/directio.c | 23 +- tests/dmevents.c | 74 +-- tests/features.c | 2 +- tests/hwtable.c | 6 +- tests/mapinfo.c | 82 +-- tests/mpathvalid.c | 18 +- tests/parser.c | 2 +- tests/pgpolicy.c | 4 +- tests/strbuf.c | 130 ++--- tests/sysfs.c | 76 +-- tests/test-lib.c | 90 +-- tests/test-log.c | 10 +- tests/uevent.c | 2 +- tests/unaligned.c | 8 +- tests/util.c | 116 ++-- tests/valid.c | 30 +- tests/vpd.c | 12 +- 76 files changed, 1680 insertions(+), 581 deletions(-) create mode 100644 libmpathutil/mt-libudev.c create mode 100644 libmpathutil/mt-libudev.h create mode 100644 libmpathutil/mt-udev-wrap.h create mode 100644 tests/cmocka-compat.h -- 2.52.0
