Fix leaks when calloc fail 66/319166/4 accepted/tizen_unified accepted/tizen_unified_x tizen accepted/tizen/unified/20250212.101014 accepted/tizen/unified/x/20250218.043814
authorKwanghoon Son <k.son@samsung.com>
Wed, 5 Feb 2025 00:33:04 +0000 (09:33 +0900)
committerKwanghoon Son <k.son@samsung.com>
Tue, 11 Feb 2025 01:49:48 +0000 (10:49 +0900)
[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 <k.son@samsung.com>
packaging/vision-source-v4l2.spec
src/vision_source_v4l2.cpp

index e165de3fbb865832785aa4842b82493cd9cd5f84..c05914b67abdfd71b2be12c8fc5913836c982e75 100644 (file)
@@ -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
index d4c81515ce606df6e4a3c0dcaa36449dea6d2440..30229f12cb61575f617a177835068a87a9dfa6b7 100644 (file)
@@ -366,6 +366,45 @@ static int __dev_info_from_path(const char *path, vector<fmt_info> &fmt_list)
        return ret;
 }
 
+static int __vision_source_v4l2_alloc_fmt(vision_source_v4l2_s *vs_handle, size_t dev_count,
+                                                                                 std::vector<string> &dev_name,
+                                                                                 std::vector<std::vector<fmt_info> > &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;