From 0f08472bc2d32ac3d6990392cb8e0dc7d3e18fe2 Mon Sep 17 00:00:00 2001 From: jjgarcia Date: Wed, 10 Aug 2005 16:51:31 +0000 Subject: [PATCH] When failed to load a binary file, a codeblock structure might be incomplete and cause a SIGSEGV --- src/c/alloc.d | 2 +- src/c/alloc_2.d | 19 ++++++++++++++----- src/c/gbc.d | 4 +++- src/c/load.d | 2 -- src/c/read.d | 5 +++-- 5 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/c/alloc.d b/src/c/alloc.d index 7886e8fc5..95557914b 100644 --- a/src/c/alloc.d +++ b/src/c/alloc.d @@ -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; diff --git a/src/c/alloc_2.d b/src/c/alloc_2.d index b996c7900..e44a7290f 100644 --- a/src/c/alloc_2.d +++ b/src/c/alloc_2.d @@ -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; } diff --git a/src/c/gbc.d b/src/c/gbc.d index 3639aa5ba..2d4f26077 100644 --- a/src/c/gbc.d +++ b/src/c/gbc.d @@ -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 diff --git a/src/c/load.d b/src/c/load.d index 860182548..69a4921c8 100644 --- a/src/c/load.d +++ b/src/c/load.d @@ -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, diff --git a/src/c/read.d b/src/c/read.d index ef7ef5214..24590c112 100644 --- a/src/c/read.d +++ b/src/c/read.d @@ -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 {