From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Camm Maguire <camm@debian.org>
Date: Jun, 24 2026 17:33:56 +0000
Subject: [PATCH] <short summary of the patch>

TODO: Put a short summary on the line above and replace this paragraph
with a longer explanation of this change. Complete the meta-information
with other relevant fields (see below for details). To make it easier, the
information below has been extracted from the changelog. Adjust it or drop
it.

---
The information above should follow the Patch Tagging Guidelines, please
checkout https://dep.debian.net/deps/dep3/ to learn about the format. Here
are templates for supplementary fields that you might want to add:

Origin: (upstream|backport|vendor|other), (<patch-url>|commit:<commit-id>)
Bug: <upstream-bugtracker-url>
Bug-<Vendor>: <vendor-bugtracker-url>
Forwarded: (no|not-needed|<patch-forwarded-url>)
Applied-Upstream: <version>, (<commit-url>|commit:<commid-id>)
Reviewed-By: <name and email of someone who approved/reviewed the patch>

--- gcl27-2.7.1.orig/git.tag
+++ gcl27-2.7.1/git.tag
@@ -1 +1 @@
-"Version_2_7_2pre31"
+"Version_2_7_2pre32"
--- gcl27-2.7.1.orig/h/pool.h
+++ gcl27-2.7.1/h/pool.h
@@ -120,9 +120,9 @@ close_pool(void) {
     if (!fcntl(pool,F_SETLK,&f))
       massert(!unlink(gcl_pool) || errno==ENOENT);
     register_pool(-1);
-    massert(!munmap(Pool,sizeof(struct pool)));
     massert(!close(pool));
     pool=-1;
+    massert(!munmap(Pool,sizeof(struct pool)));
     memset(gcl_pool,0,sizeof(gcl_pool));
     no_recur=0;
   }
--- gcl27-2.7.1.orig/lsp/gcl_top.lsp
+++ gcl27-2.7.1/lsp/gcl_top.lsp
@@ -113,14 +113,14 @@
 	 (coerce-to-package (eval (read))))))
 ;(declaim (inline coerce-to-package))
 
