summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/config.c6
-rw-r--r--src/modules.c8
2 files changed, 13 insertions, 1 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) {