Forráskód Böngészése

tar2qfile: improved to skip everything but regular files

Olivier MEDOC 10 éve
szülő
commit
a05e21ee5f
1 módosított fájl, 17 hozzáadás és 10 törlés
  1. 17 10
      qubes-rpc/tar2qfile.c

+ 17 - 10
qubes-rpc/tar2qfile.c

@@ -683,14 +683,7 @@ ustar_rd (int fd, struct file_header * untrusted_hdr, char *buf, struct stat * s
     case EXTHEADERTYPE:
 	fprintf(stderr,"Extended HEADER encountered\n");
 
-	fprintf(stderr,"Need to skip %d bytes. Skipping a full block\n",sb->st_size);
-	sb->st_size = BLKMULT;
-	while (sb->st_size > 0) {
-		sb->st_size -= read(fd, buf, MAX(sb->st_size,BLKMULT));
-		fprintf(stderr,"now at %d\n",sb->st_size);
-	}
-	
-
+	return NEED_SKIP;
 	break;
     default:
 	fprintf(stderr,"Default type detected:%c\n",hd->typeflag);
@@ -705,7 +698,7 @@ ustar_rd (int fd, struct file_header * untrusted_hdr, char *buf, struct stat * s
 //      arcn->sb.st_mode |= S_IFREG;
       break;
     }
-  return NEED_READ;
+  return NEED_SKIP;
 }
 
 
@@ -724,7 +717,8 @@ int tar_file_processor(int fd)
 
 	i=0;
 	current = NEED_READ;
-	long sync_count = 0;
+	size_t to_skip = 0;
+	int sync_count = 0;
 	while (size = read(fd, &buf, BLKMULT)) {
 		fprintf(stderr,"Read %d bytes\n",size);
 
@@ -740,6 +734,19 @@ int tar_file_processor(int fd)
 			current = ustar_rd(fd, &hdr, &buf, &sb);
 			fprintf(stderr,"Return %d\n",ret);
 		}
+		if (current==NEED_SKIP) {
+			fprintf(stderr,"Need to skip %d bytes\n",sb.st_size);
+			to_skip = sb.st_size;
+			while (to_skip > 0) {
+				to_skip -= read(fd, &buf, MIN(to_skip,BLKMULT));
+			}
+	
+			// Extract extra padding
+			fprintf(stderr,"Need to remove pad:%d %d %d\n",to_skip,sb.st_size,BLKMULT-(sb.st_size%BLKMULT));
+			ret = read(fd, &buf, BLKMULT-(sb.st_size%BLKMULT));
+			fprintf(stderr,"Removed %d bytes of padding\n",ret);
+			current = NEED_READ;
+		} 
 		i++;
 		//if (i >= 10)
 		//	exit(0);