-(defun reset-lib-syms nil
+(defun reset-lib-syms (on)
   (when (find-package "LIB")
     (do-external-symbols 
      (p "LIB")
-     (setf (symbol-value p) (dlopen (lib-name p)))
+     (setf (symbol-value p) (when on (dlopen (lib-name p))))
      (do-external-symbols 
       (s p)
-      (setf (symbol-value s) (dlsym (symbol-value p) s)))))
+      (setf (symbol-value s) (when on (dlsym (symbol-value p) s))))))
   (cfdl))
 
 (defun top-level1 ()
@@ -698,7 +698,7 @@ First directory is checked for first nam
 
 (defun set-up-top-level (&aux (i (argc)) tem)
   (declare (fixnum i))
-  (reset-lib-syms)
+  (reset-lib-syms t)
   (setq *tmp-dir* (get-temp-dir) *current-directory* (current-directory-namestring))
   (when *cc* ;raw-image init complete
     (setq *current-directory* (pathname *current-directory*)
--- gcl27-2.7.1.orig/o/alloc.c
+++ gcl27-2.7.1/o/alloc.c
@@ -1696,18 +1696,28 @@ static char *baby_malloc(n)
 /*  #endif */
 
 bool writable_malloc=0;
+static void *malloc_pre_main_base,*malloc_pre_main_ptr,*malloc_pre_main_end;
 
 static void *
 malloc_internal(size_t size) {
 
   if (!msbrk_initialized()) {
     static bool recursive_malloc;
-    if (recursive_malloc)
-      error("Bad malloc");
+    unsigned long s=PAGESIZE;
+
+    massert(!recursive_malloc);
     recursive_malloc=1;
-    gcl_init_alloc(&size);
+    if (!malloc_pre_main_base) {
+      massert((malloc_pre_main_base=mmap(NULL,s,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0))!=(void *)-1);
+      malloc_pre_main_ptr=malloc_pre_main_base;
+      malloc_pre_main_end=malloc_pre_main_base+s;
+    }
+    massert(size<=(malloc_pre_main_end-malloc_pre_main_ptr));
+    malloc_pre_main_ptr+=size;
     recursive_malloc=0;
-  }
+    return malloc_pre_main_ptr-size;
+  } else
+    malloc_pre_main_base=malloc_pre_main_ptr=malloc_pre_main_end=NULL;
 
   CHECK_INTERRUPT;
   
@@ -1732,7 +1742,7 @@ free(void *ptr) {
 
   object *p,pp;
   
-  if (ptr == 0)
+  if (ptr == 0 || ptr < data_start || ptr >= core_end)
     return;
   
   for (p = &malloc_list,pp=*p; pp && !endp(pp);  p = &((pp)->c.c_cdr),pp=pp->c.c_cdr)
--- gcl27-2.7.1.orig/o/cfun.c
+++ gcl27-2.7.1/o/cfun.c
@@ -49,6 +49,8 @@ make_cfun(void (*self)(), object name, o
 
 }
 
+DEF_ORDINARY("RESET-LIB-SYMS",sSreset_lib_syms,SI,"");
+
 DEFUN("CFDL",object,fScfdl,SI,0,0,NONE,OO,OO,OO,OO,(void),"") {
 
   struct typemanager *tm=tm_of(t_cfdata);
--- gcl27-2.7.1.orig/o/disable_aslr.c
+++ gcl27-2.7.1/o/disable_aslr.c
@@ -91,7 +91,7 @@ void
 disable_aslr(int argc, char **argv, char **envp) {
 
   long pers;
-  long flag = ADDR_NO_RANDOMIZE|(sizeof(flag)==4 ? ADDR_LIMIT_3GB : 0);
+  long flag = ADDR_NO_RANDOMIZE|(sizeof(flag)==4 ? ADDR_COMPAT_LAYOUT : 0);
 
   massert((pers=personality(-1))!=-1);
 
--- gcl27-2.7.1.orig/o/gbc.c
+++ gcl27-2.7.1/o/gbc.c
@@ -1079,8 +1079,11 @@ GBC(enum type t) {
       if (tm->tm_type==v->type)
 	for (x=pagetochar(page(v)),j=tm->tm_nppage;j--;x+=tm->tm_size) {
 	  object o=x;
-	  if (type_of(o)==t_stream && !is_free(o) && o->sm.sm_fp && o->sm.sm_fp!=stdin && o->sm.sm_fp!=stdout && o->sm.sm_fp!=stderr)
-	    close_stream(o);
+	  if (type_of(o)==t_stream && !is_free(o) && o->sm.sm_fp) {
+	    if (o->sm.sm_fp!=stdin && o->sm.sm_fp!=stdout && o->sm.sm_fp!=stderr)
+	      close_stream(o);
+	    o->sm.sm_fp=NULL;
+	  }
 	}
 
     gc_time = -1;
--- gcl27-2.7.1.orig/o/read.d
+++ gcl27-2.7.1/o/read.d
@@ -1637,6 +1637,9 @@ Lsharp_dollar_reader()
 	tx=type_of(x);
 	vs_base[0] = alloc_object(t_random);
 	init_gmp_rnd_state(&vs_base[0]->rnd.rnd_state);
+#if __GNU_MP_VERSION > 4 || (__GNU_MP_VERSION == 4 && __GNU_MP_VERSION_MINOR >= 2)
+	vs_base[0]->rnd.rnd_state._mp_algdata._mp_lc=&Mersenne_Twister_Generator_Noseed;
+#endif
 	if (tx!=t_fixnum || fix(x)) {
 	  if (tx==t_fixnum) {
 	    if (vs_base[0]->rnd.rnd_state._mp_seed->_mp_size!=1)
--- gcl27-2.7.1.orig/o/save.c
+++ gcl27-2.7.1/o/save.c
@@ -20,12 +20,14 @@ LFD(siLsave)(void) {
   extern char *kcl_self;
   extern void *shared_lib_start;
   extern jmp_buf gmp_jmp;
+  extern object sSreset_lib_syms;
 
   check_arg(1);
 
   memset(FN1,0,sizeof(FN1));
   coerce_to_filename(vs_base[0], FN1);
 
+  ifuncall1(sSreset_lib_syms,Cnil);
   close_dlopen_list();
   frs_top=frs_org-1;
   gcl_cleanup(1);
