summaryrefslogtreecommitdiff
blob: 21dcfa4c94c5f097d959de206152f09167b78cea (plain)
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
https://bugs.astron.com/view.php?id=415
https://github.com/file/file/commit/1dd21dd360472d7b830825df8e40a06cdc1cbbcf

From 1dd21dd360472d7b830825df8e40a06cdc1cbbcf Mon Sep 17 00:00:00 2001
From: Christos Zoulas <christos@zoulas.com>
Date: Sun, 8 Jan 2023 18:09:16 +0000
Subject: [PATCH] fix decompression always returning empty.

--- a/src/compress.c
+++ b/src/compress.c
@@ -609,6 +609,7 @@ uncompresszlib(const unsigned char *old, unsigned char **newch,
 	int rc;
 	z_stream z;
 
+	DPRINTF("builtin zlib decompression\n");
 	z.next_in = CCAST(Bytef *, old);
 	z.avail_in = CAST(uint32_t, *n);
 	z.next_out = *newch;
@@ -650,6 +651,7 @@ uncompressbzlib(const unsigned char *old, unsigned char **newch,
 	int rc;
 	bz_stream bz;
 
+	DPRINTF("builtin bzlib decompression\n");
 	memset(&bz, 0, sizeof(bz));
 	rc = BZ2_bzDecompressInit(&bz, 0, 0);
 	if (rc != BZ_OK)
@@ -690,6 +692,7 @@ uncompressxzlib(const unsigned char *old, unsigned char **newch,
 	int rc;
 	lzma_stream xz;
 
+	DPRINTF("builtin xzlib decompression\n");
 	memset(&xz, 0, sizeof(xz));
 	rc = lzma_auto_decoder(&xz, UINT64_MAX, 0);
 	if (rc != LZMA_OK)
@@ -729,6 +732,7 @@ uncompresszstd(const unsigned char *old, unsigned char **newch,
 	ZSTD_inBuffer in;
 	ZSTD_outBuffer out;
 
+	DPRINTF("builtin zstd decompression\n");
 	if ((zstd = ZSTD_createDStream()) == NULL) {
 		return makeerror(newch, n, "No ZSTD decompression stream, %s",
 		    strerror(errno));
@@ -777,6 +781,7 @@ uncompresslzlib(const unsigned char *old, unsigned char **newch,
 
 	bufp = *newch;
 
+	DPRINTF("builtin lzlib decompression\n");
 	dec = LZ_decompress_open();
 	if (!dec) {
 		return makeerror(newch, n, "unable to allocate LZ_Decoder");
@@ -833,11 +838,13 @@ makeerror(unsigned char **buf, size_t *len, const char *fmt, ...)
 	va_list ap;
 	int rv;
 
+	DPRINTF("Makeerror %s\n", fmt);
 	free(*buf);
 	va_start(ap, fmt);
 	rv = vasprintf(&msg, fmt, ap);
 	va_end(ap);
 	if (rv < 0) {
+		DPRINTF("Makeerror failed");
 		*buf = NULL;
 		*len = 0;
 		return NODATA;
@@ -1048,7 +1055,7 @@ uncompressbuf(int fd, size_t bytes_max, size_t method, int nofork,
 	pid_t pid;
 	pid_t writepid = -1;
 	size_t i;
-	ssize_t r;
+	ssize_t r, re;
 	char *const *args;
 #ifdef HAVE_POSIX_SPAWNP
 	posix_spawn_file_actions_t fa;
@@ -1103,6 +1110,7 @@ uncompressbuf(int fd, size_t bytes_max, size_t method, int nofork,
 
 	handledesc(&fa, fd, fdp);
 
+	DPRINTF("Executing %s\n", compr[method].argv[0]);
 	status = posix_spawnp(&pid, compr[method].argv[0], &fa, NULL,
 	    args, NULL);
 
@@ -1128,6 +1136,7 @@ uncompressbuf(int fd, size_t bytes_max, size_t method, int nofork,
 		 * do not modify fdp[i][j].
 		 */
 		handledesc(NULL, fd, fdp);
+		DPRINTF("Executing %s\n", compr[method].argv[0]);
 
 		(void)execvp(compr[method].argv[0], args);
 		dprintf(STDERR_FILENO, "exec `%s' failed, %s",
@@ -1146,6 +1155,7 @@ uncompressbuf(int fd, size_t bytes_max, size_t method, int nofork,
 		if (writepid == (pid_t)-1) {
 			rv = makeerror(newch, n, "Write to child failed, %s",
 			    strerror(errno));
+			DPRINTF("Write to child failed\n");
 			goto err;
 		}
 		closefd(fdp[STDIN_FILENO], 1);
@@ -1153,6 +1163,7 @@ uncompressbuf(int fd, size_t bytes_max, size_t method, int nofork,
 
 	rv = OKDATA;
 	r = sread(fdp[STDOUT_FILENO][0], *newch, bytes_max, 0);
+	DPRINTF("read got %zd\n", r);
 	if (r < 0) {
 		rv = ERRDATA;
 		DPRINTF("Read stdout failed %d (%s)\n", fdp[STDOUT_FILENO][0],
@@ -1165,15 +1176,17 @@ uncompressbuf(int fd, size_t bytes_max, size_t method, int nofork,
 		 * errors, otherwise we risk the child blocking and never
 		 * exiting.
 		 */
+		DPRINTF("Closing stdout for bytes_max\n");
 		closefd(fdp[STDOUT_FILENO], 0);
 		goto ok;
 	}
-	if ((r = sread(fdp[STDERR_FILENO][0], *newch, bytes_max, 0)) > 0) {
+	if ((re = sread(fdp[STDERR_FILENO][0], *newch, bytes_max, 0)) > 0) {
+		DPRINTF("Got stuff from stderr %s\n", *newch);
 		rv = ERRDATA;
 		r = filter_error(*newch, r);
 		goto ok;
 	}
-	if  (r == 0)
+	if  (re == 0)
 		goto ok;
 	rv = makeerror(newch, n, "Read stderr failed, %s",
 	    strerror(errno));