When failed to load a binary file, a codeblock structure might be incomplete and cause a SIGSEGV

This commit is contained in:
jjgarcia 2005-08-10 16:51:31 +00:00
parent 3d1e56e0ec
commit 0f08472bc2
5 changed files with 21 additions and 11 deletions

View file

@ -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;

View file

@ -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;
}

View file

@ -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

View file

@ -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,

View file

@ -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 {