From 928714595dc50ce9d4b427f3c5b5038f5122b1a3 Mon Sep 17 00:00:00 2001 From: Andrey Skvortsov Date: Wed, 28 May 2025 23:16:31 +0300 Subject: [PATCH] process_pipeline: correctly handle empty stdout When stdout is empty and end is zero. There are several incorrect read and write access. Valgrind reported following: ``` ==70402== Invalid write of size 1 ==70402== at 0x11F626: post_process_finished (process_pipeline.c:1266) ==70402== by 0x53D7C32: ??? (in /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0.8400.1) ==70402== by 0x53D88D2: ??? (in /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0.8400.1) ==70402== by 0x53D6627: ??? (in /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0.8400.1) ==70402== by 0x53D7C32: ??? (in /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0.8400.1) ==70402== by 0x53D7C6C: ??? (in /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0.8400.1) ==70402== by 0x55D5344: ??? (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.8400.1) ==70402== by 0x55D7576: ??? (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.8400.1) ==70402== by 0x55D7CDF: g_main_context_iteration (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.8400.1) ==70402== by 0x5407EDC: g_application_run (in /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0.8400.1) ==70402== by 0x11BB5F: main (main.c:1551) ==70402== Address 0xb84651f is 1 bytes before a block of size 16 alloc'd ==70402== at 0x484BDD0: realloc (vg_replace_malloc.c:1801) ==70402== by 0x55DE761: g_realloc (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.8400.1) ==70402== by 0x53AE250: ??? (in /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0.8400.1) ==70402== by 0x53AE3C0: ??? (in /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0.8400.1) ==70402== by 0x53B6CFC: g_output_stream_write (in /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0.8400.1) ==70402== by 0x53B6E48: g_output_stream_write_all (in /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0.8400.1) ==70402== by 0x53D65EA: ??? (in /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0.8400.1) ==70402== by 0x53D7C32: ??? (in /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0.8400.1) ==70402== by 0x53D88D2: ??? (in /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0.8400.1) ==70402== by 0x53B7D8A: ??? (in /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0.8400.1) ==70402== by 0x53D7C32: ??? (in /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0.8400.1) ==70402== by 0x53D88D2: ??? (in /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0.8400.1) ==70402== ==70402== Invalid read of size 1 ==70402== at 0x11F642: post_process_finished (process_pipeline.c:1270) ==70402== by 0x53D7C32: ??? (in /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0.8400.1) ==70402== by 0x53D88D2: ??? (in /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0.8400.1) ==70402== by 0x53D6627: ??? (in /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0.8400.1) ==70402== by 0x53D7C32: ??? (in /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0.8400.1) ==70402== by 0x53D7C6C: ??? (in /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0.8400.1) ==70402== by 0x55D5344: ??? (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.8400.1) ==70402== by 0x55D7576: ??? (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.8400.1) ==70402== by 0x55D7CDF: g_main_context_iteration (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.8400.1) ==70402== by 0x5407EDC: g_application_run (in /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0.8400.1) ==70402== by 0x11BB5F: main (main.c:1551) ``` --- src/process_pipeline.c | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/process_pipeline.c b/src/process_pipeline.c index 50a6334..a913129 100644 --- a/src/process_pipeline.c +++ b/src/process_pipeline.c @@ -1262,21 +1262,27 @@ static void post_process_finished(GSubprocess *proc, GAsyncResult *res, GdkTexture *thumb) { char *stdout; + char *path; g_subprocess_communicate_utf8_finish(proc, res, &stdout, NULL, NULL); // The last line contains the file name int end = strlen(stdout); - // Skip the newline at the end - stdout[--end] = '\0'; - char *path = path = stdout + end - 1; - do { - if (*path == '\n') { - path++; - break; - } - --path; - } while (path > stdout); + if (end > 0) { + // Skip the newline at the end + stdout[--end] = '\0'; + + path = stdout + end - 1; + do { + if (*path == '\n') { + path++; + break; + } + --path; + } while (path > stdout); + } else { + path = stdout; + } mp_main_capture_completed(thumb, path); }