From: Willy Tarreau Date: Thu, 27 Apr 2023 16:44:14 +0000 (+0200) Subject: BUG/MINOR: hlua: return wall-clock date, not internal date in core.now() X-Git-Tag: v2.8-dev9~19 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d2f61de8c244e71f7194af53c03c98dcb3d6219a;p=thirdparty%2Fhaproxy.git BUG/MINOR: hlua: return wall-clock date, not internal date in core.now() That's hopefully the last one affected by this. It was a bit trickier because there's the promise in the doc that the date is monotonous, so we continue to use now-start_time as the uptime value and add it to start_date to get the current date. It was also emphasized by commit 28360dc ("MEDIUM: clock: force internal time to wrap early after boot"), causing core.now() to return a date of Mar 20 on Apr 27. No backport is needed. --- diff --git a/src/hlua_fcn.c b/src/hlua_fcn.c index 188fcf4fdb..8d87c34a67 100644 --- a/src/hlua_fcn.c +++ b/src/hlua_fcn.c @@ -300,12 +300,20 @@ void *hlua_checkudata(lua_State *L, int ud, int class_ref) /* This function return the current date at epoch format in milliseconds. */ int hlua_now(lua_State *L) { + /* WT: the doc says "returns the current time" and later says that it's + * monotonic. So the best fit is to use start_date+(now-start_time). + */ + struct timeval tv; + + tv_remain(&start_time, &now, &tv); + tv_add(&tv, &tv, &start_date); + lua_newtable(L); lua_pushstring(L, "sec"); - lua_pushinteger(L, now.tv_sec); + lua_pushinteger(L, tv.tv_sec); lua_rawset(L, -3); lua_pushstring(L, "usec"); - lua_pushinteger(L, now.tv_usec); + lua_pushinteger(L, tv.tv_usec); lua_rawset(L, -3); return 1; }