1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
From 28d2900e51b6d20f22d3a74eca6ddac5939ef104 Mon Sep 17 00:00:00 2001
From: datauwu <209150516+datauwu@users.noreply.github.com>
Date: Thu, 15 Oct 2026 03:16:35 +0800
Subject: [PATCH] archive_read: fix large child environment test
Scan the entire child environment output using a fixed-size buffer to
prevent false failures with large environments while preserving
matches across read boundaries.
---
.../test/test_create_child_environment.c | 36 +++++++++++++------
1 file changed, 26 insertions(+), 10 deletions(-)
diff --git a/libarchive/test/test_create_child_environment.c b/libarchive/test/test_create_child_environment.c
index 1b937fd501..151c4b21d9 100644
--- a/libarchive/test/test_create_child_environment.c
+++ b/libarchive/test/test_create_child_environment.c
@@ -56,9 +56,9 @@ DEFINE_TEST(test_create_child_environment)
struct archive *a;
struct archive_entry *ae;
char buf[8192];
- size_t total;
+ size_t total, needle_len, overlap, keep;
ssize_t n;
- int r;
+ int r, found;
if (!canRunCommand("env", NULL)) {
skipping("Can't run the \"env\" program on this platform");
@@ -84,16 +84,32 @@ DEFINE_TEST(test_create_child_environment)
archive_read_open_memory(a, input, sizeof(input)));
assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ needle_len = strlen(needle);
+ overlap = needle_len > 1 ? needle_len - 1 : 0;
+ assert(needle_len < sizeof(buf));
+
+ /* Scan the complete output, even if the environment exceeds buf. */
total = 0;
- while (total < sizeof(buf) - 1) {
- n = archive_read_data(a, buf + total, sizeof(buf) - 1 - total);
- if (n < 0)
- break;
- if (n == 0)
- break;
+ found = 0;
+ while ((n = archive_read_data(a, buf + total,
+ sizeof(buf) - 1 - total)) > 0) {
total += (size_t)n;
+ buf[total] = '\0';
+ if (!found) {
+ if (strstr(buf, needle) != NULL) {
+ found = 1;
+ } else {
+ /* Retain bytes for matches across read
+ * boundaries. */
+ keep = total < overlap ? total : overlap;
+ memmove(buf, buf + total - keep, keep);
+ total = keep;
+ }
+ }
+ if (found)
+ total = 0;
}
- buf[total] = '\0';
+ assertEqualIntA(a, 0, n);
assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
assertEqualInt(ARCHIVE_OK, archive_read_free(a));
@@ -103,6 +119,6 @@ DEFINE_TEST(test_create_child_environment)
/* The filter program's output should list our marker variable:
* if it doesn't, it was spawned with an empty (or at least
* incomplete) environment. */
- assert(strstr(buf, needle) != NULL);
+ assertEqualInt(1, found);
#endif
}
|