ircd: s_conf: fix use of strlcpy in strip_tabs

strlcpy should be called with the size of the destination buffer, not
the length of the source string.

When the source is an empty string, the destination buffer isn't
written at all, resulting in it trying to output uninitialised data.

This could also cause a buffer overflow on very long invalid config
lines.
This commit is contained in:
Simon Arlott 2017-06-25 19:48:49 +01:00
parent 40ac82e878
commit 89bb7d65fb
No known key found for this signature in database
GPG key ID: C8975F2043CA5D24

View file

@ -1615,15 +1615,15 @@ conf_add_d_conf(struct ConfItem *aconf)
}
}
static char *
strip_tabs(char *dest, const char *src, size_t len)
static void
strip_tabs(char *dest, const char *src, size_t size)
{
char *d = dest;
if(dest == NULL || src == NULL)
return NULL;
return;
rb_strlcpy(dest, src, len);
rb_strlcpy(dest, src, size);
while(*d)
{
@ -1631,7 +1631,6 @@ strip_tabs(char *dest, const char *src, size_t len)
*d = ' ';
d++;
}
return dest;
}
/*
@ -1646,7 +1645,7 @@ yyerror(const char *msg)
{
char newlinebuf[BUFSIZE];
strip_tabs(newlinebuf, yy_linebuf, strlen(yy_linebuf));
strip_tabs(newlinebuf, yy_linebuf, sizeof(newlinebuf));
ierror("\"%s\", line %d: %s at '%s'", conffilebuf, lineno + 1, msg, newlinebuf);
sendto_realops_snomask(SNO_GENERAL, L_ALL, "\"%s\", line %d: %s at '%s'",