Bug#861291: Fwd: RFS: luajit/2.1.0~beta2+dfsg-3.1 -- [NMU,RC/experimental]
Hi,
(rolling another luajit maintainer in)
Thank you for reviewing this RFS. I made some further change to this package
according to you feedback:
* change vcs-* to secure one
* drop Pre-Depends stuff.
dget:
https://mentors.debian.net/debian/pool/main/l/luajit/luajit_2.1.0~beta2+dfsg-3.1.dsc
dom-amd64:
http://debomatic-amd64.debian.net/distribution#experimental/luajit/2.1.0~beta2+dfsg-3.1/buildlog
dom-arm64 (still building):
http://debomatic-arm64.debian.net/distribution#experimental/luajit/2.1.0~beta2+dfsg-3.1/buildlog
all changes from -3 to -3.1 in the patch attached.
On 27 April 2017 at 13:35, Gianfranco Costamagna
<locutusofborg@debian.org> wrote:
> control: owner -1 !
> control: tags -1 moreinfo
>
> ^^ this is to let Enrico review it, and I'll NMU in case he is ok
>
>>https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=861291
>
>
> the packaging seems fine, the patch differs from the upstream one for some bits
> https://github.com/LuaJIT/LuaJIT/commit/0c6fdc1039a3a4450d366fba7af4b29de73f0dc6.patch
> but I guess this is ok, since the upstream patch doesn't apply.
>
> Anyway, I would like to see VCS fields in secure mode
> Vcs-Git: https://anonscm.debian.org/git/pkg-lua/luajit.git
> Vcs-Browser: https://anonscm.debian.org/cgit/pkg-lua/luajit.git
>
>
> and maybe drop the
>
> Pre-Depends: ${misc:Pre-Depends}
> keywords (something already fixed before jessie and the multiarch handling).
>
> Reducing changes to a single patch should be more suitable even for a 0 day NMU,
> while changing std-version and that above stuff will probably mean:
> 1) 15 days delay for the upload
> 2) a maintainer ack.
>
> Your call :)
>
> cheers and thanks for the RFS!
>
> G.
--
Best,
Lumin
diff --git a/debian/changelog b/debian/changelog
index 9c053c9..279770c 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,19 @@
+luajit (2.1.0~beta2+dfsg-3.1) experimental; urgency=medium
+
+ * Non-maintainer upload.
+ * Add patch Rewrite-memory-block-allocator.patch to fix arm64 segfault.
+ (Thanks to dann frazier <dannf@dannf.org> for verifying the patch)
+ (Closes: #818616)
+ * Bump debhelper compat to 10.
+ * Bump Standards Version to 3.9.8 .
+ * Fix misspelled-closes-bug #789321 in previous changelog.
+ * Fix not-binnmuable-any-depends-any: source:Version -> binary:Version .
+ * Build-Depends on debhelper (>= 10~).
+ * Update Vcs-* links.
+ * Remove Pre-Depends: ${misc:Pre-Depends} from control file.
+
+ -- Zhou Mo <cdluminate@gmail.com> Thu, 27 Apr 2017 02:51:26 +0000
+
luajit (2.1.0~beta2+dfsg-3) experimental; urgency=medium
* Add ppc64el to Architecture: field in the packages, so ppc64el
@@ -60,7 +76,7 @@ luajit (2.1.0~beta1+dfsg-1) experimental; urgency=medium
luajit (2.0.4+dfsg-1) unstable; urgency=medium
- * New upstream release (Close: #789321)
+ * New upstream release (Closes: #789321)
* Build on Hurd (Close: #712975)
-- Enrico Tassi <gareuselesinge@debian.org> Fri, 14 Aug 2015 16:40:52 +0200
diff --git a/debian/compat b/debian/compat
index ec63514..f599e28 100644
--- a/debian/compat
+++ b/debian/compat
@@ -1 +1 @@
-9
+10
diff --git a/debian/control b/debian/control
index 75b9298..22e6b8f 100644
--- a/debian/control
+++ b/debian/control
@@ -3,18 +3,17 @@ Section: interpreters
Priority: optional
Maintainer: Enrico Tassi <gareuselesinge@debian.org>
Uploaders: Ondřej Surý <ondrej@debian.org>
-Build-Depends: debhelper (>= 9~)
-Standards-Version: 3.9.7
-Vcs-Git: git://anonscm.debian.org/pkg-lua/luajit.git
-Vcs-Browser: https://anonscm.debian.org/gitweb/?p=pkg-lua/luajit.git
+Build-Depends: debhelper (>= 10~)
+Standards-Version: 3.9.8
+Vcs-Git: https://anonscm.debian.org/git/pkg-lua/luajit.git
+Vcs-Browser: https://anonscm.debian.org/cgit/pkg-lua/luajit.git
Homepage: http://luajit.org
Package: luajit
Architecture: any
Multi-Arch: foreign
-Pre-Depends: ${misc:Pre-Depends}
Depends: libluajit-5.1-2 (= ${binary:Version}),
- libluajit-5.1-common (= ${source:Version}),
+ libluajit-5.1-common (= ${binary:Version}),
${misc:Depends},
${shlibs:Depends}
Description: Just in time compiler for Lua programming language version 5.1
@@ -37,8 +36,7 @@ Description: Just in time compiler for Lua - common files
Package: libluajit-5.1-2
Architecture: any-i386 any-amd64 arm64 armel armhf mips mipsel powerpc ppc64el
Multi-Arch: same
-Pre-Depends: ${misc:Pre-Depends}
-Depends: libluajit-5.1-common (= ${source:Version}),
+Depends: libluajit-5.1-common (= ${binary:Version}),
${misc:Depends},
${shlibs:Depends}
Description: Just in time compiler for Lua - library version
@@ -52,7 +50,6 @@ Description: Just in time compiler for Lua - library version
Package: libluajit-5.1-dev
Section: libdevel
Multi-Arch: same
-Pre-Depends: ${misc:Pre-Depends}
Architecture: any-i386 any-amd64 arm64 armel armhf mips mipsel powerpc ppc64el
Depends: libluajit-5.1-2 (= ${binary:Version}),
${misc:Depends},
diff --git a/debian/patches/0005-rewrite-memory-block-allocator.patch b/debian/patches/0005-rewrite-memory-block-allocator.patch
new file mode 100644
index 0000000..a3caa2b
--- /dev/null
+++ b/debian/patches/0005-rewrite-memory-block-allocator.patch
@@ -0,0 +1,388 @@
+From: Mike Pall <mike>
+Date: Mon, 18 Apr 2016 10:57:49 +0200
+Subject: [PATCH] Rewrite memory block allocator.
+
+Use a mix of linear probing and pseudo-random probing.
+Workaround for 1GB MAP_32BIT limit on Linux/x64. Now 2GB with !LJ_GC64.
+Enforce 128TB LJ_GC64 limit for > 47 bit memory layouts (ARM64).
+
+Origin: backported, https://github.com/LuaJIT/LuaJIT/commit/0c6fdc1039a3a4450d366fba7af4b29de73f0dc6
+Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=818616
+Last-Updated: 2016-06-06
+
+Index: luajit-2.1.0~beta2+dfsg/src/lj_alloc.c
+===================================================================
+--- luajit-2.1.0~beta2+dfsg.orig/src/lj_alloc.c
++++ luajit-2.1.0~beta2+dfsg/src/lj_alloc.c
+@@ -72,13 +72,56 @@
+
+ #define IS_DIRECT_BIT (SIZE_T_ONE)
+
++
++/* Determine system-specific block allocation method. */
+ #if LJ_TARGET_WINDOWS
+
+ #define WIN32_LEAN_AND_MEAN
+ #include <windows.h>
+
++#define LJ_ALLOC_VIRTUALALLOC 1
++
+ #if LJ_64 && !LJ_GC64
++#define LJ_ALLOC_NTAVM 1
++#endif
++
++#else
++
++#include <errno.h>
++/* If this include fails, then rebuild with: -DLUAJIT_USE_SYSMALLOC */
++#include <sys/mman.h>
++
++#define LJ_ALLOC_MMAP 1
++
++#if LJ_64
++
++#define LJ_ALLOC_MMAP_PROBE 1
++
++#if LJ_GC64
++#define LJ_ALLOC_MBITS 47 /* 128 TB in LJ_GC64 mode. */
++#elif LJ_TARGET_X64 && LJ_HASJIT
++/* Due to limitations in the x64 compiler backend. */
++#define LJ_ALLOC_MBITS 31 /* 2 GB on x64 with !LJ_GC64. */
++#else
++#define LJ_ALLOC_MBITS 32 /* 4 GB on other archs with !LJ_GC64. */
++#endif
++
++#endif
++
++#if LJ_64 && !LJ_GC64 && defined(MAP_32BIT)
++#define LJ_ALLOC_MMAP32 1
++#endif
++
++#if LJ_TARGET_LINUX
++#define LJ_ALLOC_MREMAP 1
++#endif
++
++#endif
+
++
++#if LJ_ALLOC_VIRTUALALLOC
++
++#if LJ_ALLOC_NTAVM
+ /* Undocumented, but hey, that's what we all love so much about Windows. */
+ typedef long (*PNTAVM)(HANDLE handle, void **addr, ULONG zbits,
+ size_t *size, ULONG alloctype, ULONG prot);
+@@ -89,14 +132,15 @@ static PNTAVM ntavm;
+ */
+ #define NTAVM_ZEROBITS 1
+
+-static void INIT_MMAP(void)
++static void init_mmap(void)
+ {
+ ntavm = (PNTAVM)GetProcAddress(GetModuleHandleA("ntdll.dll"),
+ "NtAllocateVirtualMemory");
+ }
++#define INIT_MMAP() init_mmap()
+
+ /* Win64 32 bit MMAP via NtAllocateVirtualMemory. */
+-static LJ_AINLINE void *CALL_MMAP(size_t size)
++static void *CALL_MMAP(size_t size)
+ {
+ DWORD olderr = GetLastError();
+ void *ptr = NULL;
+@@ -107,7 +151,7 @@ static LJ_AINLINE void *CALL_MMAP(size_t
+ }
+
+ /* For direct MMAP, use MEM_TOP_DOWN to minimize interference */
+-static LJ_AINLINE void *DIRECT_MMAP(size_t size)
++static void *DIRECT_MMAP(size_t size)
+ {
+ DWORD olderr = GetLastError();
+ void *ptr = NULL;
+@@ -119,10 +163,8 @@ static LJ_AINLINE void *DIRECT_MMAP(size
+
+ #else
+
+-#define INIT_MMAP() ((void)0)
+-
+ /* Win32 MMAP via VirtualAlloc */
+-static LJ_AINLINE void *CALL_MMAP(size_t size)
++static void *CALL_MMAP(size_t size)
+ {
+ DWORD olderr = GetLastError();
+ void *ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
+@@ -131,7 +173,7 @@ static LJ_AINLINE void *CALL_MMAP(size_t
+ }
+
+ /* For direct MMAP, use MEM_TOP_DOWN to minimize interference */
+-static LJ_AINLINE void *DIRECT_MMAP(size_t size)
++static void *DIRECT_MMAP(size_t size)
+ {
+ DWORD olderr = GetLastError();
+ void *ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN,
+@@ -143,7 +185,7 @@ static LJ_AINLINE void *DIRECT_MMAP(size
+ #endif
+
+ /* This function supports releasing coalesed segments */
+-static LJ_AINLINE int CALL_MUNMAP(void *ptr, size_t size)
++static int CALL_MUNMAP(void *ptr, size_t size)
+ {
+ DWORD olderr = GetLastError();
+ MEMORY_BASIC_INFORMATION minfo;
+@@ -163,10 +205,7 @@ static LJ_AINLINE int CALL_MUNMAP(void *
+ return 0;
+ }
+
+-#else
+-
+-#include <errno.h>
+-#include <sys/mman.h>
++#elif LJ_ALLOC_MMAP
+
+ #define MMAP_PROT (PROT_READ|PROT_WRITE)
+ #if !defined(MAP_ANONYMOUS) && defined(MAP_ANON)
+@@ -174,107 +213,145 @@ static LJ_AINLINE int CALL_MUNMAP(void *
+ #endif
+ #define MMAP_FLAGS (MAP_PRIVATE|MAP_ANONYMOUS)
+
+-#if LJ_64 && !LJ_GC64
+-/* 64 bit mode with 32 bit pointers needs special support for allocating
+-** memory in the lower 2GB.
+-*/
+-
+-#if defined(MAP_32BIT)
++#if LJ_ALLOC_MMAP_PROBE
+
+-#if defined(__sun__)
+-#define MMAP_REGION_START ((uintptr_t)0x1000)
+-#else
+-/* Actually this only gives us max. 1GB in current Linux kernels. */
+-#define MMAP_REGION_START ((uintptr_t)0)
+-#endif
++#define LJ_ALLOC_MMAP_PROBE_MAX 30
++#define LJ_ALLOC_MMAP_PROBE_LINEAR 5
+
+-static LJ_AINLINE void *CALL_MMAP(size_t size)
+-{
+- int olderr = errno;
+- void *ptr = mmap((void *)MMAP_REGION_START, size, MMAP_PROT, MAP_32BIT|MMAP_FLAGS, -1, 0);
+- errno = olderr;
+- return ptr;
+-}
+-
+-#elif LJ_TARGET_OSX || LJ_TARGET_PS4 || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) || defined(__sun__) || defined(__CYGWIN__)
++#define LJ_ALLOC_MMAP_PROBE_LOWER ((uintptr_t)0x4000)
+
+-/* OSX and FreeBSD mmap() use a naive first-fit linear search.
+-** That's perfect for us. Except that -pagezero_size must be set for OSX,
+-** otherwise the lower 4GB are blocked. And the 32GB RLIMIT_DATA needs
+-** to be reduced to 250MB on FreeBSD.
++/* No point in a giant ifdef mess. Just try to open /dev/urandom.
++** It doesn't really matter if this fails, since we get some ASLR bits from
++** every unsuitable allocation, too. And we prefer linear allocation, anyway.
+ */
+-#if LJ_TARGET_OSX || defined(__DragonFly__)
+-#define MMAP_REGION_START ((uintptr_t)0x10000)
+-#elif LJ_TARGET_PS4
+-#define MMAP_REGION_START ((uintptr_t)0x4000)
+-#else
+-#define MMAP_REGION_START ((uintptr_t)0x10000000)
+-#endif
+-#define MMAP_REGION_END ((uintptr_t)0x80000000)
++#include <fcntl.h>
++#include <unistd.h>
+
+-#if (defined(__FreeBSD__) || defined(__FreeBSD_kernel__)) && !LJ_TARGET_PS4
+-#include <sys/resource.h>
+-#endif
++static uintptr_t mmap_probe_seed(void)
++{
++ uintptr_t val;
++ int fd = open("/dev/urandom", O_RDONLY);
++ if (fd != -1) {
++ int ok = ((size_t)read(fd, &val, sizeof(val)) == sizeof(val));
++ (void)close(fd);
++ if (ok) return val;
++ }
++ return 1; /* Punt. */
++}
+
+-static LJ_AINLINE void *CALL_MMAP(size_t size)
++static void *mmap_probe(size_t size)
+ {
+- int olderr = errno;
+ /* Hint for next allocation. Doesn't need to be thread-safe. */
+- static uintptr_t alloc_hint = MMAP_REGION_START;
+- int retry = 0;
+-#if (defined(__FreeBSD__) || defined(__FreeBSD_kernel__)) && !LJ_TARGET_PS4
+- static int rlimit_modified = 0;
+- if (LJ_UNLIKELY(rlimit_modified == 0)) {
+- struct rlimit rlim;
+- rlim.rlim_cur = rlim.rlim_max = MMAP_REGION_START;
+- setrlimit(RLIMIT_DATA, &rlim); /* Ignore result. May fail below. */
+- rlimit_modified = 1;
+- }
+-#endif
+- for (;;) {
+- void *p = mmap((void *)alloc_hint, size, MMAP_PROT, MMAP_FLAGS, -1, 0);
+- if ((uintptr_t)p >= MMAP_REGION_START &&
+- (uintptr_t)p + size < MMAP_REGION_END) {
+- alloc_hint = (uintptr_t)p + size;
++ static uintptr_t hint_addr = 0;
++ static uintptr_t hint_prng = 0;
++ int olderr = errno;
++ int retry;
++ for (retry = 0; retry < LJ_ALLOC_MMAP_PROBE_MAX; retry++) {
++ void *p = mmap((void *)hint_addr, size, MMAP_PROT, MMAP_FLAGS, -1, 0);
++ uintptr_t addr = (uintptr_t)p;
++ if ((addr >> LJ_ALLOC_MBITS) == 0 && addr >= LJ_ALLOC_MMAP_PROBE_LOWER) {
++ /* We got a suitable address. Bump the hint address. */
++ hint_addr = addr + size;
+ errno = olderr;
+ return p;
+ }
+- if (p != CMFAIL) munmap(p, size);
+-#if defined(__sun__) || defined(__DragonFly__)
+- alloc_hint += 0x1000000; /* Need near-exhaustive linear scan. */
+- if (alloc_hint + size < MMAP_REGION_END) continue;
+-#endif
+- if (retry) break;
+- retry = 1;
+- alloc_hint = MMAP_REGION_START;
++ if (p != MFAIL) {
++ munmap(p, size);
++ } else if (errno == ENOMEM) {
++ return MFAIL;
++ }
++ if (hint_addr) {
++ /* First, try linear probing. */
++ if (retry < LJ_ALLOC_MMAP_PROBE_LINEAR) {
++ hint_addr += 0x1000000;
++ if (((hint_addr + size) >> LJ_ALLOC_MBITS) != 0)
++ hint_addr = 0;
++ continue;
++ } else if (retry == LJ_ALLOC_MMAP_PROBE_LINEAR) {
++ /* Next, try a no-hint probe to get back an ASLR address. */
++ hint_addr = 0;
++ continue;
++ }
++ }
++ /* Finally, try pseudo-random probing. */
++ if (LJ_UNLIKELY(hint_prng == 0)) {
++ hint_prng = mmap_probe_seed();
++ }
++ /* The unsuitable address we got has some ASLR PRNG bits. */
++ hint_addr ^= addr & ~((uintptr_t)(LJ_PAGESIZE-1));
++ do { /* The PRNG itself is very weak, but see above. */
++ hint_prng = hint_prng * 1103515245 + 12345;
++ hint_addr ^= hint_prng * (uintptr_t)LJ_PAGESIZE;
++ hint_addr &= (((uintptr_t)1 << LJ_ALLOC_MBITS)-1);
++ } while (hint_addr < LJ_ALLOC_MMAP_PROBE_LOWER);
+ }
+ errno = olderr;
+- return CMFAIL;
++ return MFAIL;
+ }
+
++#endif
++
++#if LJ_ALLOC_MMAP32
++
++#if defined(__sun__)
++#define LJ_ALLOC_MMAP32_START ((uintptr_t)0x1000)
+ #else
++#define LJ_ALLOC_MMAP32_START ((uintptr_t)0)
++#endif
+
+-#error "NYI: need an equivalent of MAP_32BIT for this 64 bit OS"
++static void *mmap_map32(size_t size)
++{
++#if LJ_ALLOC_MMAP_PROBE
++ static int fallback = 0;
++ if (fallback)
++ return mmap_probe(size);
++#endif
++ {
++ int olderr = errno;
++ void *ptr = mmap((void *)LJ_ALLOC_MMAP32_START, size, MMAP_PROT, MAP_32BIT|MMAP_FLAGS, -1, 0);
++ errno = olderr;
++ /* This only allows 1GB on Linux. So fallback to probing to get 2GB. */
++#if LJ_ALLOC_MMAP_PROBE
++ if (ptr == MFAIL) {
++ fallback = 1;
++ return mmap_probe(size);
++ }
++#endif
++ return ptr;
++ }
++}
+
+ #endif
+
++#if LJ_ALLOC_MMAP32
++#define CALL_MMAP(size) mmap_map32(size)
++#elif LJ_ALLOC_MMAP_PROBE
++#define CALL_MMAP(size) mmap_probe(size)
+ #else
+-
+-/* 32 bit mode and GC64 mode is easy. */
+-static LJ_AINLINE void *CALL_MMAP(size_t size)
++static void *CALL_MMAP(size_t size)
+ {
+ int olderr = errno;
+ void *ptr = mmap(NULL, size, MMAP_PROT, MMAP_FLAGS, -1, 0);
+ errno = olderr;
+ return ptr;
+ }
+-
+ #endif
+
+-#define INIT_MMAP() ((void)0)
+-#define DIRECT_MMAP(s) CALL_MMAP(s)
++#if (defined(__FreeBSD__) || defined(__FreeBSD_kernel__)) && !LJ_TARGET_PS4
++
++#include <sys/resource.h>
++
++static void init_mmap(void)
++{
++ struct rlimit rlim;
++ rlim.rlim_cur = rlim.rlim_max = 0x10000;
++ setrlimit(RLIMIT_DATA, &rlim); /* Ignore result. May fail later. */
++}
++#define INIT_MMAP() init_mmap()
++
++#endif
+
+-static LJ_AINLINE int CALL_MUNMAP(void *ptr, size_t size)
++static int CALL_MUNMAP(void *ptr, size_t size)
+ {
+ int olderr = errno;
+ int ret = munmap(ptr, size);
+@@ -282,10 +359,9 @@ static LJ_AINLINE int CALL_MUNMAP(void *
+ return ret;
+ }
+
+-#if LJ_TARGET_LINUX
++#if LJ_ALLOC_MREMAP
+ /* Need to define _GNU_SOURCE to get the mremap prototype. */
+-static LJ_AINLINE void *CALL_MREMAP_(void *ptr, size_t osz, size_t nsz,
+- int flags)
++static void *CALL_MREMAP_(void *ptr, size_t osz, size_t nsz, int flags)
+ {
+ int olderr = errno;
+ ptr = mremap(ptr, osz, nsz, flags);
+@@ -305,6 +381,15 @@ static LJ_AINLINE void *CALL_MREMAP_(voi
+
+ #endif
+
++
++#ifndef INIT_MMAP
++#define INIT_MMAP() ((void)0)
++#endif
++
++#ifndef DIRECT_MMAP
++#define DIRECT_MMAP(s) CALL_MMAP(s)
++#endif
++
+ #ifndef CALL_MREMAP
+ #define CALL_MREMAP(addr, osz, nsz, mv) ((void)osz, MFAIL)
+ #endif
diff --git a/debian/patches/series b/debian/patches/series
index 2fbbdc6..cd3c0e9 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -2,3 +2,4 @@
0002-Enable-debugging-symbols-in-the-build.patch
0003-Get-rid-of-LUAJIT_VERSION_SYM-that-changes-ABI-on-ev.patch
0004-Add-ppc64-support-based-on-https-github.com-PPC64-Lu.patch
+0005-rewrite-memory-block-allocator.patch
Reply to: