]> git.eshelyaron.com Git - emacs.git/commitdiff
Zero stale pointer when unloading comp units (bug#46256)
authorPip Cet <pipcet@gmail.com>
Sun, 7 Mar 2021 21:26:29 +0000 (21:26 +0000)
committerAndrea Corallo <akrl@sdf.org>
Tue, 9 Mar 2021 08:25:27 +0000 (09:25 +0100)
* src/alloc.c (cleanup_vector): Call unload_comp_unit.
* src/comp.c (unload_comp_unit): New function.

src/alloc.c
src/comp.c
src/comp.h

index af083361770709fd9bc11eab1f3f9a279727a402..fee8cc08aa4831b923cd1a664b57053a6991fc3a 100644 (file)
@@ -3157,8 +3157,7 @@ cleanup_vector (struct Lisp_Vector *vector)
     {
       struct Lisp_Native_Comp_Unit *cu =
        PSEUDOVEC_STRUCT (vector, Lisp_Native_Comp_Unit);
-      eassert (cu->handle);
-      dynlib_close (cu->handle);
+      unload_comp_unit (cu);
     }
   else if (NATIVE_COMP_FLAG
           && PSEUDOVECTOR_TYPEP (&vector->header, PVEC_SUBR))
index e6f672de254ce6a131ee873d22148c5a0a53d9d7..e180978541048fcfe5d80345adbc873005b58fc2 100644 (file)
@@ -4949,6 +4949,20 @@ load_comp_unit (struct Lisp_Native_Comp_Unit *comp_u, bool loading_dump,
   return res;
 }
 
+void
+unload_comp_unit (struct Lisp_Native_Comp_Unit *cu)
+{
+  if (cu->handle == NULL)
+    return;
+
+  Lisp_Object *saved_cu = dynlib_sym (cu->handle, COMP_UNIT_SYM);
+  Lisp_Object this_cu;
+  XSETNATIVE_COMP_UNIT (this_cu, cu);
+  if (EQ (this_cu, *saved_cu))
+    *saved_cu = Qnil;
+  dynlib_close (cu->handle);
+}
+
 Lisp_Object
 native_function_doc (Lisp_Object function)
 {
index f7d17f398c75df0b9836506729b8187ff7304a8b..d01bc17565d7d02e1795f3daf57930cc92391a82 100644 (file)
@@ -78,6 +78,8 @@ extern void hash_native_abi (void);
 extern Lisp_Object load_comp_unit (struct Lisp_Native_Comp_Unit *comp_u,
                                   bool loading_dump, bool late_load);
 
+extern void unload_comp_unit (struct Lisp_Native_Comp_Unit *);
+
 extern Lisp_Object native_function_doc (Lisp_Object function);
 
 extern void syms_of_comp (void);