[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#1112074: bookworm-pu: package luajit/2.1.0~beta3+git20220320+dfsg-4.1+deb12u1



Hi,

On Tue, 26 Aug 2025 at 08:02:16 +0200, Salvatore Bonaccorso wrote:
> Small remark, the target distribution needs to be bookworm for the
> point release update.

Oops right, thanks Salvatore!  Attaching updated debdiff with the
correct distribution (no other changes).

Cheers
-- 
Guilhem.
diffstat for luajit-2.1.0~beta3+git20220320+dfsg luajit-2.1.0~beta3+git20220320+dfsg

 changelog                    |   12 +++
 patches/CVE-2024-25176.patch |   27 +++++++
 patches/CVE-2024-25177.patch |   42 +++++++++++
 patches/CVE-2024-25178.patch |  163 +++++++++++++++++++++++++++++++++++++++++++
 patches/series               |    3 
 salsa-ci.yml                 |    9 ++
 6 files changed, 256 insertions(+)

diff -Nru luajit-2.1.0~beta3+git20220320+dfsg/debian/changelog luajit-2.1.0~beta3+git20220320+dfsg/debian/changelog
--- luajit-2.1.0~beta3+git20220320+dfsg/debian/changelog	2022-09-08 20:16:27.000000000 +0200
+++ luajit-2.1.0~beta3+git20220320+dfsg/debian/changelog	2025-08-25 13:39:40.000000000 +0200
@@ -1,3 +1,15 @@
+luajit (2.1.0~beta3+git20220320+dfsg-4.1+deb12u1) bookworm; urgency=high
+
+  * Non-maintainer upload.
+  * Fix CVE-2024-25176: Stack-buffer-overflow in lj_strfmt_wfnum() in
+    lj_strfmt_num.c.
+  * Fix CVE-2024-25177: Unsinking of IR_FSTORE for NULL metatable, which leads
+    to Denial of Service.
+  * Fix CVE-2024-25178: Out-of-bounds read in the stack-overflow handler in
+    lj_state.c.
+
+ -- Guilhem Moulin <guilhem@debian.org>  Mon, 25 Aug 2025 13:39:40 +0200
+
 luajit (2.1.0~beta3+git20220320+dfsg-4.1) unstable; urgency=medium
 
   * Non-maintainer upload
diff -Nru luajit-2.1.0~beta3+git20220320+dfsg/debian/patches/CVE-2024-25176.patch luajit-2.1.0~beta3+git20220320+dfsg/debian/patches/CVE-2024-25176.patch
--- luajit-2.1.0~beta3+git20220320+dfsg/debian/patches/CVE-2024-25176.patch	1970-01-01 01:00:00.000000000 +0100
+++ luajit-2.1.0~beta3+git20220320+dfsg/debian/patches/CVE-2024-25176.patch	2025-08-25 13:39:40.000000000 +0200
@@ -0,0 +1,27 @@
+From: Mike Pall <mike>
+Date: Thu, 25 Jan 2024 13:23:48 +0100
+Subject: Fix zero stripping in %g number formatting.
+
+Reported by pwnhacker0x18. #1149
+
+Origin: https://github.com/LuaJIT/LuaJIT/commit/343ce0edaf3906a62022936175b2f5410024cbfc
+Bug: https://github.com/LuaJIT/LuaJIT/issues/1149
+Bug-Debian-Security: https://security-tracker.debian.org/tracker/CVE-2024-25176
+---
+ src/lj_strfmt_num.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/src/lj_strfmt_num.c b/src/lj_strfmt_num.c
+index 3c60695..4121489 100644
+--- a/src/lj_strfmt_num.c
++++ b/src/lj_strfmt_num.c
+@@ -454,7 +454,8 @@ static char *lj_strfmt_wfnum(SBuf *sb, SFormat sf, lua_Number n, char *p)
+ 	    prec--;
+ 	    if (!i) {
+ 	      if (ndlo == ndhi) { prec = 0; break; }
+-	      lj_strfmt_wuint9(tail, nd[++ndlo]);
++	      ndlo = (ndlo + 1) & 0x3f;
++	      lj_strfmt_wuint9(tail, nd[ndlo]);
+ 	      i = 9;
+ 	    }
+ 	  }
diff -Nru luajit-2.1.0~beta3+git20220320+dfsg/debian/patches/CVE-2024-25177.patch luajit-2.1.0~beta3+git20220320+dfsg/debian/patches/CVE-2024-25177.patch
--- luajit-2.1.0~beta3+git20220320+dfsg/debian/patches/CVE-2024-25177.patch	1970-01-01 01:00:00.000000000 +0100
+++ luajit-2.1.0~beta3+git20220320+dfsg/debian/patches/CVE-2024-25177.patch	2025-08-25 13:39:40.000000000 +0200
@@ -0,0 +1,42 @@
+From: Mike Pall <mike>
+Date: Tue, 23 Jan 2024 18:58:52 +0100
+Subject: Fix unsinking of IR_FSTORE for NULL metatable.
+
+Reported by pwnhacker0x18. #1147
+
+Origin: https://github.com/LuaJIT/LuaJIT/commit/85b4fed0b0353dd78c8c875c2f562d522a2b310f
+Bug: https://github.com/LuaJIT/LuaJIT/issues/1147
+Bug-Debian-Security: https://security-tracker.debian.org/tracker/CVE-2024-25177
+---
+ src/lj_snap.c | 11 ++++++++---
+ 1 file changed, 8 insertions(+), 3 deletions(-)
+
+diff --git a/src/lj_snap.c b/src/lj_snap.c
+index 4140fdb..d2c454c 100644
+--- a/src/lj_snap.c
++++ b/src/lj_snap.c
+@@ -453,6 +453,7 @@ static TRef snap_replay_const(jit_State *J, IRIns *ir)
+   case IR_KNUM: case IR_KINT64:
+     return lj_ir_k64(J, (IROp)ir->o, ir_k64(ir)->u64);
+   case IR_KPTR: return lj_ir_kptr(J, ir_kptr(ir));  /* Continuation. */
++  case IR_KNULL: return lj_ir_knull(J, irt_type(ir->t));
+   default: lj_assertJ(0, "bad IR constant op %d", ir->o); return TREF_NIL;
+   }
+ }
+@@ -882,9 +883,13 @@ static void snap_unsink(jit_State *J, GCtrace *T, ExitState *ex,
+ 	if (irk->o == IR_FREF) {
+ 	  lj_assertJ(irk->op2 == IRFL_TAB_META,
+ 		     "sunk store with bad field %d", irk->op2);
+-	  snap_restoreval(J, T, ex, snapno, rfilt, irs->op2, &tmp);
+-	  /* NOBARRIER: The table is new (marked white). */
+-	  setgcref(t->metatable, obj2gco(tabV(&tmp)));
++	  if (T->ir[irs->op2].o == IR_KNULL) {
++	    setgcrefnull(t->metatable);
++	  } else {
++	    snap_restoreval(J, T, ex, snapno, rfilt, irs->op2, &tmp);
++	    /* NOBARRIER: The table is new (marked white). */
++	    setgcref(t->metatable, obj2gco(tabV(&tmp)));
++	  }
+ 	} else {
+ 	  irk = &T->ir[irk->op2];
+ 	  if (irk->o == IR_KSLOT) irk = &T->ir[irk->op1];
diff -Nru luajit-2.1.0~beta3+git20220320+dfsg/debian/patches/CVE-2024-25178.patch luajit-2.1.0~beta3+git20220320+dfsg/debian/patches/CVE-2024-25178.patch
--- luajit-2.1.0~beta3+git20220320+dfsg/debian/patches/CVE-2024-25178.patch	1970-01-01 01:00:00.000000000 +0100
+++ luajit-2.1.0~beta3+git20220320+dfsg/debian/patches/CVE-2024-25178.patch	2025-08-25 13:39:40.000000000 +0200
@@ -0,0 +1,163 @@
+From: Mike Pall <mike>
+Date: Sun, 4 Feb 2024 16:34:30 +0100
+Subject: Rework stack overflow handling.
+
+Reported by pwnhacker0x18. Fixed by Peter Cawley. #1152
+
+Origin: https://github.com/LuaJIT/LuaJIT/commit/defe61a56751a0db5f00ff3ab7b8f45436ba74c8
+Origin: https://github.com/LuaJIT/LuaJIT/commit/0d313b243194a0b8d2399d8b549ca5a0ff234db5
+Bug: https://github.com/LuaJIT/LuaJIT/issues/1152
+Bug-Debian_security: https://security-tracker.debian.org/tracker/CVE-2024-25178
+---
+ src/lj_debug.c |  1 +
+ src/lj_err.c   | 22 ++++++++++++++++++++--
+ src/lj_err.h   |  1 +
+ src/lj_state.c | 55 ++++++++++++++++++++++++++++++++++++++++++-------------
+ 4 files changed, 64 insertions(+), 15 deletions(-)
+
+diff --git a/src/lj_debug.c b/src/lj_debug.c
+index 112f535..861fac6 100644
+--- a/src/lj_debug.c
++++ b/src/lj_debug.c
+@@ -64,6 +64,7 @@ static BCPos debug_framepc(lua_State *L, GCfunc *fn, cTValue *nextframe)
+     if (cf == NULL || (char *)cframe_pc(cf) == (char *)cframe_L(cf))
+       return NO_BCPOS;
+     ins = cframe_pc(cf);  /* Only happens during error/hook handling. */
++    if (!ins) return NO_BCPOS;
+   } else {
+     if (frame_islua(nextframe)) {
+       ins = frame_pc(nextframe);
+diff --git a/src/lj_err.c b/src/lj_err.c
+index 563c770..4d74f6d 100644
+--- a/src/lj_err.c
++++ b/src/lj_err.c
+@@ -777,6 +777,14 @@ LJ_NOINLINE void lj_err_mem(lua_State *L)
+ {
+   if (L->status == LUA_ERRERR+1)  /* Don't touch the stack during lua_open. */
+     lj_vm_unwind_c(L->cframe, LUA_ERRMEM);
++  if (curr_funcisL(L)) {
++    L->top = curr_topL(L);
++    if (LJ_UNLIKELY(L->top > tvref(L->maxstack))) {
++      /* The current Lua frame violates the stack. Replace it with a dummy. */
++      L->top = L->base;
++      setframe_gc(L->base - 1 - LJ_FR2, obj2gco(L), LJ_TTHREAD);
++    }
++  }
+   setstrV(L, L->top++, lj_err_str(L, LJ_ERR_ERRMEM));
+   lj_err_throw(L, LUA_ERRMEM);
+ }
+@@ -837,9 +845,11 @@ LJ_NOINLINE void LJ_FASTCALL lj_err_run(lua_State *L)
+ {
+   ptrdiff_t ef = (LJ_HASJIT && tvref(G(L)->jit_base)) ? 0 : finderrfunc(L);
+   if (ef) {
+-    TValue *errfunc = restorestack(L, ef);
+-    TValue *top = L->top;
++    TValue *errfunc, *top;
++    lj_state_checkstack(L, LUA_MINSTACK * 2);  /* Might raise new error. */
+     lj_trace_abort(G(L));
++    errfunc = restorestack(L, ef);
++    top = L->top;
+     if (!tvisfunc(errfunc) || L->status == LUA_ERRERR) {
+       setstrV(L, top-1, lj_err_str(L, LJ_ERR_ERRERR));
+       lj_err_throw(L, LUA_ERRERR);
+@@ -855,6 +865,7 @@ LJ_NOINLINE void LJ_FASTCALL lj_err_run(lua_State *L)
+ }
+ 
+ #if LJ_HASJIT
++/* Rethrow error after doing a trace exit. */
+ LJ_NOINLINE void LJ_FASTCALL lj_err_trace(lua_State *L, int errcode)
+ {
+   if (errcode == LUA_ERRRUN)
+@@ -864,6 +875,13 @@ LJ_NOINLINE void LJ_FASTCALL lj_err_trace(lua_State *L, int errcode)
+ }
+ #endif
+ 
++/* Stack overflow error. */
++void LJ_FASTCALL lj_err_stkov(lua_State *L)
++{
++  lj_debug_addloc(L, err2msg(LJ_ERR_STKOV), L->base-1, NULL);
++  lj_err_run(L);
++}
++
+ /* Formatted runtime error message. */
+ LJ_NORET LJ_NOINLINE static void err_msgv(lua_State *L, ErrMsg em, ...)
+ {
+diff --git a/src/lj_err.h b/src/lj_err.h
+index bd4de9a..a3aaa75 100644
+--- a/src/lj_err.h
++++ b/src/lj_err.h
+@@ -23,6 +23,7 @@ LJ_DATA const char *lj_err_allmsg;
+ LJ_FUNC GCstr *lj_err_str(lua_State *L, ErrMsg em);
+ LJ_FUNCA_NORET void LJ_FASTCALL lj_err_throw(lua_State *L, int errcode);
+ LJ_FUNC_NORET void lj_err_mem(lua_State *L);
++LJ_FUNC_NORET void LJ_FASTCALL lj_err_stkov(lua_State *L);
+ LJ_FUNC_NORET void LJ_FASTCALL lj_err_run(lua_State *L);
+ #if LJ_HASJIT
+ LJ_FUNCA_NORET void LJ_FASTCALL lj_err_trace(lua_State *L, int errcode);
+diff --git a/src/lj_state.c b/src/lj_state.c
+index 0b9c46b..c870aae 100644
+--- a/src/lj_state.c
++++ b/src/lj_state.c
+@@ -102,20 +102,49 @@ void lj_state_shrinkstack(lua_State *L, MSize used)
+ /* Try to grow stack. */
+ void LJ_FASTCALL lj_state_growstack(lua_State *L, MSize need)
+ {
+-  MSize n;
+-  if (L->stacksize > LJ_STACK_MAXEX)  /* Overflow while handling overflow? */
+-    lj_err_throw(L, LUA_ERRERR);
+-  n = L->stacksize + need;
+-  if (n > LJ_STACK_MAX) {
+-    n += 2*LUA_MINSTACK;
+-  } else if (n < 2*L->stacksize) {
+-    n = 2*L->stacksize;
+-    if (n >= LJ_STACK_MAX)
+-      n = LJ_STACK_MAX;
++  MSize n = L->stacksize + need;
++  if (LJ_LIKELY(n < LJ_STACK_MAX)) {  /* The stack can grow as requested. */
++    if (n < 2 * L->stacksize) {  /* Try to double the size. */
++      n = 2 * L->stacksize;
++      if (n > LJ_STACK_MAX)
++	n = LJ_STACK_MAX;
++    }
++    resizestack(L, n);
++  } else {  /* Request would overflow. Raise a stack overflow error. */
++    if (LJ_HASJIT) {
++      TValue *base = tvref(G(L)->jit_base);
++      if (base) L->base = base;
++    }
++    if (curr_funcisL(L)) {
++      L->top = curr_topL(L);
++      if (L->top > tvref(L->maxstack)) {
++	/* The current Lua frame violates the stack, so replace it with a
++	** dummy. This can happen when BC_IFUNCF is trying to grow the stack.
++	*/
++	L->top = L->base;
++	setframe_gc(L->base - 1 - LJ_FR2, obj2gco(L), LJ_TTHREAD);
++      }
++    }
++    if (L->stacksize <= LJ_STACK_MAXEX) {
++      /* An error handler might want to inspect the stack overflow error, but
++      ** will need some stack space to run in. We give it a stack size beyond
++      ** the normal limit in order to do so, then rely on lj_state_relimitstack
++      ** calls during unwinding to bring us back to a convential stack size.
++      ** The + 1 is space for the error message, and 2 * LUA_MINSTACK is for
++      ** the lj_state_checkstack() call in lj_err_run().
++      */
++      resizestack(L, LJ_STACK_MAX + 1 + 2 * LUA_MINSTACK);
++      lj_err_stkov(L);  /* May invoke an error handler. */
++    } else {
++      /* If we're here, then the stack overflow error handler is requesting
++      ** to grow the stack even further. We have no choice but to abort the
++      ** error handler.
++      */
++      GCstr *em = lj_err_str(L, LJ_ERR_STKOV);  /* Might OOM. */
++      setstrV(L, L->top++, em);  /* There is always space to push an error. */
++      lj_err_throw(L, LUA_ERRERR);  /* Does not invoke an error handler. */
++    }
+   }
+-  resizestack(L, n);
+-  if (L->stacksize > LJ_STACK_MAXEX)
+-    lj_err_msg(L, LJ_ERR_STKOV);
+ }
+ 
+ void LJ_FASTCALL lj_state_growstack1(lua_State *L)
diff -Nru luajit-2.1.0~beta3+git20220320+dfsg/debian/patches/series luajit-2.1.0~beta3+git20220320+dfsg/debian/patches/series
--- luajit-2.1.0~beta3+git20220320+dfsg/debian/patches/series	2022-09-08 20:16:27.000000000 +0200
+++ luajit-2.1.0~beta3+git20220320+dfsg/debian/patches/series	2025-08-25 13:39:40.000000000 +0200
@@ -1,3 +1,6 @@
 0001-consider-Hurd-as-a-POSIX-system.patch
 0002-Enable-debugging-symbols-in-the-build.patch
 0003-Get-rid-of-LUAJIT_VERSION_SYM-that-changes-ABI-on-ev.patch
+CVE-2024-25176.patch
+CVE-2024-25177.patch
+CVE-2024-25178.patch
diff -Nru luajit-2.1.0~beta3+git20220320+dfsg/debian/salsa-ci.yml luajit-2.1.0~beta3+git20220320+dfsg/debian/salsa-ci.yml
--- luajit-2.1.0~beta3+git20220320+dfsg/debian/salsa-ci.yml	1970-01-01 01:00:00.000000000 +0100
+++ luajit-2.1.0~beta3+git20220320+dfsg/debian/salsa-ci.yml	2025-08-25 13:39:40.000000000 +0200
@@ -0,0 +1,9 @@
+---
+include:
+  - https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/recipes/debian.yml
+
+variables:
+  RELEASE: 'bookworm'
+  SALSA_CI_DISABLE_LINTIAN: 1
+  SALSA_CI_DISABLE_REPROTEST: 1
+  SALSA_CI_DISABLE_BLHC: 1

Attachment: signature.asc
Description: PGP signature


Reply to: