diff options
author | Andrea Corallo <akrl@sdf.org> | 2019-11-10 09:32:56 +0100 |
---|---|---|
committer | Andrea Corallo <akrl@sdf.org> | 2020-01-01 11:38:02 +0100 |
commit | 105e7180230dc22db91af2c8cbfa6fc3d2fee7e6 (patch) | |
tree | a2a3b9d3cbedfa63a5722060ef9daaeb68b05f6e /src | |
parent | 3ed524c908d4aefd174ae6a8adc2bdaabb4bc4da (diff) | |
download | emacs-105e7180230dc22db91af2c8cbfa6fc3d2fee7e6.tar.gz emacs-105e7180230dc22db91af2c8cbfa6fc3d2fee7e6.tar.bz2 emacs-105e7180230dc22db91af2c8cbfa6fc3d2fee7e6.zip |
sanity check during eln load
Diffstat (limited to 'src')
-rw-r--r-- | src/comp.c | 20 |
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 = ¤t_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 = ¤t_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; |