mirror of
https://gitlab.com/embeddable-common-lisp/ecl.git
synced 2026-01-11 03:33:11 -08:00
When failed to load a binary file, a codeblock structure might be incomplete and cause a SIGSEGV
This commit is contained in:
parent
3d1e56e0ec
commit
0f08472bc2
5 changed files with 21 additions and 11 deletions
|
|
@ -380,7 +380,7 @@ ONCE_MORE:
|
|||
obj->cblock.data_size = 0;
|
||||
obj->cblock.data_text = NULL;
|
||||
obj->cblock.data_text_size = 0;
|
||||
obj->cblock.links = OBJNULL;
|
||||
obj->cblock.links = Cnil;
|
||||
break;
|
||||
case t_foreign:
|
||||
obj->foreign.tag = Cnil;
|
||||
|
|
|
|||
|
|
@ -51,7 +51,9 @@ finalize(GC_PTR _o, GC_PTR _data)
|
|||
switch (type_of(o)) {
|
||||
#ifdef ENABLE_DLOPEN
|
||||
case t_codeblock:
|
||||
cl_mapc(2, @'si::unlink-symbol', o->cblock.links);
|
||||
if (o->cblock.links) {
|
||||
cl_mapc(2, @'si::unlink-symbol', o->cblock.links);
|
||||
}
|
||||
#ifdef ECL_DYNAMIC_VV
|
||||
/* GC_free(o->cblock.data); */
|
||||
#endif
|
||||
|
|
@ -107,18 +109,25 @@ cl_alloc_object(cl_type t)
|
|||
obj = (cl_object)GC_MALLOC(tm->tm_size);
|
||||
obj->d.t = t;
|
||||
/* GC_MALLOC already resets objects */
|
||||
if (t == t_stream
|
||||
switch (t) {
|
||||
#ifdef ENABLE_DLOPEN
|
||||
|| t == t_codeblock
|
||||
case t_codeblock:
|
||||
obj->cblock.links = Cnil;
|
||||
obj->cblock.name = Cnil;
|
||||
obj->cblock.next = Cnil;
|
||||
obj->cblock.data_text = obj->cblock.data = NULL;
|
||||
obj->cblock.data_text_size = obj->cblock.data_size = 0;
|
||||
obj->cblock.handle = NULL;
|
||||
#endif
|
||||
#ifdef ENABLE_THREADS
|
||||
|| t == t_lock
|
||||
case t_lock:
|
||||
#endif
|
||||
) {
|
||||
case t_stream: {
|
||||
GC_finalization_proc ofn;
|
||||
void *odata;
|
||||
GC_register_finalizer_no_order(obj, finalize, NULL, &ofn, &odata);
|
||||
}
|
||||
}
|
||||
return obj;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -562,7 +562,9 @@ sweep_phase(void)
|
|||
switch (x->d.t) {
|
||||
#ifdef ENABLE_DLOPEN
|
||||
case t_codeblock:
|
||||
cl_mapc(2, @'si::unlink-symbol', x->cblock.links);
|
||||
if (x->cblock.links) {
|
||||
cl_mapc(2, @'si::unlink-symbol', x->cblock.links);
|
||||
}
|
||||
ecl_library_close(x);
|
||||
break;
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -45,8 +45,6 @@ ecl_library_open(cl_object filename) {
|
|||
cl_object block;
|
||||
cl_object libraries = cl_core.libraries;
|
||||
block = cl_alloc_object(t_codeblock);
|
||||
block->cblock.data = NULL;
|
||||
block->cblock.data_size = 0;
|
||||
block->cblock.name = filename;
|
||||
#ifdef HAVE_DLFCN_H
|
||||
block->cblock.handle = dlopen(filename->string.self,
|
||||
|
|
|
|||
|
|
@ -1966,9 +1966,10 @@ read_VV(cl_object block, void (*entry_point)(cl_object))
|
|||
cl_object in;
|
||||
cl_object *VV;
|
||||
|
||||
if (block == NULL)
|
||||
if (block == NULL) {
|
||||
block = cl_alloc_object(t_codeblock);
|
||||
block->cblock.links = Cnil;
|
||||
}
|
||||
block->cblock.entry = entry_point;
|
||||
|
||||
in = OBJNULL;
|
||||
CL_UNWIND_PROTECT_BEGIN {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue