libarchive/get_header_ar.c: fix extraction of archives from binutils in deterministic mode
GNU binutils in deterministic mode (ar rD or built with --enable-deterministic-archives) hard codes file mode to 0644 (NOT 0100644) since https://github.com/bminor/binutils-gdb/commit/36e4dce69dd2 This confuses busybox ar x (data_extract_all): touch a; ar rD a.ar a ar: creating a.ar busybox ar x a.ar ar: unrecognized file type hexdump -C a.ar 00000000 21 3c 61 72 63 68 3e 0a 61 2f 20 20 20 20 20 20 |!<arch>.a/ | 00000010 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 | 0 | 00000020 20 20 20 20 30 20 20 20 20 20 30 20 20 20 20 20 | 0 0 | 00000030 36 34 34 20 20 20 20 20 30 20 20 20 20 20 20 20 |644 0 | 00000040 20 20 60 0a | `.| As a workaround, force the mode bits to S_IFREG, as nothing else makes sense for ar. function old new delta get_header_ar 539 542 +3 Signed-off-by: Peter Korsgaard <peter@korsgaard.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
		
				
					committed by
					
						
						Denys Vlasenko
					
				
			
			
				
	
			
			
			
						parent
						
							e67b80f473
						
					
				
				
					commit
					cb91a818c8
				
			@@ -92,8 +92,12 @@ char FAST_FUNC get_header_ar(archive_handle_t *archive_handle)
 | 
			
		||||
	/* Only size is always present, the rest may be missing in
 | 
			
		||||
	 * long filename pseudo file. Thus we decode the rest
 | 
			
		||||
	 * after dealing with long filename pseudo file.
 | 
			
		||||
	 *
 | 
			
		||||
	 * GNU binutils in deterministic mode hard codes mode to 0644 (NOT
 | 
			
		||||
	 * 0100644). AR archives can only contain files, so force file
 | 
			
		||||
	 * mode.
 | 
			
		||||
	 */
 | 
			
		||||
	typed->mode = read_num(ar.formatted.mode, 8, sizeof(ar.formatted.mode));
 | 
			
		||||
	typed->mode = read_num(ar.formatted.mode, 8, sizeof(ar.formatted.mode)) | S_IFREG;
 | 
			
		||||
	typed->gid = read_num(ar.formatted.gid, 10, sizeof(ar.formatted.gid));
 | 
			
		||||
	typed->uid = read_num(ar.formatted.uid, 10, sizeof(ar.formatted.uid));
 | 
			
		||||
	typed->mtime = read_num(ar.formatted.date, 10, sizeof(ar.formatted.date));
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user