ircd: substitution: fix overrun with unterminated '}' in format string
handle a variable following an unterminated variable better
This commit is contained in:
parent
169a1c3535
commit
1dfb080874
1 changed files with 11 additions and 4 deletions
|
@ -116,7 +116,13 @@ char *substitution_parse(const char *fmt, rb_dlink_list *varlist)
|
||||||
/* break out ${var} */
|
/* break out ${var} */
|
||||||
for (pptr = ptr + 2; *pptr != '\0'; pptr++)
|
for (pptr = ptr + 2; *pptr != '\0'; pptr++)
|
||||||
{
|
{
|
||||||
if (*pptr != '}')
|
if (*pptr == '$')
|
||||||
|
{
|
||||||
|
*vptr++ = '\0';
|
||||||
|
pptr--;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (*pptr != '}')
|
||||||
*vptr++ = *pptr;
|
*vptr++ = *pptr;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -125,9 +131,6 @@ char *substitution_parse(const char *fmt, rb_dlink_list *varlist)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
s_assert(*varname != '\0');
|
|
||||||
s_assert(*pptr != '\0');
|
|
||||||
|
|
||||||
/* advance ptr by length of variable */
|
/* advance ptr by length of variable */
|
||||||
ptr += (pptr - ptr);
|
ptr += (pptr - ptr);
|
||||||
|
|
||||||
|
@ -142,6 +145,10 @@ char *substitution_parse(const char *fmt, rb_dlink_list *varlist)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* don't increment ptr into a following string if the '}' is missing */
|
||||||
|
if (*ptr == '\0')
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
*bptr = '\0';
|
*bptr = '\0';
|
||||||
|
|
Loading…
Reference in a new issue