zfs/module
Matthew Ahrens 9bb0d89c5c Fix use-after-free of vd_path in spa_vdev_remove()
After spa_vdev_remove_aux() is called, the config nvlist is no longer
valid, as it's been replaced by the new one (with the specified device
removed).  Therefore any pointers into the nvlist are no longer valid.
So we can't save the result of
`fnvlist_lookup_string(nv, ZPOOL_CONFIG_PATH)` (in vd_path) across the
call to spa_vdev_remove_aux().

Instead, use spa_strdup() to save a copy of the string before calling
spa_vdev_remove_aux.

Found by AddressSanitizer:

ERROR: AddressSanitizer: heap-use-after-free on address ...
READ of size 34 at 0x608000a1fcd0 thread T686
     0x7fe88b0c166d  (/usr/lib/x86_64-linux-gnu/libasan.so.4+0x5166d)
     0x7fe88a5acd6e in spa_strdup spa_misc.c:1447
     0x7fe88a688034 in spa_vdev_remove vdev_removal.c:2259
     0x55ffbc7748f8 in ztest_vdev_aux_add_remove ztest.c:3229
     0x55ffbc769fba in ztest_execute ztest.c:6714
     0x55ffbc779a90 in ztest_thread ztest.c:6761
     0x7fe889cbc6da in start_thread
     0x7fe8899e588e in __clone

0x608000a1fcd0 is located 48 bytes inside of 88-byte region
freed by thread T686 here:
     0x7fe88b14e7b8 in __interceptor_free
     0x7fe88ae541c5 in nvlist_free nvpair.c:874
     0x7fe88ae543ba in nvpair_free nvpair.c:844
     0x7fe88ae57400 in nvlist_remove_nvpair nvpair.c:978
     0x7fe88a683c81 in spa_vdev_remove_aux vdev_removal.c:185
     0x7fe88a68857c in spa_vdev_remove vdev_removal.c:2221
     0x55ffbc7748f8 in ztest_vdev_aux_add_remove ztest.c:3229
     0x55ffbc769fba in ztest_execute ztest.c:6714
     0x55ffbc779a90 in ztest_thread ztest.c:6761
     0x7fe889cbc6da in start_thread

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Ryan Moeller <ryan@ixsystems.com>
Signed-off-by: Matthew Ahrens <mahrens@delphix.com>
Closes 
2019-12-11 15:38:21 -08:00
..
avl Wrap Linux module macros 2019-11-01 10:41:03 -07:00
icp ICP: Fix out of bounds write 2019-12-06 09:36:19 -08:00
lua Move linux qsort def to platform header 2019-12-03 09:49:40 -08:00
nvpair Restructure nvlist_nv_alloc to work on FreeBSD 2019-11-30 15:45:06 -08:00
os Relocate common quota functions to shared code 2019-12-11 12:12:08 -08:00
spl OpenZFS restructuring - move platform specific sources 2019-09-06 11:26:26 -07:00
unicode Wrap Linux module macros 2019-11-01 10:41:03 -07:00
zcommon Add FreeBSD jail support hooks 2019-12-11 11:58:37 -08:00
zfs Fix use-after-free of vd_path in spa_vdev_remove() 2019-12-11 15:38:21 -08:00
.gitignore Adapt gitignore for modules 2019-12-02 13:23:47 -08:00
Makefile.in module/Makefile.in: don't run xargs if empty 2019-10-08 10:10:23 -07:00