From: Kwanghoon Son Date: Wed, 5 Feb 2025 00:33:04 +0000 (+0900) Subject: Fix leaks when calloc fail X-Git-Tag: accepted/tizen/unified/20250212.101014^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fheads%2Faccepted%2Ftizen_unified_x;p=platform%2Fcore%2Fmultimedia%2Fvision-source-v4l2.git Fix leaks when calloc fail [Version] 1.2.0 Error message - leaked_storage: Freeing v4l2_handle without freeing its pointer field dev_info leaks the storage that dev_info points to Change-Id: I87b71f4636619c6da379e351f6d06c3a16e47b84 Signed-off-by: Kwanghoon Son --- diff --git a/packaging/vision-source-v4l2.spec b/packaging/vision-source-v4l2.spec index e165de3..c05914b 100644 --- a/packaging/vision-source-v4l2.spec +++ b/packaging/vision-source-v4l2.spec @@ -3,7 +3,7 @@ Name: vision-source-v4l2 Summary: vision source-v4l2 -Version: 1.1.0 +Version: 1.2.0 Release: 0 Group: Multimedia/Framework License: Apache-2.0 diff --git a/src/vision_source_v4l2.cpp b/src/vision_source_v4l2.cpp index d4c8151..30229f1 100644 --- a/src/vision_source_v4l2.cpp +++ b/src/vision_source_v4l2.cpp @@ -366,6 +366,45 @@ static int __dev_info_from_path(const char *path, vector &fmt_list) return ret; } +static int __vision_source_v4l2_alloc_fmt(vision_source_v4l2_s *vs_handle, size_t dev_count, + std::vector &dev_name, + std::vector > &dev_fmt_list) +{ + vs_handle->fmt = (media_format_h **) calloc(dev_count, sizeof(media_format_h *)); + if (!vs_handle->fmt) + return VISION_SOURCE_ERROR_OUT_OF_MEMORY; + + for (size_t i = 0; i < dev_count; i++) { + vs_handle->dev_info[i].index = i; + vs_handle->fmt[i] = (media_format_h *) calloc(dev_fmt_list[i].size(), sizeof(media_format_h)); + if (!vs_handle->fmt[i]) { + for (size_t j = 0; j < i; j++) { + for (size_t k = 0; k < vs_handle->fmt_list[j].size(); k++) + media_format_unref(vs_handle->fmt[j][k]); + + free(vs_handle->fmt[j]); + } + free(vs_handle->fmt); + return VISION_SOURCE_ERROR_OUT_OF_MEMORY; + } + } + + for (size_t i = 0; i < dev_count; i++) { + snprintf(vs_handle->dev_info[i].name, DEVICE_NAME_LENGTH_MAX, "%s", dev_name[i].c_str()); + + for (size_t j = 0; j < dev_fmt_list[i].size(); j++) { + media_format_h fmt; + media_format_create(&fmt); + media_format_set_video_mime(fmt, dev_fmt_list[i][j].type); + media_format_set_video_width(fmt, dev_fmt_list[i][j].width); + media_format_set_video_height(fmt, dev_fmt_list[i][j].height); + media_format_set_video_frame_rate(fmt, dev_fmt_list[i][j].fps); + vs_handle->fmt[i][j] = fmt; + } + } + return VISION_SOURCE_ERROR_NONE; +} + static int __vision_source_list_devices(vision_source_v4l2_s *vs_handle) { glob_t glob_buf; @@ -414,29 +453,10 @@ static int __vision_source_list_devices(vision_source_v4l2_s *vs_handle) return VISION_SOURCE_ERROR_OUT_OF_MEMORY; } - vs_handle->fmt = (media_format_h **) calloc(dev_count, sizeof(media_format_h *)); - if (!vs_handle->fmt) { - return VISION_SOURCE_ERROR_OUT_OF_MEMORY; - } - - for (size_t i = 0; i < dev_count; i++) { - vs_handle->dev_info[i].index = i; - strncpy(vs_handle->dev_info[i].name, dev_name[i].c_str(), DEVICE_NAME_LENGTH_MAX); - vs_handle->dev_info[i].name[DEVICE_NAME_LENGTH_MAX - 1] = '\0'; - vs_handle->fmt[i] = (media_format_h *) calloc(dev_fmt_list[i].size(), sizeof(media_format_h)); - if (!vs_handle->fmt[i]) { - return VISION_SOURCE_ERROR_OUT_OF_MEMORY; - } - - for (size_t j = 0; j < dev_fmt_list[i].size(); j++) { - media_format_h fmt; - media_format_create(&fmt); - media_format_set_video_mime(fmt, dev_fmt_list[i][j].type); - media_format_set_video_width(fmt, dev_fmt_list[i][j].width); - media_format_set_video_height(fmt, dev_fmt_list[i][j].height); - media_format_set_video_frame_rate(fmt, dev_fmt_list[i][j].fps); - vs_handle->fmt[i][j] = fmt; - } + ret = __vision_source_v4l2_alloc_fmt(vs_handle, dev_count, dev_name, dev_fmt_list); + if (ret != VISION_SOURCE_ERROR_NONE) { + free(vs_handle->dev_info); + vs_handle->dev_info = nullptr; } return ret;