summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrea Corallo <akrl@sdf.org>2019-11-10 09:32:56 +0100
committerAndrea Corallo <akrl@sdf.org>2020-01-01 11:38:02 +0100
commit105e7180230dc22db91af2c8cbfa6fc3d2fee7e6 (patch)
treea2a3b9d3cbedfa63a5722060ef9daaeb68b05f6e /src
parent3ed524c908d4aefd174ae6a8adc2bdaabb4bc4da (diff)
downloademacs-105e7180230dc22db91af2c8cbfa6fc3d2fee7e6.tar.gz
emacs-105e7180230dc22db91af2c8cbfa6fc3d2fee7e6.tar.bz2
emacs-105e7180230dc22db91af2c8cbfa6fc3d2fee7e6.zip
sanity check during eln load
Diffstat (limited to 'src')
-rw-r--r--src/comp.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/src/comp.c b/src/comp.c
index 80a59faa859..07c35413dde 100644
--- a/src/comp.c
+++ b/src/comp.c
@@ -3175,15 +3175,22 @@ load_comp_unit (dynlib_handle_ptr handle)
{
struct thread_state ***current_thread_reloc =
dynlib_sym (handle, CURRENT_THREAD_RELOC_SYM);
- *current_thread_reloc = &current_thread;
+ EMACS_INT ***pure_reloc = dynlib_sym (handle, PURE_RELOC_SYM);
+ Lisp_Object *data_relocs = dynlib_sym (handle, DATA_RELOC_SYM);
+ Lisp_Object (**f_relocs)(void) = dynlib_sym (handle, IMPORTED_FUNC_RELOC_SYM);
+ void (*top_level_run)(void) = dynlib_sym (handle, "top_level_run");
+
+ if (!(current_thread_reloc
+ && pure_reloc
+ && data_relocs
+ && f_relocs
+ && top_level_run))
+ return -1;
- EMACS_INT ***pure_reloc =
- dynlib_sym (handle, PURE_RELOC_SYM);
+ *current_thread_reloc = &current_thread;
*pure_reloc = (EMACS_INT **)&pure;
/* Imported data. */
- Lisp_Object *data_relocs = dynlib_sym (handle, DATA_RELOC_SYM);
-
Lisp_Object d_vec = load_static_obj (handle, TEXT_DATA_RELOC_SYM);
EMACS_UINT d_vec_len = XFIXNUM (Flength (d_vec));
@@ -3194,8 +3201,6 @@ load_comp_unit (dynlib_handle_ptr handle)
}
/* Imported functions. */
- Lisp_Object (**f_relocs)(void) =
- dynlib_sym (handle, IMPORTED_FUNC_RELOC_SYM);
Lisp_Object f_vec =
load_static_obj (handle, TEXT_IMPORTED_FUNC_RELOC_SYM);
EMACS_UINT f_vec_len = XFIXNUM (Flength (f_vec));
@@ -3251,7 +3256,6 @@ load_comp_unit (dynlib_handle_ptr handle)
}
/* Executing this will perform all the expected environment modification. */
- void (*top_level_run)(void) = dynlib_sym (handle, "top_level_run");
top_level_run ();
return 0;