Fix coverity issue 54/222854/2
authorjiyong.min <jiyong.min@samsung.com>
Tue, 21 Jan 2020 01:20:20 +0000 (10:20 +0900)
committerjiyong.min <jiyong.min@samsung.com>
Tue, 21 Jan 2020 01:39:28 +0000 (10:39 +0900)
  - Argument cannot be negative

  'ftell' returns signed long and it can be negative(-1).
  Unsigned int 'file_size(size)' can get tainted value.
  So signed long for ftell has been added and check if it is below zero.

Change-Id: Ibe651c19465acc57b2e4e31b705644887c18a623

tests/mm_file_test.c

index f3bc491..8ca21a5 100755 (executable)
@@ -46,6 +46,8 @@
                fprintf(msg_tmp_fp, " - elapsed time: %3.5lf sec\n", end_time - start_time); \
                fflush(msg_tmp_fp); fclose(msg_tmp_fp); } }
 
+#define SAFE_FREE(src)                 { if (src) {free(src); src = NULL; } }
+
 typedef struct _mmfile_value {
        int len;
        union {
@@ -175,13 +177,17 @@ inline static int mm_file_is_little_endian(void)
 #define READ_FROM_FILE(FILE_PATH, data, size) \
        do {    \
                FILE *fp = fopen(FILE_PATH, "r");       \
+               long lsize = 0; \
                if (fp) {       \
                        if (fseek(fp, 0, SEEK_END) < 0) { printf("fseek failed\n"); fclose(fp); break; }        \
-                       size = ftell(fp);       \
+                       lsize = ftell(fp);      \
+                       if (lsize <= 0) { printf("ftell failed\n"); fclose(fp); break; }        \
                        if (fseek(fp, 0, SEEK_SET) < 0) { printf("fseek failed\n"); fclose(fp); break; }        \
-                       if (size > 0) data = malloc(size);      \
-                       if (data != NULL) { if (fread(data, sizeof(char), size, fp) != size) { printf("fread error\n"); } }     \
+                       data = malloc(lsize);   \
+                       if (!data) { printf("ftell failed\n"); fclose(fp); break; }     \
+                       if (fread(data, sizeof(char), lsize, fp) != (size_t)lsize) { printf("fread error\n"); SAFE_FREE(data); fclose(fp); break; }     \
                        fclose(fp);     \
+                       size = (unsigned int)lsize; \
                        printf("file size = %d\n", size);       \
                }       \
        } while (0)
@@ -268,6 +274,7 @@ static int mmfile_get_file_infomation(void *data, void *user_data, bool file_tes
                READ_FROM_FILE(filename, buffer, file_size);
 
                ret = mm_file_create_content_attrs_from_memory(&content_attrs, buffer, file_size, MM_FILE_FORMAT_3GP);
+               SAFE_FREE(buffer);
        }
 
        if (ret == FILEINFO_ERROR_NONE && content_attrs) {
@@ -346,6 +353,7 @@ static int mmfile_get_file_infomation(void *data, void *user_data, bool file_tes
                READ_FROM_FILE(filename, buffer, file_size);
 
                ret = mm_file_create_tag_attrs_from_memory(&tag_attrs, buffer, file_size, MM_FILE_FORMAT_3GP);
+               SAFE_FREE(buffer);
        }
 
        if (ret == FILEINFO_ERROR_NONE && tag_attrs) {
@@ -569,6 +577,7 @@ static int mmfile_get_video_frame(void *data, void *accurate, bool file_test)
                READ_FROM_FILE(filename, buffer, file_size);
 
                ret = mm_file_get_video_frame_from_memory(buffer, file_size, time_stamp, is_accurate, (unsigned char **)&_frame, &_frame_size, &width, &height);
+               SAFE_FREE(buffer);
        }
 
        if (ret != FILEINFO_ERROR_NONE)