aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2024-02-09 16:14:27 +0100
committerDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2024-02-09 16:17:23 +0100
commitf9ca81a4768e06e2a01b555640173b5ec09fc4c8 (patch)
tree8688aefe824788ef4859d1c73ee915a3603d176b
parentae048f7ac4a9ab6576ca6842aa13e5c9c31e35a7 (diff)
Fixup extaction paths for rdsquashfs on Windows
- If we generate a manifest file, use the fix-path function to produce a fixed up, actual name as the source path. - When unpacking, create files for the fixed up, actual name. There is no need to touch gensquashfs, if the manifest file is used to re-pack the stuff, the original paths are used and the files are source from the fixed-up paths. Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
-rw-r--r--bin/rdsquashfs/describe.c20
-rw-r--r--bin/rdsquashfs/fill_files.c21
-rw-r--r--bin/rdsquashfs/restore_fstree.c23
3 files changed, 57 insertions, 7 deletions
diff --git a/bin/rdsquashfs/describe.c b/bin/rdsquashfs/describe.c
index 8c0fb16..0ac5cb6 100644
--- a/bin/rdsquashfs/describe.c
+++ b/bin/rdsquashfs/describe.c
@@ -6,7 +6,7 @@
*/
#include "rdsquashfs.h"
-static int print_name(const sqfs_tree_node_t *n, bool dont_escape)
+static int print_name(const sqfs_tree_node_t *n, bool source_path)
{
char *start, *ptr, *name;
int ret;
@@ -23,7 +23,23 @@ static int print_name(const sqfs_tree_node_t *n, bool dont_escape)
return -1;
}
- if (dont_escape || (strchr(name, ' ') == NULL &&
+#if defined(_WIN32) || defined(__WINDOWS__)
+ if (source_path) {
+ char *fixed = fix_win32_filename(name);
+ sqfs_free(name);
+
+ if (fixed == NULL) {
+ fputs(stderr, "out of memor!\n");
+ return -1;
+ }
+
+ fputs(fixed, stdout);
+ free(fixed);
+ return 0;
+ }
+#endif
+
+ if (source_path || (strchr(name, ' ') == NULL &&
strchr(name, '"') == NULL)) {
fputs(name, stdout);
} else {
diff --git a/bin/rdsquashfs/fill_files.c b/bin/rdsquashfs/fill_files.c
index 660ef1b..73b90e3 100644
--- a/bin/rdsquashfs/fill_files.c
+++ b/bin/rdsquashfs/fill_files.c
@@ -73,10 +73,8 @@ static int add_file(const sqfs_tree_node_t *node)
new_sz = max_files ? max_files * 2 : 256;
new = realloc(files, sizeof(files[0]) * new_sz);
- if (new == NULL) {
- perror("expanding file list");
- return -1;
- }
+ if (new == NULL)
+ goto fail_oom;
files = new;
max_files = new_sz;
@@ -94,10 +92,25 @@ static int add_file(const sqfs_tree_node_t *node)
return -1;
}
+#if defined(_WIN32) || defined(__WINDOWS__)
+ {
+ char *fixed = fix_win32_filename(path);
+ sqfs_free(path);
+
+ if (fixed == NULL)
+ goto fail_oom;
+
+ path = fixed;
+ }
+#endif
+
files[num_files].path = path;
files[num_files].inode = node->inode;
num_files++;
return 0;
+fail_oom:
+ fputs(stderr, "add_file: out of memor!\n");
+ return -1;
}
static void clear_file_list(void)
diff --git a/bin/rdsquashfs/restore_fstree.c b/bin/rdsquashfs/restore_fstree.c
index bfe5d86..0c68b3a 100644
--- a/bin/rdsquashfs/restore_fstree.c
+++ b/bin/rdsquashfs/restore_fstree.c
@@ -10,10 +10,18 @@
static int create_node(const sqfs_tree_node_t *n, const char *name, int flags)
{
WCHAR *wpath;
+ char *fixed;
HANDLE fh;
(void)flags;
- wpath = path_to_windows(name);
+ fixed = fix_win32_filename(name);
+ if (fixed == NULL) {
+ fputs("create_node: out of memory!\n", stderr);
+ return -1;
+ }
+
+ wpath = path_to_windows(fixed);
+ free(fixed);
if (wpath == NULL)
return -1;
@@ -243,6 +251,19 @@ static int set_attribs(sqfs_xattr_reader_t *xattr,
ret = canonicalize_name(path);
assert(ret == 0);
+#if defined(_WIN32) || defined(__WINDOWS__)
+ {
+ char *fixed = fix_win32_filename(path);
+ if (fixed == NULL) {
+ sqfs_perror(path, "fixing Windows path",
+ SQFS_ERROR_ALLOC);
+ sqfs_free(path);
+ return -1;
+ }
+ path = fixed;
+ }
+#endif
+
#ifdef HAVE_SYS_XATTR_H
if ((flags & UNPACK_SET_XATTR) && xattr != NULL) {
if (set_xattr(path, xattr, n))