Search
j0ke.net Open Build Service
>
Projects
>
GFS
>
multipath-tools
> multipath-tools-reorder-config_free
Sign Up
|
Log In
Username
Password
Cancel
Overview
Repositories
Revisions
Requests
Users
Advanced
Attributes
Meta
File multipath-tools-reorder-config_free of Package multipath-tools
commit c85123b94c6efa5a5316e9ae58b0e00337cdde0c Author: Hannes Reinecke <hare@suse.de> Date: Mon Mar 31 11:54:54 2008 +0200 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/<mapname>" 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 <k-ueda@ct.jp.nec.com> Signed-off-by: Hannes Reinecke <hare@suse.de> diff --git a/multipath/main.c b/multipath/main.c index 49ffa85..c87a0c8 100644 --- a/multipath/main.c +++ b/multipath/main.c @@ -475,9 +475,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 f6ed7a9..ca5802b 100644 --- a/multipathd/main.c +++ b/multipathd/main.c @@ -1374,8 +1374,6 @@ child (void * param) vecs->lock = NULL; FREE(vecs); vecs = NULL; - free_config(conf); - conf = NULL; condlog(2, "--------shut down-------"); @@ -1385,6 +1383,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