Remove data loss possibility in the log_file struct 21/243021/2
authorMateusz Majewski <m.majewski2@samsung.com>
Wed, 2 Sep 2020 13:10:50 +0000 (15:10 +0200)
committerMichal Bloch <m.bloch@partner.samsung.com>
Wed, 2 Sep 2020 15:05:42 +0000 (15:05 +0000)
Change-Id: I273953f7a5ebd4263b18d5e45c743793fb23f9b3

Makefile.am
src/shared/log_file.c

index 3648c7a..cc4f189 100644 (file)
@@ -469,7 +469,7 @@ src_tests_libdlog_prio_filter_pos_SOURCES = src/tests/libdlog_prio_filter_pos.c
 src_tests_libdlog_prio_filter_pos_CFLAGS = $(check_CFLAGS) -pthread
 src_tests_libdlog_prio_filter_pos_LDFLAGS = $(AM_LDFLAGS) -lpthread -Wl,--wrap=log_config_read
 
-src_tests_log_file_SOURCES = src/tests/log_file.c src/shared/log_file.c
+src_tests_log_file_SOURCES = src/tests/log_file.c src/shared/log_file.c src/shared/logcommon.c
 src_tests_log_file_CFLAGS = $(check_CFLAGS)
 src_tests_log_file_LDFLAGS = $(AM_LDFLAGS) -Wl,--wrap=strdup,--wrap=free,--wrap=memcpy,--wrap=snprintf,--wrap=open,--wrap=open64,--wrap=fstat,--wrap=fstat64,--wrap=rename,--wrap=dlogutil_entry_get_timestamp,--wrap=log_print_log_line,--wrap=dlogutil_entry_get_tag,--wrap=isatty
 
index 47f4ca1..447742b 100644 (file)
@@ -261,9 +261,11 @@ int logfile_flush(struct log_file *file)
        if (!file->buffer.data)
                return 0;
 
-       int written = write(file->fd, file->buffer.data, file->buffer.position);
-       if (write > 0)
-               file->buffer.position = 0; // TODO: data loss possibility here
+       /* This can cause the logs to linger in the buffer in case of an error (TODO?), but it's better than
+        * data loss on partial write, and is not a real issue since everybody quits on write error. */
+       int written = full_write(file->fd, file->buffer.data, file->buffer.position);
+       if (written > 0)
+               file->buffer.position = 0;
        return written;
 }