Fix buffer overflow in %{S:...} and %{P:...} macro primitives
We can't assume that a buffer allocated for one thing is sufficient for another thing. The S and P macros share the same exact logic, refactor to use common code to avoid having to fix twice, cleaning up doFoo() a bit in the process. Fixes: #1019
This commit is contained in:
parent
c886b359ba
commit
94623389ba
|
@ -140,6 +140,8 @@ static void doLua(MacroBuf mb, int chkexist, int negate,
|
||||||
const char * f, size_t fn, const char * g, size_t gn);
|
const char * f, size_t fn, const char * g, size_t gn);
|
||||||
static void doOutput(MacroBuf mb, int chkexist, int negate,
|
static void doOutput(MacroBuf mb, int chkexist, int negate,
|
||||||
const char * f, size_t fn, const char * g, size_t gn);
|
const char * f, size_t fn, const char * g, size_t gn);
|
||||||
|
static void doSP(MacroBuf mb, int chkexist, int negate,
|
||||||
|
const char * f, size_t fn, const char * g, size_t gn);
|
||||||
static void doTrace(MacroBuf mb, int chkexist, int negate,
|
static void doTrace(MacroBuf mb, int chkexist, int negate,
|
||||||
const char * f, size_t fn, const char * g, size_t gn);
|
const char * f, size_t fn, const char * g, size_t gn);
|
||||||
|
|
||||||
|
@ -553,8 +555,8 @@ static struct builtins_s {
|
||||||
parseFunc parse;
|
parseFunc parse;
|
||||||
int havearg;
|
int havearg;
|
||||||
} const builtinmacros[] = {
|
} const builtinmacros[] = {
|
||||||
{ STR_AND_LEN("P"), doFoo, NULL, 1 },
|
{ STR_AND_LEN("P"), doSP, NULL, 1 },
|
||||||
{ STR_AND_LEN("S"), doFoo, NULL, 1 },
|
{ STR_AND_LEN("S"), doSP, NULL, 1 },
|
||||||
{ STR_AND_LEN("basename"), doFoo, NULL, 1 },
|
{ STR_AND_LEN("basename"), doFoo, NULL, 1 },
|
||||||
{ STR_AND_LEN("define"), NULL, doDef, 0 },
|
{ STR_AND_LEN("define"), NULL, doDef, 0 },
|
||||||
{ STR_AND_LEN("dirname"), doFoo, NULL, 1 },
|
{ STR_AND_LEN("dirname"), doFoo, NULL, 1 },
|
||||||
|
@ -1053,6 +1055,25 @@ static void doLua(MacroBuf mb, int chkexist, int negate, const char * f, size_t
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
doSP(MacroBuf mb, int chkexist, int negate,
|
||||||
|
const char * f, size_t fn, const char * g, size_t gn)
|
||||||
|
{
|
||||||
|
const char *b = "";
|
||||||
|
char *buf = NULL;
|
||||||
|
char *s = NULL;
|
||||||
|
|
||||||
|
if (gn > 0) {
|
||||||
|
expandThis(mb, g, gn, &buf);
|
||||||
|
b = buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
s = rstrscat(NULL, (*f == 'S') ? "%SOURCE" : "%PATCH", b, NULL);
|
||||||
|
expandMacro(mb, s, 0);
|
||||||
|
free(s);
|
||||||
|
free(buf);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Execute macro primitives.
|
* Execute macro primitives.
|
||||||
* @param mb macro expansion state
|
* @param mb macro expansion state
|
||||||
|
@ -1186,22 +1207,6 @@ doFoo(MacroBuf mb, int chkexist, int negate, const char * f, size_t fn,
|
||||||
} else if (STREQ("getncpus", f, fn)) {
|
} else if (STREQ("getncpus", f, fn)) {
|
||||||
sprintf(buf, "%u", getncpus());
|
sprintf(buf, "%u", getncpus());
|
||||||
b = buf;
|
b = buf;
|
||||||
} else if (STREQ("S", f, fn)) {
|
|
||||||
for (b = buf; (c = *b) && risdigit(c);)
|
|
||||||
b++;
|
|
||||||
if (!c) { /* digit index */
|
|
||||||
b++;
|
|
||||||
sprintf(b, "%%SOURCE%s", buf);
|
|
||||||
} else
|
|
||||||
b = buf;
|
|
||||||
} else if (STREQ("P", f, fn)) {
|
|
||||||
for (b = buf; (c = *b) && risdigit(c);)
|
|
||||||
b++;
|
|
||||||
if (!c) { /* digit index */
|
|
||||||
b++;
|
|
||||||
sprintf(b, "%%PATCH%s", buf);
|
|
||||||
} else
|
|
||||||
b = buf;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (b) {
|
if (b) {
|
||||||
|
|
Loading…
Reference in New Issue