dpkg-deb: work around bogus error message when working with XZ compressed packages
function old new delta unpack_xz_stream 2309 2317 +8 bb_full_fd_action 464 472 +8 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
		@@ -96,6 +96,24 @@ unpack_xz_stream(transformer_state_t *xstate)
 | 
				
			|||||||
			 */
 | 
								 */
 | 
				
			||||||
			do {
 | 
								do {
 | 
				
			||||||
				if (membuf[iobuf.in_pos] != 0) {
 | 
									if (membuf[iobuf.in_pos] != 0) {
 | 
				
			||||||
 | 
										/* There is more data, but is it XZ data?
 | 
				
			||||||
 | 
										 * Example: dpkg-deb -f busybox_1.30.1-4_amd64.deb
 | 
				
			||||||
 | 
										 * reads control.tar.xz "control" file
 | 
				
			||||||
 | 
										 * inside the ar archive, but tar.xz
 | 
				
			||||||
 | 
										 * extraction code reaches end of xz data,
 | 
				
			||||||
 | 
										 * reached this code and reads the beginning
 | 
				
			||||||
 | 
										 * of data.tar.xz's ar header, which isn't xz data,
 | 
				
			||||||
 | 
										 * and prints "corrupted data".
 | 
				
			||||||
 | 
										 * The correct solution is to not read
 | 
				
			||||||
 | 
										 * past nested archive (to simulate EOF).
 | 
				
			||||||
 | 
										 * This is a workaround:
 | 
				
			||||||
 | 
										 */
 | 
				
			||||||
 | 
										if (membuf[iobuf.in_pos] != 0xfd) {
 | 
				
			||||||
 | 
											/* It's definitely not a xz signature
 | 
				
			||||||
 | 
											 * (which is 0xfd,"7zXZ",0x00).
 | 
				
			||||||
 | 
											 */
 | 
				
			||||||
 | 
											goto end;
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
					xz_dec_reset(state);
 | 
										xz_dec_reset(state);
 | 
				
			||||||
					goto do_run;
 | 
										goto do_run;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
@@ -128,7 +146,7 @@ unpack_xz_stream(transformer_state_t *xstate)
 | 
				
			|||||||
			break;
 | 
								break;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					 end:
 | 
				
			||||||
	xz_dec_end(state);
 | 
						xz_dec_end(state);
 | 
				
			||||||
	free(membuf);
 | 
						free(membuf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,7 +25,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#define STREAM_HEADER_SIZE 12
 | 
					#define STREAM_HEADER_SIZE 12
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define HEADER_MAGIC "\3757zXZ"
 | 
					#define HEADER_MAGIC "\375""7zXZ"
 | 
				
			||||||
#define HEADER_MAGIC_SIZE 6
 | 
					#define HEADER_MAGIC_SIZE 6
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define FOOTER_MAGIC "YZ"
 | 
					#define FOOTER_MAGIC "YZ"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,7 +18,7 @@
 | 
				
			|||||||
 * was seen to cause largish delays when user tries to ^C a file copy.
 | 
					 * was seen to cause largish delays when user tries to ^C a file copy.
 | 
				
			||||||
 * Let's use a saner size.
 | 
					 * Let's use a saner size.
 | 
				
			||||||
 * Note: needs to be >= max(CONFIG_FEATURE_COPYBUF_KB),
 | 
					 * Note: needs to be >= max(CONFIG_FEATURE_COPYBUF_KB),
 | 
				
			||||||
 * or else "copy to eof" code will use neddlesly short reads.
 | 
					 * or else "copy to eof" code will use needlesly short reads.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
#define SENDFILE_BIGBUF (16*1024*1024)
 | 
					#define SENDFILE_BIGBUF (16*1024*1024)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -60,10 +60,13 @@ static off_t bb_full_fd_action(int src_fd, int dst_fd, off_t size)
 | 
				
			|||||||
		ssize_t rd;
 | 
							ssize_t rd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (sendfile_sz) {
 | 
							if (sendfile_sz) {
 | 
				
			||||||
			rd = sendfile(dst_fd, src_fd, NULL,
 | 
								/* dst_fd == -1 is a fake, else... */
 | 
				
			||||||
				size > sendfile_sz ? sendfile_sz : size);
 | 
								if (dst_fd >= 0) {
 | 
				
			||||||
			if (rd >= 0)
 | 
									rd = sendfile(dst_fd, src_fd, NULL,
 | 
				
			||||||
				goto read_ok;
 | 
										size > sendfile_sz ? sendfile_sz : size);
 | 
				
			||||||
 | 
									if (rd >= 0)
 | 
				
			||||||
 | 
										goto read_ok;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
			sendfile_sz = 0; /* do not try sendfile anymore */
 | 
								sendfile_sz = 0; /* do not try sendfile anymore */
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
#if CONFIG_FEATURE_COPYBUF_KB > 4
 | 
					#if CONFIG_FEATURE_COPYBUF_KB > 4
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user