瀏覽代碼

libdpkg: Refactor tar_header_checksum() out from tar_header_decode()

Guillem Jover 15 年之前
父節點
當前提交
d30a087c4f
共有 1 個文件被更改,包括 26 次插入16 次删除
  1. 26 16
      lib/dpkg/tarfn.c

+ 26 - 16
lib/dpkg/tarfn.c

@@ -158,16 +158,37 @@ get_unix_mode(struct tar_header *h)
 	return mode;
 }
 
+static bool
+tar_header_checksum(struct tar_header *h)
+{
+	unsigned char *s = (unsigned char *)h;
+	unsigned int i;
+	long checksum;
+	long sum;
+
+	checksum = OtoL(h->checksum, sizeof(h->checksum));
+
+	/* Treat checksum field as all blank. */
+	sum = ' ' * sizeof(h->checksum);
+
+	for (i = checksum_offset; i > 0; i--)
+		sum += *s++;
+
+	/* Skip the real checksum field. */
+	s += sizeof(h->checksum);
+
+	for (i = TARBLKSZ - checksum_offset - sizeof(h->checksum); i > 0; i--)
+		sum += *s++;
+
+	return (sum == checksum);
+}
+
 static int
 tar_header_decode(char *block, struct tar_entry *d)
 {
 	struct tar_header *h = (struct tar_header *)block;
-	unsigned char *s = (unsigned char *)block;
 	struct passwd *passwd = NULL;
 	struct group *group = NULL;
-	unsigned int i;
-	long sum;
-	long checksum;
 
 	if (memcmp(h->magic, TAR_MAGIC_GNU, 6) == 0)
 		d->format = tar_format_gnu;
@@ -206,18 +227,7 @@ tar_header_decode(char *block, struct tar_entry *d)
 	else
 		d->stat.gid = (gid_t)OtoL(h->gid, sizeof(h->gid));
 
-	checksum = OtoL(h->checksum, sizeof(h->checksum));
-
-	/* Treat checksum field as all blank. */
-	sum = ' ' * sizeof(h->checksum);
-	for (i = checksum_offset; i > 0; i--)
-		sum += *s++;
-	/* Skip the real checksum field. */
-	s += sizeof(h->checksum);
-	for (i = TARBLKSZ - checksum_offset - sizeof(h->checksum); i > 0; i--)
-		sum += *s++;
-
-	return (sum == checksum);
+	return tar_header_checksum(h);
 }
 
 struct symlinkList {