On Wed, Dec 17, 2025 at 10:20:52PM +0100, Martin Wilck wrote: > 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 >
For everything but 3,9,12, and 17 Reviewed-by: Benjamin Marzinski <[email protected]> > 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
