From 3c824d7a8171d7f133aa2f7f6899b5ca82f2fdbf Mon Sep 17 00:00:00 2001 From: Nathaniel Wesley Filardo Date: Wed, 10 Oct 2018 17:36:00 +0100 Subject: [PATCH] Cron fixes, part 2 (+) (#2515) * Restore WRAPCC when building Lua * Fix several parsing bugs --- app/lua/luac_cross/Makefile | 2 +- app/modules/cron.c | 20 ++++++++++++++------ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/app/lua/luac_cross/Makefile b/app/lua/luac_cross/Makefile index 9b9d987f8c..61433628af 100644 --- a/app/lua/luac_cross/Makefile +++ b/app/lua/luac_cross/Makefile @@ -47,7 +47,7 @@ DEPS := $(SRC:%.c=$(ODIR)/%.d) CFLAGS = $(CCFLAGS) $(DEFINES) $(EXTRA_CCFLAGS) $(STD_CFLAGS) $(INCLUDES) DFLAGS = $(CCFLAGS) $(DDEFINES) $(EXTRA_CCFLAGS) $(STD_CFLAGS) $(INCLUDES) -CC := gcc +CC := $(WRAPCC) gcc ECHO := echo diff --git a/app/modules/cron.c b/app/modules/cron.c index 9604801894..2ff16e119b 100644 --- a/app/modules/cron.c +++ b/app/modules/cron.c @@ -32,18 +32,23 @@ static size_t cronent_count = 0; static uint64_t lcron_parsepart(lua_State *L, char *str, char **end, uint8_t min, uint8_t max) { uint64_t res = 0; + + /* Gobble whitespace before potential stars; no strtol on that path */ + while (*str != '\0' && (*str == ' ' || *str == '\t')) { + str++; + } + if (str[0] == '*') { uint32_t each = 1; *end = str + 1; if (str[1] == '/') { each = strtol(str + 2, end, 10); - if (end != 0) if (each == 0 || each >= max - min) { return luaL_error(L, "invalid spec (each %d)", each); } } for (int i = 0; i <= (max - min); i++) { - if (((min + i) % each) == 0) res |= (uint64_t)1 << i; + if ((i % each) == 0) res |= (uint64_t)1 << i; } } else { uint32_t val; @@ -63,14 +68,17 @@ static uint64_t lcron_parsepart(lua_State *L, char *str, char **end, uint8_t min static int lcron_parsedesc(lua_State *L, char *str, struct cronent_desc *desc) { char *s = str; desc->min = lcron_parsepart(L, s, &s, 0, 59); - if (*s != ' ') return luaL_error(L, "invalid spec (separator @%d)", s - str); + if (*s != ' ' && *s != '\t') return luaL_error(L, "invalid spec (separator @%d)", s - str); desc->hour = lcron_parsepart(L, s + 1, &s, 0, 23); - if (*s != ' ') return luaL_error(L, "invalid spec (separator @%d)", s - str); + if (*s != ' ' && *s != '\t') return luaL_error(L, "invalid spec (separator @%d)", s - str); desc->dom = lcron_parsepart(L, s + 1, &s, 1, 31); - if (*s != ' ') return luaL_error(L, "invalid spec (separator @%d)", s - str); + if (*s != ' ' && *s != '\t') return luaL_error(L, "invalid spec (separator @%d)", s - str); desc->mon = lcron_parsepart(L, s + 1, &s, 1, 12); - if (*s != ' ') return luaL_error(L, "invalid spec (separator @%d)", s - str); + if (*s != ' ' && *s != '\t') return luaL_error(L, "invalid spec (separator @%d)", s - str); desc->dow = lcron_parsepart(L, s + 1, &s, 0, 6); + while (*s != '\0' && (*s == ' ' || *s == '\t')) { + s++; + } if (*s != 0) return luaL_error(L, "invalid spec (trailing @%d)", s - str); return 0; }