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)
```
This commit is contained in:
Andrey Skvortsov
2025-05-28 23:16:31 +03:00
committed by Martijn Braam
parent 529e7841ab
commit 928714595d

View File

@@ -1262,14 +1262,17 @@ 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);
if (end > 0) {
// Skip the newline at the end
stdout[--end] = '\0';
char *path = path = stdout + end - 1;
path = stdout + end - 1;
do {
if (*path == '\n') {
path++;
@@ -1277,6 +1280,9 @@ post_process_finished(GSubprocess *proc, GAsyncResult *res, GdkTexture *thumb)
}
--path;
} while (path > stdout);
} else {
path = stdout;
}
mp_main_capture_completed(thumb, path);
}