]> git.alsa-project.org Git - tinycompress.git/commitdiff
utils: sofprobeclient: fix parser buffer overflow on large reads
authorJyri Sarha <jyri.sarha@linux.intel.com>
Mon, 30 Mar 2026 22:12:16 +0000 (01:12 +0300)
committerJaroslav Kysela <perex@perex.cz>
Fri, 29 May 2026 12:04:53 +0000 (14:04 +0200)
The compress device may return more data than the parser's internal
buffer (DATA_READ_LIMIT, 4096 bytes) can accept in one call. Feed
captured data in a loop, copying only as much as parser_fetch_free_buffer()
reports available per iteration. This fixes truncated probe packets
that caused checksum errors and missing log lines.

Closes: https://github.com/alsa-project/tinycompress/pull/35
Signed-off-by: Jyri Sarha <jyri.sarha@linux.intel.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
src/utils/sofprobeclient.c

index e5b4aeaaa921a874c0800f14e2c2c68f1021ef6c..6e10b44223660568fb0c1d5fa498433af3567a65 100644 (file)
@@ -219,20 +219,27 @@ static void capture_and_parse(unsigned int card, unsigned int device,
                }
 
                if (read > 0) {
+                       int remaining = read;
+                       char *src = buffer;
+
                        total_read += read;
 
-                       /* Feed captured data into the probe parser */
-                       parser_fetch_free_buffer(parser, &parse_buf, &parse_len);
-                       if ((size_t)read > parse_len) {
-                               fprintf(stderr, "Warning: read %d > parser buffer %zu, truncating\n",
-                                       read, parse_len);
-                               read = parse_len;
-                       }
-                       memcpy(parse_buf, buffer, read);
-                       ret = parser_parse_data(parser, read);
-                       if (ret < 0) {
-                               fprintf(stderr, "Parser error %d, stopping\n", ret);
-                               goto buf_exit;
+                       /* Feed captured data to the parser in chunks
+                        * that fit its internal buffer.
+                        */
+                       while (remaining > 0) {
+                               int chunk;
+
+                               parser_fetch_free_buffer(parser, &parse_buf, &parse_len);
+                               chunk = remaining < (int)parse_len ? remaining : (int)parse_len;
+                               memcpy(parse_buf, src, chunk);
+                               ret = parser_parse_data(parser, chunk);
+                               if (ret < 0) {
+                                       fprintf(stderr, "Parser error %d, stopping\n", ret);
+                                       goto buf_exit;
+                               }
+                               src += chunk;
+                               remaining -= chunk;
                        }
 
                        if (verbose) {