From e7fb0d8a6f10338fe62e869115dfe9f3a73e2552 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Thu, 3 May 2007 17:49:29 -0300 Subject: 'os.date' checks arguments before passing them to 'strftime' --- loslib.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) (limited to 'loslib.c') diff --git a/loslib.c b/loslib.c index 05138417..f5b46f0e 100644 --- a/loslib.c +++ b/loslib.c @@ -1,5 +1,5 @@ /* -** $Id: loslib.c,v 1.19 2006/04/26 18:19:49 roberto Exp roberto $ +** $Id: loslib.c,v 1.20 2006/09/19 13:57:08 roberto Exp roberto $ ** Standard Operating System library ** See Copyright Notice in lua.h */ @@ -148,15 +148,25 @@ static int os_date (lua_State *L) { else { char cc[3]; luaL_Buffer b; - cc[0] = '%'; cc[2] = '\0'; + cc[0] = '%'; luaL_buffinit(L, &b); for (; *s; s++) { - if (*s != '%' || *(s + 1) == '\0') /* no conversion specifier? */ + if (*s != '%') /* no conversion specifier? */ luaL_addchar(&b, *s); else { size_t reslen; + int i = 1; char buff[200]; /* should be big enough for any conversion result */ - cc[1] = *(++s); + if (*(++s) != '\0' && strchr(LUA_STRFTIMEPREFIX, *s)) + cc[i++] = *(s++); + if (*s != '\0' && strchr(LUA_STRFTIMEOPTIONS, *s)) + cc[i++] = *s; + else { + const char *msg = lua_pushfstring(L, + "invalid conversion specifier '%%%c'", *s); + return luaL_argerror(L, 1, msg); + } + cc[i] = '\0'; reslen = strftime(buff, sizeof(buff), cc, stm); luaL_addlstring(&b, buff, reslen); } -- cgit v1.2.3-55-g6feb