diff options
-rw-r--r-- | src/config.c | 6 | ||||
-rw-r--r-- | src/modules.c | 8 | ||||
-rw-r--r-- | version.log | 2 |
3 files changed, 14 insertions, 2 deletions
diff --git a/src/config.c b/src/config.c index bb43e7d81..5436b0663 100644 --- a/src/config.c +++ b/src/config.c @@ -774,7 +774,11 @@ int parse_directive(Directive * d, char *dir, int ac, char *av[MAXPARAMS], *(int *) d->params[i].ptr = val; break; case PARAM_STRING: - Anope_Free(*(char **)d->params[i].ptr); + /* + * Anope_Free(*(char **)d->params[i].ptr); + * Historically dumb modules pass uninitialized values here so + * we can't free this + */ *(char **) d->params[i].ptr = sstrdup(av[optind++]); if (!d->params[i].ptr) { error(linenum, "%s: Out of memory", d->name); diff --git a/src/modules.c b/src/modules.c index f1fcb39d1..ceeb7e3a0 100644 --- a/src/modules.c +++ b/src/modules.c @@ -2563,6 +2563,14 @@ int moduleGetConfigDirective(Directive * d) char *s = NULL; char *t = NULL; int retval = 1; + int i; + + /* Dumb modules pass uninitialized string pointers here. Dumb people will not add the proper configuration values to services.conf. + * Combine the two and you end up with parse_directive never setting the char* pointers passed here. So, null them out now. + */ + for (i = 0; i < MAXPARAMS && d->params[i].type != PARAM_NONE; i++) + if (d->params[i].type == PARAM_STRING) + *(char **) d->params[i].ptr = NULL; config = fopen(SERVICES_CONF, "r"); if (!config) { diff --git a/version.log b/version.log index cc8200cf4..f80025371 100644 --- a/version.log +++ b/version.log @@ -8,7 +8,7 @@ VERSION_MAJOR="1" VERSION_MINOR="8" VERSION_PATCH="9" VERSION_EXTRA="-git" -VERSION_BUILD="3121" +VERSION_BUILD="3122" # Changes since 1.8.8 Release #Revision 3120 - Fix many memory leaks and valgrind warnings, see pull request #15 |