From 6fd2e66a091023edaf55d874189ab63ec8568398 Mon Sep 17 00:00:00 2001 From: Ilya Verbin Date: Thu, 8 Oct 2015 19:04:43 +0000 Subject: [PATCH] liboffloadmic: Add missed checks for malloc and strdup return values liboffloadmic/ * runtime/offload_engine.cpp (Engine::init_process): Use strdup instead of sizeof+malloc+sprintf, check for return value. * runtime/offload_env.cpp (MicEnvVar::get_env_var_kind): Check for strdup return value. * runtime/offload_host.cpp (__offload_init_library_once): Check for strdup return value. Fix size calculation of COI_HOST_THREAD_AFFINITY. * runtime/emulator/coi_device.cpp (COIProcessWaitForShutdown): Check for malloc return value. From-SVN: r228622 --- liboffloadmic/ChangeLog | 11 +++++++++++ liboffloadmic/runtime/emulator/coi_device.cpp | 3 ++- liboffloadmic/runtime/offload_engine.cpp | 5 +++-- liboffloadmic/runtime/offload_env.cpp | 6 ++++++ liboffloadmic/runtime/offload_host.cpp | 14 +++++++++++++- 5 files changed, 35 insertions(+), 4 deletions(-) diff --git a/liboffloadmic/ChangeLog b/liboffloadmic/ChangeLog index d974aa30984..d25d4184121 100644 --- a/liboffloadmic/ChangeLog +++ b/liboffloadmic/ChangeLog @@ -1,3 +1,14 @@ +2015-10-08 Ilya Verbin + + * runtime/offload_engine.cpp (Engine::init_process): Use strdup instead + of sizeof+malloc+sprintf, check for return value. + * runtime/offload_env.cpp (MicEnvVar::get_env_var_kind): Check for + strdup return value. + * runtime/offload_host.cpp (__offload_init_library_once): Check for + strdup return value. Fix size calculation of COI_HOST_THREAD_AFFINITY. + * runtime/emulator/coi_device.cpp (COIProcessWaitForShutdown): Check for + malloc return value. + 2015-09-29 Ilya Verbin * plugin/libgomp-plugin-intelmic.cpp (OFFLOAD_ACTIVE_WAIT_ENV): New diff --git a/liboffloadmic/runtime/emulator/coi_device.cpp b/liboffloadmic/runtime/emulator/coi_device.cpp index f9dd2cde888..983fec05b29 100644 --- a/liboffloadmic/runtime/emulator/coi_device.cpp +++ b/liboffloadmic/runtime/emulator/coi_device.cpp @@ -362,7 +362,8 @@ SYMBOL_VERSION (COIProcessWaitForShutdown, 1) () case CMD_PIPELINE_CREATE: { /* Receive data from host. */ - uint32_t *pipeline_num = (uint32_t *) malloc (sizeof (uint32_t)); + uint32_t *pipeline_num; + MALLOC (uint32_t *, pipeline_num, sizeof (uint32_t)); READ (pipe_host2tgt, pipeline_num, sizeof (*pipeline_num)); /* Create a new thread for the pipeline. */ diff --git a/liboffloadmic/runtime/offload_engine.cpp b/liboffloadmic/runtime/offload_engine.cpp index 00b673aebcb..4a88546877d 100644 --- a/liboffloadmic/runtime/offload_engine.cpp +++ b/liboffloadmic/runtime/offload_engine.cpp @@ -173,8 +173,9 @@ void Engine::init_process(void) // use putenv instead of setenv as Windows has no setenv. // Note: putenv requires its argument can't be freed or modified. // So no free after call to putenv or elsewhere. - char * env_var = (char*) malloc(sizeof("COI_DMA_CHANNEL_COUNT=2")); - sprintf(env_var, "COI_DMA_CHANNEL_COUNT=2"); + char * env_var = strdup("COI_DMA_CHANNEL_COUNT=2"); + if (env_var == NULL) + LIBOFFLOAD_ERROR(c_malloc); putenv(env_var); } } diff --git a/liboffloadmic/runtime/offload_env.cpp b/liboffloadmic/runtime/offload_env.cpp index 79f5f366754..ac33b678942 100644 --- a/liboffloadmic/runtime/offload_env.cpp +++ b/liboffloadmic/runtime/offload_env.cpp @@ -212,10 +212,14 @@ MicEnvVarKind MicEnvVar::get_env_var_kind( *env_var_name_length = 3; *env_var_name = *env_var_def = c; *env_var_def = strdup(*env_var_def); + if (*env_var_def == NULL) + LIBOFFLOAD_ERROR(c_malloc); return c_mic_var; } *env_var_def = c + strlen("ENV="); *env_var_def = strdup(*env_var_def); + if (*env_var_def == NULL) + LIBOFFLOAD_ERROR(c_malloc); return c_mic_card_env; } if (isalpha(*c)) { @@ -229,6 +233,8 @@ MicEnvVarKind MicEnvVar::get_env_var_kind( return c_no_mic; } *env_var_def = strdup(*env_var_def); + if (*env_var_def == NULL) + LIBOFFLOAD_ERROR(c_malloc); return card_is_set? c_mic_card_var : c_mic_var; } diff --git a/liboffloadmic/runtime/offload_host.cpp b/liboffloadmic/runtime/offload_host.cpp index 08f626f457e..eec457d386a 100644 --- a/liboffloadmic/runtime/offload_host.cpp +++ b/liboffloadmic/runtime/offload_host.cpp @@ -5173,6 +5173,8 @@ static void __offload_init_library_once(void) if (strcasecmp(env_var, "none") != 0) { // value is composed of comma separated physical device indexes char *buf = strdup(env_var); + if (buf == NULL) + LIBOFFLOAD_ERROR(c_malloc); char *str, *ptr; for (str = strtok_r(buf, ",", &ptr); str != 0; str = strtok_r(0, ",", &ptr)) { @@ -5245,7 +5247,9 @@ static void __offload_init_library_once(void) if (env_var != 0) { char * new_env_var = (char*) malloc(sizeof("COI_HOST_THREAD_AFFINITY=") + - sizeof(env_var) + 1); + strlen(env_var)); + if (new_env_var == NULL) + LIBOFFLOAD_ERROR(c_malloc); sprintf(new_env_var, "COI_HOST_THREAD_AFFINITY=%s", env_var); putenv(new_env_var); } @@ -5254,6 +5258,8 @@ static void __offload_init_library_once(void) env_var = getenv("MIC_LD_LIBRARY_PATH"); if (env_var != 0) { mic_library_path = strdup(env_var); + if (mic_library_path == NULL) + LIBOFFLOAD_ERROR(c_malloc); } @@ -5262,6 +5268,8 @@ static void __offload_init_library_once(void) const char *base_name = "offload_main"; if (mic_library_path != 0) { char *buf = strdup(mic_library_path); + if (buf == NULL) + LIBOFFLOAD_ERROR(c_malloc); char *try_name = (char*) alloca(strlen(mic_library_path) + strlen(base_name) + 2); char *dir, *ptr; @@ -5275,6 +5283,8 @@ static void __offload_init_library_once(void) struct stat st; if (stat(try_name, &st) == 0 && S_ISREG(st.st_mode)) { mic_device_main = strdup(try_name); + if (mic_device_main == NULL) + LIBOFFLOAD_ERROR(c_malloc); break; } } @@ -5345,6 +5355,8 @@ static void __offload_init_library_once(void) env_var = getenv("MIC_PROXY_FS_ROOT"); if (env_var != 0 && *env_var != '\0') { mic_proxy_fs_root = strdup(env_var); + if (mic_proxy_fs_root == NULL) + LIBOFFLOAD_ERROR(c_malloc); } // Prepare environment for the target process using the following -- 2.30.2