squashfs-tools/6004-unsquashfs-move-fs-table-reading-into-the-version-sp.patch
2019-09-30 11:17:34 -04:00

333 lines
10 KiB
Diff

From 901a2e2652c2a45837bd155aa2c028c68bc8ad48 Mon Sep 17 00:00:00 2001
From: renxudong <renxudong1@huawei.com>
Date: Sun, 11 Aug 2019 01:11:24 -0400
Subject: [PATCH 4/8] unsquashfs-move-fs-table-reading-into-the-version-sp
---
squashfs-tools/unsquash-1.c | 25 +++++++++++++++++--------
squashfs-tools/unsquash-2.c | 24 +++++++++++++++++++++++-
squashfs-tools/unsquash-3.c | 22 ++++++++++++++++++++++
squashfs-tools/unsquash-4.c | 29 +++++++++++++++++++++++++++++
squashfs-tools/unsquashfs.c | 34 ++++++----------------------------
squashfs-tools/unsquashfs.h | 15 +++++++++------
6 files changed, 106 insertions(+), 43 deletions(-)
diff --git a/squashfs-tools/unsquash-1.c b/squashfs-tools/unsquash-1.c
index 41888fb..bf3589d 100644
--- a/squashfs-tools/unsquash-1.c
+++ b/squashfs-tools/unsquash-1.c
@@ -46,14 +46,6 @@ void read_block_list_1(unsigned int *block_list, char *block_ptr, int blocks)
}
-int read_fragment_table_1(long long *directory_table_end)
-{
- TRACE("read_fragment_table\n");
- *directory_table_end = sBlk.s.fragment_table_start;
- return TRUE;
-}
-
-
struct inode *read_inode_1(unsigned int start_block, unsigned int offset)
{
static union squashfs_inode_header_1 header;
@@ -359,3 +351,20 @@ int read_uids_guids_1()
return TRUE;
}
+
+
+int read_filesystem_tables_1()
+{
+ if(read_uids_guids_1() == FALSE)
+ return FALSE;
+
+ if(read_inode_table(sBlk.s.inode_table_start,
+ sBlk.s.directory_table_start) == FALSE)
+ return FALSE;
+
+ if(read_directory_table(sBlk.s.directory_table_start,
+ sBlk.uid_start) == FALSE)
+ return FALSE;
+
+ return TRUE;
+}
diff --git a/squashfs-tools/unsquash-2.c b/squashfs-tools/unsquash-2.c
index 0f2bfe8..9b4ade4 100644
--- a/squashfs-tools/unsquash-2.c
+++ b/squashfs-tools/unsquash-2.c
@@ -2,7 +2,7 @@
* Unsquash a squashfs filesystem. This is a highly compressed read only
* filesystem.
*
- * Copyright (c) 2009, 2010, 2013
+ * Copyright (c) 2009, 2010, 2013, 2019
* Phillip Lougher <phillip@squashfs.org.uk>
*
* This program is free software; you can redistribute it and/or
@@ -268,3 +268,25 @@ struct inode *read_inode_2(unsigned int start_block, unsigned int offset)
}
return &i;
}
+
+
+int read_filesystem_tables_2()
+{
+ long long directory_table_end;
+
+ if(read_uids_guids_1() == FALSE)
+ return FALSE;
+
+ if(read_fragment_table_2(&directory_table_end) == FALSE)
+ return FALSE;
+
+ if(read_inode_table(sBlk.s.inode_table_start,
+ sBlk.s.directory_table_start) == FALSE)
+ return FALSE;
+
+ if(read_directory_table(sBlk.s.directory_table_start,
+ directory_table_end) == FALSE)
+ return FALSE;
+
+ return TRUE;
+}
diff --git a/squashfs-tools/unsquash-3.c b/squashfs-tools/unsquash-3.c
index ac04a6a..622ce1e 100644
--- a/squashfs-tools/unsquash-3.c
+++ b/squashfs-tools/unsquash-3.c
@@ -395,3 +395,25 @@ corrupted:
free(dir);
return NULL;
}
+
+
+int read_filesystem_tables_3()
+{
+ long long directory_table_end;
+
+ if(read_uids_guids_1() == FALSE)
+ return FALSE;
+
+ if(read_fragment_table_3(&directory_table_end) == FALSE)
+ return FALSE;
+
+ if(read_inode_table(sBlk.s.inode_table_start,
+ sBlk.s.directory_table_start) == FALSE)
+ return FALSE;
+
+ if(read_directory_table(sBlk.s.directory_table_start,
+ directory_table_end) == FALSE)
+ return FALSE;
+
+ return TRUE;
+}
diff --git a/squashfs-tools/unsquash-4.c b/squashfs-tools/unsquash-4.c
index 05b0c5d..0f51888 100644
--- a/squashfs-tools/unsquash-4.c
+++ b/squashfs-tools/unsquash-4.c
@@ -24,6 +24,7 @@
#include "unsquashfs.h"
#include "squashfs_swap.h"
+#include "xattr.h"
static struct squashfs_fragment_entry *fragment_table;
static unsigned int *id_table;
@@ -399,3 +400,31 @@ int read_uids_guids_4()
return TRUE;
}
+
+
+int read_filesystem_tables_4()
+{
+ long long directory_table_end;
+
+ if(read_uids_guids_4() == FALSE)
+ return FALSE;
+
+ if(read_fragment_table_4(&directory_table_end) == FALSE)
+ return FALSE;
+
+ if(read_inode_table(sBlk.s.inode_table_start,
+ sBlk.s.directory_table_start) == FALSE)
+ return FALSE;
+
+ if(read_directory_table(sBlk.s.directory_table_start,
+ directory_table_end) == FALSE)
+ return FALSE;
+
+ if(no_xattrs)
+ sBlk.s.xattr_id_table_start = SQUASHFS_INVALID_BLK;
+
+ if(read_xattrs_from_disk(fd, &sBlk.s) == 0)
+ return FALSE;
+
+ return TRUE;
+}
diff --git a/squashfs-tools/unsquashfs.c b/squashfs-tools/unsquashfs.c
index 57cf2bc..875a6cd 100644
--- a/squashfs-tools/unsquashfs.c
+++ b/squashfs-tools/unsquashfs.c
@@ -1788,12 +1788,11 @@ int read_super(char *source)
if(sBlk_4.s_magic == SQUASHFS_MAGIC && sBlk_4.s_major == 4 &&
sBlk_4.s_minor == 0) {
+ s_ops.read_filesystem_tables = read_filesystem_tables_4;
s_ops.squashfs_opendir = squashfs_opendir_4;
s_ops.read_fragment = read_fragment_4;
- s_ops.read_fragment_table = read_fragment_table_4;
s_ops.read_block_list = read_block_list_2;
s_ops.read_inode = read_inode_4;
- s_ops.read_uids_guids = read_uids_guids_4;
memcpy(&sBlk, &sBlk_4, sizeof(sBlk_4));
/*
@@ -1861,28 +1860,25 @@ int read_super(char *source)
if(sBlk.s.s_major == 1) {
sBlk.s.block_size = sBlk_3.block_size_1;
sBlk.s.fragment_table_start = sBlk.uid_start;
+ s_ops.read_filesystem_tables = read_filesystem_tables_1;
s_ops.squashfs_opendir = squashfs_opendir_1;
- s_ops.read_fragment_table = read_fragment_table_1;
s_ops.read_block_list = read_block_list_1;
s_ops.read_inode = read_inode_1;
- s_ops.read_uids_guids = read_uids_guids_1;
} else {
sBlk.s.fragment_table_start =
sBlk_3.fragment_table_start_2;
+ s_ops.read_filesystem_tables = read_filesystem_tables_2;
s_ops.squashfs_opendir = squashfs_opendir_1;
s_ops.read_fragment = read_fragment_2;
- s_ops.read_fragment_table = read_fragment_table_2;
s_ops.read_block_list = read_block_list_2;
s_ops.read_inode = read_inode_2;
- s_ops.read_uids_guids = read_uids_guids_1;
}
} else if(sBlk.s.s_major == 3) {
+ s_ops.read_filesystem_tables = read_filesystem_tables_3;
s_ops.squashfs_opendir = squashfs_opendir_3;
s_ops.read_fragment = read_fragment_3;
- s_ops.read_fragment_table = read_fragment_table_3;
s_ops.read_block_list = read_block_list_2;
s_ops.read_inode = read_inode_3;
- s_ops.read_uids_guids = read_uids_guids_1;
} else {
ERROR("Filesystem on %s is (%d:%d), ", source, sBlk.s.s_major,
sBlk.s.s_minor);
@@ -2501,7 +2497,6 @@ int main(int argc, char *argv[])
int n;
struct pathnames *paths = NULL;
struct pathname *path = NULL;
- long long directory_table_end;
int fragment_buffer_size = FRAGMENT_BUFFER_DEFAULT;
int data_buffer_size = DATA_BUFFER_DEFAULT;
@@ -2757,25 +2752,8 @@ options:
memset(created_inode, 0, sBlk.s.inodes * sizeof(char *));
- if(s_ops.read_uids_guids() == FALSE)
- EXIT_UNSQUASH("failed to uid/gid table\n");
-
- if(s_ops.read_fragment_table(&directory_table_end) == FALSE)
- EXIT_UNSQUASH("failed to read fragment table\n");
-
- if(read_inode_table(sBlk.s.inode_table_start,
- sBlk.s.directory_table_start) == FALSE)
- EXIT_UNSQUASH("failed to read inode table\n");
-
- if(read_directory_table(sBlk.s.directory_table_start,
- directory_table_end) == FALSE)
- EXIT_UNSQUASH("failed to read directory table\n");
-
- if(no_xattrs)
- sBlk.s.xattr_id_table_start = SQUASHFS_INVALID_BLK;
-
- if(read_xattrs_from_disk(fd, &sBlk.s) == 0)
- EXIT_UNSQUASH("failed to read the xattr table\n");
+ if(s_ops.read_filesystem_tables() == FALSE)
+ EXIT_UNSQUASH("failed to read file system tables\n");
if(path) {
paths = init_subdir();
diff --git a/squashfs-tools/unsquashfs.h b/squashfs-tools/unsquashfs.h
index ecd0bb4..f9c49ac 100644
--- a/squashfs-tools/unsquashfs.h
+++ b/squashfs-tools/unsquashfs.h
@@ -4,7 +4,7 @@
* Unsquash a squashfs filesystem. This is a highly compressed read only
* filesystem.
*
- * Copyright (c) 2009, 2010, 2013, 2014
+ * Copyright (c) 2009, 2010, 2013, 2014, 2019
* Phillip Lougher <phillip@squashfs.org.uk>
*
* This program is free software; you can redistribute it and/or
@@ -102,12 +102,11 @@ typedef struct squashfs_operations {
unsigned int offset, struct inode **i);
void (*read_fragment)(unsigned int fragment, long long *start_block,
int *size);
- int (*read_fragment_table)(long long *);
void (*read_block_list)(unsigned int *block_list, char *block_ptr,
int blocks);
struct inode *(*read_inode)(unsigned int start_block,
unsigned int offset);
- int (*read_uids_guids)();
+ int (*read_filesystem_tables)();
} squashfs_operations;
struct test {
@@ -235,10 +234,13 @@ extern int progress_enabled;
extern int inode_number;
extern int lookup_type[];
extern int fd;
+extern int no_xattrs;
extern struct queue *to_reader, *to_inflate, *to_writer;
extern struct cache *fragment_cache, *data_cache;
/* unsquashfs.c */
+extern int read_inode_table(long long, long long);
+extern int read_directory_table(long long, long long);
extern int lookup_entry(struct hash_table_entry **, long long);
extern int read_fs_bytes(int fd, long long, int, void *);
extern int read_block(int, long long, long long *, int, void *);
@@ -249,7 +251,7 @@ extern void dump_cache(struct cache *);
/* unsquash-1.c */
extern void read_block_list_1(unsigned int *, char *, int);
-extern int read_fragment_table_1(long long *);
+extern int read_filesystem_tables_1();
extern struct inode *read_inode_1(unsigned int, unsigned int);
extern struct dir *squashfs_opendir_1(unsigned int, unsigned int,
struct inode **);
@@ -257,12 +259,13 @@ extern int read_uids_guids_1();
/* unsquash-2.c */
extern void read_block_list_2(unsigned int *, char *, int);
-extern int read_fragment_table_2(long long *);
+extern int read_filesystem_tables_2();
extern void read_fragment_2(unsigned int, long long *, int *);
extern struct inode *read_inode_2(unsigned int, unsigned int);
/* unsquash-3.c */
extern int read_fragment_table_3(long long *);
+extern int read_filesystem_tables_3();
extern void read_fragment_3(unsigned int, long long *, int *);
extern struct inode *read_inode_3(unsigned int, unsigned int);
extern struct dir *squashfs_opendir_3(unsigned int, unsigned int,
@@ -270,9 +273,9 @@ extern struct dir *squashfs_opendir_3(unsigned int, unsigned int,
/* unsquash-4.c */
extern int read_fragment_table_4(long long *);
+extern int read_filesystem_tables_4();
extern void read_fragment_4(unsigned int, long long *, int *);
extern struct inode *read_inode_4(unsigned int, unsigned int);
extern struct dir *squashfs_opendir_4(unsigned int, unsigned int,
struct inode **);
-extern int read_uids_guids_4();
#endif
--
1.8.3.1