From e2532816400f005574c7452e5c4e30a3a8067771 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 24 Feb 2011 11:15:06 +0100 Subject: s4:dynconfig: fix segfault in the set_dyn_*() functions We should not try to call free on a const string (the default one). Now we make sure that the dyn_* variable is never NULL and only allocated if it's not the default value. metze Autobuild-User: Stefan Metzmacher Autobuild-Date: Thu Feb 24 12:29:56 CET 2011 on sn-devel-104 --- source4/dynconfig/dynconfig.c | 37 +++++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 12 deletions(-) (limited to 'source4') diff --git a/source4/dynconfig/dynconfig.c b/source4/dynconfig/dynconfig.c index 45b7b73720..65e57e0fc1 100644 --- a/source4/dynconfig/dynconfig.c +++ b/source4/dynconfig/dynconfig.c @@ -45,25 +45,38 @@ #define DEFINE_DYN_CONFIG_PARAM(name) \ const char *dyn_##name = name; \ \ - const char *get_dyn_##name(void) \ +bool is_default_dyn_##name(void) \ {\ - if (dyn_##name == NULL) {\ - return name;\ - }\ - return dyn_##name;\ + if (strcmp(name, dyn_##name) == 0) { \ + return true; \ + } \ + return false; \ }\ \ - const char *set_dyn_##name(const char *newpath) \ +const char *get_dyn_##name(void) \ {\ - if (dyn_##name) {\ - free(discard_const(dyn_##name)); \ - }\ - dyn_##name = strdup(newpath);\ return dyn_##name;\ }\ - bool is_default_dyn_##name(void) \ +\ +const char *set_dyn_##name(const char *newpath) \ {\ - return (dyn_##name == NULL);\ + if (newpath == NULL) { \ + return NULL; \ + } \ + if (strcmp(name, newpath) == 0) { \ + return dyn_##name; \ + } \ + newpath = strdup(newpath);\ + if (newpath == NULL) { \ + return NULL; \ + } \ + if (is_default_dyn_##name()) { \ + /* do not free a static string */ \ + } else if (dyn_##name) {\ + free(discard_const(dyn_##name)); \ + }\ + dyn_##name = newpath; \ + return dyn_##name;\ } /* these are in common with s3 */ -- cgit