From 72ca8e3b2a45179b731790e6329b978b22ac1ec0 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Thu, 19 Jul 2007 04:00:32 +0000 Subject: [PATCH] r23961: Allow SWAT to operate on x86_64 machines. On machines with a 4 byte int, and a 8 byte pointer, the ESP could would fail. The problem is that 0 != NULL. 0 is an int (4 bytes) and NULL is a pointer (8), and this matters critically to varargs functions. If a 0 was passed as the 'terminating' argument, then only 4 bytes would be written to the stack, but va_arg(ap, char *) would try and pull 8, reading uninitalised memory. Andrew Bartlett --- source/lib/appweb/ejs-2.0/ejs/ejsCmd.c | 10 +++++----- source/lib/appweb/ejs-2.0/ejs/ejsVar.c | 4 ++-- source/lib/appweb/ejs-2.0/mpr/mprString.c | 18 ++++++++++++------ source/lib/appweb/esp/esp.c | 12 ++++++------ source/lib/appweb/mpr/miniMpr.c | 5 ++++- 5 files changed, 29 insertions(+), 20 deletions(-) diff --git a/source/lib/appweb/ejs-2.0/ejs/ejsCmd.c b/source/lib/appweb/ejs-2.0/ejs/ejsCmd.c index b5279c949a7..74b57de4d02 100644 --- a/source/lib/appweb/ejs-2.0/ejs/ejsCmd.c +++ b/source/lib/appweb/ejs-2.0/ejs/ejsCmd.c @@ -167,10 +167,10 @@ int main(int argc, char *argv[]) i = 0; commandLine = 0; len = mprAllocStrcat(MPR_LOC_ARGS(app), &commandLine, 0, " ", - mprGetBaseName(argv[i++]), 0); + mprGetBaseName(argv[i++]), NULL); for (; i < argc; i++) { len = mprReallocStrcat(MPR_LOC_ARGS(app), &commandLine, 0, len, - " ", argv[i], 0); + " ", argv[i], NULL); } mprPrintf(app, " %s\n", commandLine); } @@ -339,7 +339,7 @@ static char *readCmd(MprApp *app, FILE *input) line[len - 1] = '\0'; } cmdLen = mprReallocStrcat(MPR_LOC_ARGS(app), &cmd, EJS_MAX_SCRIPT, - cmdLen, 0, line, 0); + cmdLen, 0, line, NULL); } return cmd; } @@ -380,12 +380,12 @@ static int interactiveUse(MprApp *app, Ejs *ejs, FILE *input, char *fileName) if (line[len - 1] == '\\') { line[len - 1] = '\0'; cmdLen = mprReallocStrcat(MPR_LOC_ARGS(app), &cmd, EJS_MAX_SCRIPT, - cmdLen, 0, line, 0); + cmdLen, 0, line, NULL); } else { cmdLen = mprReallocStrcat(MPR_LOC_ARGS(app), &cmd, EJS_MAX_SCRIPT, - cmdLen, 0, line, 0); + cmdLen, 0, line, NULL); if (traceCmds) { diff --git a/source/lib/appweb/ejs-2.0/ejs/ejsVar.c b/source/lib/appweb/ejs-2.0/ejs/ejsVar.c index 5067215f033..1f8e9266a3e 100644 --- a/source/lib/appweb/ejs-2.0/ejs/ejsVar.c +++ b/source/lib/appweb/ejs-2.0/ejs/ejsVar.c @@ -2590,7 +2590,7 @@ EjsProperty *ejsDefineAccessors(Ejs *ep, EjsVar *vp, const char *prop, /* MOB -- need to encapsulate this logic */ if (mprAllocStrcat(MPR_LOC_ARGS(ep), &propName, EJS_MAX_ID+5, 0, - "-set-", prop, 0) < 0) { + "-set-", prop, NULL) < 0) { ejsMemoryError(ep); return 0; } @@ -2633,7 +2633,7 @@ EjsProperty *ejsDefineCAccessors(Ejs *ep, EjsVar *vp, const char *prop, /* MOB -- OPT to use SLAB */ if (mprAllocStrcat(MPR_LOC_ARGS(ep), &propName, EJS_MAX_ID + 5, 0, - "-set-", prop, 0) < 0) { + "-set-", prop, NULL) < 0) { ejsMemoryError(ep); return 0; } diff --git a/source/lib/appweb/ejs-2.0/mpr/mprString.c b/source/lib/appweb/ejs-2.0/mpr/mprString.c index b688667bcce..d39fc8b7467 100644 --- a/source/lib/appweb/ejs-2.0/mpr/mprString.c +++ b/source/lib/appweb/ejs-2.0/mpr/mprString.c @@ -232,8 +232,10 @@ static int mprCoreStrcat(MPR_LOC_DEC(ctx, loc), char **destp, int destMax, return required - 1; } -/******************************************************************************/ - +/***************************************************************************** + Note that this VARARGS function must be NULL (not 0, this must be a + pointer) terminated +*/ int mprStrcat(char *dest, int destMax, const char *delim, const char *src, ...) { va_list ap; @@ -249,8 +251,10 @@ int mprStrcat(char *dest, int destMax, const char *delim, const char *src, ...) return rc; } -/******************************************************************************/ - +/***************************************************************************** + Note that this VARARGS function must be NULL (not 0, this must be a + pointer) terminated +*/ int mprAllocStrcat(MPR_LOC_DEC(ctx, loc), char **destp, int destMax, const char *delim, const char *src, ...) { @@ -268,8 +272,10 @@ int mprAllocStrcat(MPR_LOC_DEC(ctx, loc), char **destp, int destMax, return rc; } -/******************************************************************************/ - +/***************************************************************************** + Note that this VARARGS function must be NULL (not 0, this must be a + pointer) terminated +*/ int mprReallocStrcat(MPR_LOC_DEC(ctx, loc), char **destp, int destMax, int existingLen, const char *delim, const char *src,...) { diff --git a/source/lib/appweb/esp/esp.c b/source/lib/appweb/esp/esp.c index 0be7af6c1b3..3e47503edfc 100644 --- a/source/lib/appweb/esp/esp.c +++ b/source/lib/appweb/esp/esp.c @@ -352,7 +352,7 @@ void espError(EspRequest *ep, const char *fmt, ...) va_start(args, fmt); mprAllocVsprintf(&buf, MPR_MAX_HEAP_SIZE, fmt, args); - ejsSetErrorMsg(ep->eid, buf); + ejsSetErrorMsg(ep->eid, "%s", buf); mprFree(buf); va_end(args); } @@ -735,7 +735,7 @@ static int buildScript(EspRequest *ep, char **jsBuf, char *input, char **errMsg) case ESP_TOK_LITERAL: len = mprReallocStrcat(jsBuf, maxScriptSize, len, 0, - "write(\"", parse.token, "\");\n", 0); + "write(\"", parse.token, "\");\n", NULL); break; case ESP_TOK_ATAT: @@ -744,12 +744,12 @@ static int buildScript(EspRequest *ep, char **jsBuf, char *input, char **errMsg) * Catenate with "" to cause toString to run. */ len = mprReallocStrcat(jsBuf, maxScriptSize, len, 0, - "write(\"\" + ", parse.token, ");\n", 0); + "write(\"\" + ", parse.token, ");\n", NULL); break; case ESP_TOK_EQUALS: len = mprReallocStrcat(jsBuf, maxScriptSize, len, 0, - "write(\"\" + ", parse.token, ");\n", 0); + "write(\"\" + ", parse.token, ");\n", NULL); state = ESP_STATE_IN_ESP_TAG; break; @@ -759,7 +759,7 @@ static int buildScript(EspRequest *ep, char **jsBuf, char *input, char **errMsg) while (tid != ESP_TOK_EOF && tid != ESP_TOK_EOF && tid != ESP_TOK_END_ESP && len >= 0) { len = mprReallocStrcat(jsBuf, maxScriptSize, len, 0, - parse.token, 0); + parse.token, NULL); tid = getEspToken(state, &parse); } state = ESP_STATE_BEGIN; @@ -802,7 +802,7 @@ static int buildScript(EspRequest *ep, char **jsBuf, char *input, char **errMsg) return rc; } - len = mprReallocStrcat(jsBuf, maxScriptSize, len, 0, incBuf, 0); + len = mprReallocStrcat(jsBuf, maxScriptSize, len, 0, incBuf, NULL); mprFree(incText); mprFree(incBuf); state = ESP_STATE_IN_ESP_TAG; diff --git a/source/lib/appweb/mpr/miniMpr.c b/source/lib/appweb/mpr/miniMpr.c index 8df1817bf12..949d64fcf11 100644 --- a/source/lib/appweb/mpr/miniMpr.c +++ b/source/lib/appweb/mpr/miniMpr.c @@ -387,7 +387,10 @@ static int mprCoreStrcat(int alloc, char **destp, int destMax, int existingLen, return required - 1; } -/*****************************************************************************/ +/***************************************************************************** + Note that this VARARGS function must be NULL (not 0, this must be a + pointer) terminated +*/ int mprReallocStrcat(char **destp, int destMax, int existingLen, const char *delim, const char *src,...)