From: Hannes Reinecke Date: Wed, 30 Apr 2008 09:03:39 +0000 (+0200) Subject: libdevmapper prints garbage on shutdown X-Git-Tag: 0.4.9~218 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=5ea977617d041d38a2da0efb8b253d72b1e58547;p=platform%2Fupstream%2Fmultipath-tools.git libdevmapper prints garbage on shutdown This patch fixes 2 logging bugs: o multipath command prints unexpected log message like "libdevmapper: libdm-common.c(303): Created /dev/mapper/" o multipathd doesn't log messages like "--------shut down------" during the exit path What is the problem: o multipath command and multipathd register dm_write_log() using dm_log_init() and it can be called from libdevmapper codes like dm_lib_release(). o dm_write_log() references the global "conf" to find the verbosity, but it is freed before dm_lib_release() calls dm_write_log(). o So dm_write_log() reads garbage value like big vervosity. What does the patch do: o multipath command sets NULL to "conf" after freeing it. This prevents dm_write_log() from reading garbage data. o multipath command and multipathd free "conf" after all logging are completed, because the logging functions reference it to find the verbosity. Signed-off-by: Kiyoshi Ueda Signed-off-by: Hannes Reinecke --- diff --git a/multipath/main.c b/multipath/main.c index 0f4b2d2..b6ea6fd 100644 --- a/multipath/main.c +++ b/multipath/main.c @@ -429,9 +429,17 @@ main (int argc, char *argv[]) out: sysfs_cleanup(); - free_config(conf); dm_lib_release(); dm_lib_exit(); + + /* + * Freeing config must be done after dm_lib_exit(), because + * the logging function (dm_write_log()), which is called there, + * references the config. + */ + free_config(conf); + conf = NULL; + #ifdef _DEBUG_ dbg_free_final(NULL); #endif diff --git a/multipathd/main.c b/multipathd/main.c index 50e7441..385521c 100644 --- a/multipathd/main.c +++ b/multipathd/main.c @@ -1373,8 +1373,6 @@ child (void * param) vecs->lock = NULL; FREE(vecs); vecs = NULL; - free_config(conf); - conf = NULL; condlog(2, "--------shut down-------"); @@ -1384,6 +1382,14 @@ child (void * param) dm_lib_release(); dm_lib_exit(); + /* + * Freeing config must be done after condlog() and dm_lib_exit(), + * because logging functions like dlog() and dm_write_log() + * reference the config. + */ + free_config(conf); + conf = NULL; + #ifdef _DEBUG_ dbg_free_final(NULL); #endif