From f8606ebab87d2b20fa442769265f739958d94ca5 Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Fri, 12 Oct 2018 14:00:34 +0900 Subject: [PATCH] Fix a object file segfault when spaces have no data. ie, don't attempt to copy memory from a null pointer (just copy the null pointer). --- tools/qfcc/source/obj_file.c | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/tools/qfcc/source/obj_file.c b/tools/qfcc/source/obj_file.c index cdd18f991..1ebd97f4b 100644 --- a/tools/qfcc/source/obj_file.c +++ b/tools/qfcc/source/obj_file.c @@ -193,8 +193,11 @@ qfo_init_string_space (qfo_t *qfo, qfo_mspace_t *space, strpool_t *strings) space->type = qfos_string; space->num_defs = 0; space->defs = 0; - space->d.strings = malloc (size); - memcpy (space->d.strings, strings->strings, size); + space->d.strings = 0; + if (strings->strings) { + space->d.strings = malloc (size); + memcpy (space->d.strings, strings->strings, size); + } space->data_size = strings->size; space->id = qfo_strings_space; } @@ -207,8 +210,11 @@ qfo_init_code_space (qfo_t *qfo, qfo_mspace_t *space, codespace_t *code) space->type = qfos_code; space->num_defs = 0; space->defs = 0; - space->d.code = malloc (size); - memcpy (space->d.code, code->code, size); + space->d.code = 0; + if (code->code) { + space->d.code = malloc (size); + memcpy (space->d.code, code->code, size); + } space->data_size = code->size; space->id = qfo_code_space; } @@ -222,8 +228,11 @@ qfo_init_data_space (qfo_t *qfo, qfo_def_t **defs, qfo_reloc_t **relocs, space->type = qfos_data; space->defs = *defs; space->num_defs = qfo_encode_defs (qfo, data->defs, defs, relocs); - space->d.data = malloc (size); - memcpy (space->d.data, data->data, size); + space->d.data = 0; + if (data->data) { + space->d.data = malloc (size); + memcpy (space->d.data, data->data, size); + } space->data_size = data->size; } @@ -249,8 +258,11 @@ qfo_init_type_space (qfo_t *qfo, qfo_def_t **defs, qfo_reloc_t **relocs, space->type = qfos_type; space->defs = *defs; space->num_defs = qfo_encode_defs (qfo, data->defs, defs, relocs); - space->d.data = malloc (size); - memcpy (space->d.data, data->data, size); + space->d.data = 0; + if (data->data) { + space->d.data = malloc (size); + memcpy (space->d.data, data->data, size); + } space->data_size = data->size; space->id = qfo_type_space; }