ss_bsdiff: Fix uninitialized use of a variable 47/312547/1
authorSangYoun Kwak <sy.kwak@samsung.com>
Tue, 11 Jun 2024 09:19:00 +0000 (18:19 +0900)
committerSangYoun Kwak <sy.kwak@samsung.com>
Tue, 11 Jun 2024 09:21:22 +0000 (18:21 +0900)
There were two pointer variables for the memory map(mmap) address:
 * input_file_ptr
 * output_file_ptr

If mmap function fails, control flow goes to "exit" lable and munmap the
mapped addresses.

Previously, the declaration of output_file_ptr was placed after the mmap
of input_file_ptr. In this situation, if mmap fails, program tries to
unmap the both input_file_ptr and output_file_ptr but output_file_ptr is
not declared yet.

To fix this issue, declarations of these variables are moved to 'before
the first mmap'.

Change-Id: I721cfaaf269c02868de7e868e2e73ea64698abe7
Signed-off-by: SangYoun Kwak <sy.kwak@samsung.com>
bsdiff/ss_bsdiff.c

index e1f68c5..eaa4b5b 100644 (file)
@@ -590,8 +590,11 @@ int brotli_compress_internal(int input_fd, int output_fd, int quality)
        int res = -1;
        size_t input_size = lseek(input_fd, 0, SEEK_END);
        lseek(input_fd, 0, SEEK_SET);
-       void *input_file_ptr = mmap(NULL, input_size, PROT_READ, MAP_PRIVATE, input_fd, 0);
 
+       void *input_file_ptr = MAP_FAILED;
+       void *output_file_ptr = MAP_FAILED;
+
+       input_file_ptr = mmap(NULL, input_size, PROT_READ, MAP_PRIVATE, input_fd, 0);
        if (input_file_ptr == MAP_FAILED) {
                printf("Can not mmap input file: %d - %m\n", errno);
                goto exit;
@@ -614,7 +617,7 @@ int brotli_compress_internal(int input_fd, int output_fd, int quality)
                goto exit;
        }
 
-       void *output_file_ptr = mmap(NULL, max_output_size, PROT_WRITE, MAP_SHARED, output_fd, 0);
+       output_file_ptr = mmap(NULL, max_output_size, PROT_WRITE, MAP_SHARED, output_fd, 0);
        if (output_file_ptr == MAP_FAILED) {
                printf("Can not mmap output file: %d - %m\n", errno);
                goto exit;
@@ -637,9 +640,9 @@ int brotli_compress_internal(int input_fd, int output_fd, int quality)
 
        res = 0;
 exit:
-       if (input_file_ptr)
+       if (input_file_ptr != MAP_FAILED)
                munmap(input_file_ptr, input_size);
-       if (output_file_ptr)
+       if (output_file_ptr != MAP_FAILED)
                munmap(output_file_ptr, max_output_size);
 
        return res;