Do it correctly sandbox/mmajewski2/mutex
authorMateusz Majewski <m.majewski2@samsung.com>
Fri, 10 Sep 2021 10:54:33 +0000 (12:54 +0200)
committerMateusz Majewski <m.majewski2@samsung.com>
Fri, 10 Sep 2021 10:54:33 +0000 (12:54 +0200)
Change-Id: Ie277ce05e215a00c5424ebf77375a8cd3b138e48

kernel/logger.c

index 37867a80c7c536845137f46803d1b3662a44c38e..4b80eb4c2ef5268b1f22ee54e06c9833436f718c 100644 (file)
@@ -531,7 +531,10 @@ static void write_log_data(struct logger_log *log,
        log->w_off = logger_offset(log, w_off + chunk_len);
 }
 
-static void flush_thread_data(struct file* file, bool log_locked)
+/*
+ * The caller needs to hold log->mutex.
+ */
+static void flush_thread_data(struct file* file)
 {
        struct logger_writer *writer = file->private_data;
        struct logger_log *log = file_get_log(file);
@@ -540,16 +543,10 @@ static void flush_thread_data(struct file* file, bool log_locked)
        chunk_len = writer->b_off + 1;
        writer->b_header.len = chunk_len + writer->tag_len + 2;
 
-       if (!log_locked)
-               mutex_lock(&log->mutex);
-
        fix_up_readers(log, sizeof(struct logger_entry) + writer->b_header.len);
 
        write_log_data(log, &writer->b_header, writer, chunk_len);
 
-       if (!log_locked)
-               mutex_unlock(&log->mutex);
-
        writer->b_off = 0;
        writer->buffer[0] = '\0';
 }
@@ -631,7 +628,7 @@ static ssize_t logger_write_iter(struct kiocb *iocb, struct iov_iter *from)
 
                /* flush message from a different thread */
                if (writer->b_owner != current && writer->b_off)
-                       flush_thread_data(file, true);
+                       flush_thread_data(file);
 
                count = 0;
                /* -1 : leave space for message terminating '\0' */
@@ -812,10 +809,15 @@ static int logger_release(struct inode *ignored, struct file *file)
                kfree(reader);
        } else {
                struct logger_writer *writer = file->private_data;
+               struct logger_log *log = writer->log;
+
 
                bool from_stdio = writer->tag && writer->prio >= 2;
-               if (from_stdio && writer->b_off > 0)
-                       flush_thread_data(file, false);
+               if (from_stdio && writer->b_off > 0) {
+                       mutex_lock(&log->mutex);
+                       flush_thread_data(file);
+                       mutex_unlock(&log->mutex);
+               }
 
                kfree(writer->tag);
                kfree(writer->buffer);