- priority: 5 --> 9
Due to a bug in knocker version 0.7.1 (24 May 2002), it will crash
while starting up. The routine to parse the settings file
~/.knocker/knocker.conf is broken. It is in knocker_conf.c,
_getoptval():
1) The two malloc's for tmpp and p are unnessecary.
2) The *value should be **value because a realloc might alter
the address.
3) The p=strchr() call should be checked for NULL return.
The second item will make knocker crash, at least under
FreeBSD 4.3.
Below I pasted a diff file which fixes the problem.
--- src/knocker_conf.c.orig Fri May 24 01:58:45 2002
+++ src/knocker_conf.c Sun Dec 29 14:19:46 2002
@@ -219,10 +219,10 @@
*/
-static int _getoptval (char *line, char *opt, char *value)
+static int _getoptval (char *line, char *opt, char **value)
{
- char *tmpp = malloc (strlen (line));
- char *p = malloc (strlen (line));
+ char *tmpp;
+ char *p;
/* Check if the option is present in the line */
tmpp = strstr (line, opt);
@@ -234,21 +234,20 @@
if (!_isblank (*tmpp) || *tmpp != KNOCKER_OPTION_TOKEN)
{
- free (tmpp);
return 0;
}
/* Check for the KNOCKER_OPTION_TOKEN char */
p = strchr (line, KNOCKER_OPTION_TOKEN);
- p++;
+ if (p == NULL)
+ return 0; /* nope */
- value = realloc (value, strlen (p) + 1);
+ p++;
- strcpy (value, p);
+ *value = realloc (*value, strlen (p) + 1);
- /* free(p); this cause knocker to segfault */
- /* well I have to know why... */
+ strcpy (*value, p);
return 1;
}
@@ -400,7 +399,7 @@
{
if (_isvalid (linebuff, KNOCKER_OPTION_TOKEN))
{
- if (_getoptval (linebuff,
KNOCKER_CONF_OPT_USE_COLORS, opt_value))
+ if (_getoptval (linebuff,
KNOCKER_CONF_OPT_USE_COLORS, &opt_value))
{
if (_isno (opt_value))
knocker_args.colors = 0;
@@ -409,19 +408,19 @@
else
knocker_args.colors = 1; /* unless is a no colors are
enabled */
}
- else if (_getoptval (linebuff,
KNOCKER_CONF_OPT_COLOR_1, opt_value))
+ else if (_getoptval (linebuff,
KNOCKER_CONF_OPT_COLOR_1, &opt_value))
{
_set_color_conf (opt_value, 1, 0);
}
- else if (_getoptval (linebuff,
KNOCKER_CONF_OPT_COLOR_2, opt_value))
+ else if (_getoptval (linebuff,
KNOCKER_CONF_OPT_COLOR_2, &opt_value))
{
_set_color_conf (opt_value, 2, 0);
}
- else if (_getoptval (linebuff,
KNOCKER_CONF_OPT_COLOR_1_ATTR, opt_value))
+ else if (_getoptval (linebuff,
KNOCKER_CONF_OPT_COLOR_1_ATTR, &opt_value))
{
_set_color_conf (opt_value, 1, 1);
}
- else if (_getoptval (linebuff,
KNOCKER_CONF_OPT_COLOR_2_ATTR, opt_value))
+ else if (_getoptval (linebuff,
KNOCKER_CONF_OPT_COLOR_2_ATTR, &opt_value))
{
_set_color_conf (opt_value, 2, 1);
}