Add check to ServeRedirect to ensure valid location

This commit is contained in:
Paul Kulchenko 2021-08-16 16:40:40 -07:00
parent 275be556cd
commit b7a40bd737

View file

@ -3061,25 +3061,28 @@ static int LuaServeIndex(lua_State *L) {
static int LuaServeRedirect(lua_State *L) { static int LuaServeRedirect(lua_State *L) {
size_t loclen; size_t loclen;
const char *location; const char *location, *eval;
int code; int code;
OnlyCallDuringRequest("ServeRedirect"); OnlyCallDuringRequest("ServeRedirect");
code = luaL_checkinteger(L, 1); code = luaL_checkinteger(L, 1);
if (!(300 <= code && code <= 399)) { if (!(300 <= code && code <= 399)) {
luaL_argerror(L, 1, "bad status code for redirect"); luaL_argerror(L, 1, "bad status code");
unreachable; unreachable;
} }
location = luaL_checklstring(L, 2, &loclen); location = luaL_checklstring(L, 2, &loclen);
if (msg.version < 10) { if (msg.version < 10) {
(void)ServeError(505, "HTTP Version Not Supported"); (void)ServeError(505, "HTTP Version Not Supported");
lua_pushboolean(L, false); lua_pushboolean(L, false);
} else { } else {
if (!(eval = EncodeHttpHeaderValue(location, loclen, 0))) {
luaL_argerror(L, 2, "invalid location");
unreachable;
}
LOGF("REDIRECT %d to %s", code, location); LOGF("REDIRECT %d to %s", code, location);
luaheaderp = AppendHeader( luaheaderp = AppendHeader(
SetStatus(code, GetHttpReason(code)), "Location", SetStatus(code, GetHttpReason(code)), "Location", eval);
FreeLater(EncodeHttpHeaderValue(location, loclen, 0))); free(eval);
lua_pushboolean(L, true); lua_pushboolean(L, true);
} }
return 1; return 1;