Skip to content

Commit 6d75b16

Browse files
Fix Lua (CVE-2025-46819)
1 parent 0066172 commit 6d75b16

File tree

1 file changed

+17
-12
lines changed
  • app/redis-6.2.6/deps/lua/src

1 file changed

+17
-12
lines changed

app/redis-6.2.6/deps/lua/src/llex.c

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ static void inclinenumber (LexState *ls) {
138138

139139

140140
void luaX_setinput (lua_State *L, LexState *ls, ZIO *z, TString *source) {
141+
ls->t.token = 0;
141142
ls->decpoint = '.';
142143
ls->L = L;
143144
ls->lookahead.token = TK_EOS; /* no look-ahead token */
@@ -207,20 +208,23 @@ static void read_numeral (LexState *ls, SemInfo *seminfo) {
207208
}
208209

209210

210-
static int skip_sep (LexState *ls) {
211-
int count = 0;
211+
static size_t skip_sep (LexState *ls) {
212+
size_t count = 0;
212213
int s = ls->current;
213214
lua_assert(s == '[' || s == ']');
214215
save_and_next(ls);
215216
while (ls->current == '=') {
216217
save_and_next(ls);
217218
count++;
218219
}
219-
return (ls->current == s) ? count : (-count) - 1;
220+
221+
return (ls->current == s) ? count + 2
222+
: (count == 0) ? 1
223+
: 0;
220224
}
221225

222226

223-
static void read_long_string (LexState *ls, SemInfo *seminfo, int sep) {
227+
static void read_long_string (LexState *ls, SemInfo *seminfo, size_t sep) {
224228
int cont = 0;
225229
(void)(cont); /* avoid warnings when `cont' is not used */
226230
save_and_next(ls); /* skip 2nd `[' */
@@ -270,8 +274,8 @@ static void read_long_string (LexState *ls, SemInfo *seminfo, int sep) {
270274
}
271275
} endloop:
272276
if (seminfo)
273-
seminfo->ts = luaX_newstring(ls, luaZ_buffer(ls->buff) + (2 + sep),
274-
luaZ_bufflen(ls->buff) - 2*(2 + sep));
277+
seminfo->ts = luaX_newstring(ls, luaZ_buffer(ls->buff) + sep,
278+
luaZ_bufflen(ls->buff) - 2 * sep);
275279
}
276280

277281

@@ -346,9 +350,9 @@ static int llex (LexState *ls, SemInfo *seminfo) {
346350
/* else is a comment */
347351
next(ls);
348352
if (ls->current == '[') {
349-
int sep = skip_sep(ls);
353+
size_t sep = skip_sep(ls);
350354
luaZ_resetbuffer(ls->buff); /* `skip_sep' may dirty the buffer */
351-
if (sep >= 0) {
355+
if (sep >= 2) {
352356
read_long_string(ls, NULL, sep); /* long comment */
353357
luaZ_resetbuffer(ls->buff);
354358
continue;
@@ -360,13 +364,14 @@ static int llex (LexState *ls, SemInfo *seminfo) {
360364
continue;
361365
}
362366
case '[': {
363-
int sep = skip_sep(ls);
364-
if (sep >= 0) {
367+
size_t sep = skip_sep(ls);
368+
if (sep >= 2) {
365369
read_long_string(ls, seminfo, sep);
366370
return TK_STRING;
367371
}
368-
else if (sep == -1) return '[';
369-
else luaX_lexerror(ls, "invalid long string delimiter", TK_STRING);
372+
else if (sep == 0) /* '[=...' missing second bracket */
373+
luaX_lexerror(ls, "invalid long string delimiter", TK_STRING);
374+
return '[';
370375
}
371376
case '=': {
372377
next(ls);

0 commit comments

Comments
 (0)