From 043495538ebaf02adba6d40764fb3e6def65cb09 Mon Sep 17 00:00:00 2001 From: David Oberhollenzer Date: Mon, 12 Jun 2023 22:00:02 +0200 Subject: libsquashfs: Add a get_filename function to sqfs_file_t Similar to the sqfs_istream_t & sqfs_ostream_t interfaces. Signed-off-by: David Oberhollenzer --- lib/sqfs/src/unix/io_file.c | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) (limited to 'lib/sqfs/src/unix') diff --git a/lib/sqfs/src/unix/io_file.c b/lib/sqfs/src/unix/io_file.c index e1fb9db..886f752 100644 --- a/lib/sqfs/src/unix/io_file.c +++ b/lib/sqfs/src/unix/io_file.c @@ -9,6 +9,7 @@ #include "sqfs/io.h" #include "sqfs/error.h" +#include "compat.h" #include #include @@ -24,6 +25,8 @@ typedef struct { bool readonly; sqfs_u64 size; int fd; + + char name[]; } sqfs_file_stdio_t; @@ -39,6 +42,7 @@ static sqfs_object_t *stdio_copy(const sqfs_object_t *base) { const sqfs_file_stdio_t *file = (const sqfs_file_stdio_t *)base; sqfs_file_stdio_t *copy; + size_t size; int err; if (!file->readonly) { @@ -46,11 +50,12 @@ static sqfs_object_t *stdio_copy(const sqfs_object_t *base) return NULL; } - copy = calloc(1, sizeof(*copy)); + size = sizeof(*file) + strlen(file->name) + 1; + copy = calloc(1, size); if (copy == NULL) return NULL; - memcpy(copy, file, sizeof(*file)); + memcpy(copy, file, size); copy->fd = dup(file->fd); if (copy->fd < 0) { @@ -136,10 +141,15 @@ static int stdio_truncate(sqfs_file_t *base, sqfs_u64 size) return 0; } +static const char *stdio_get_filename(sqfs_file_t *file) +{ + return ((sqfs_file_stdio_t *)file)->name; +} sqfs_file_t *sqfs_open_file(const char *filename, sqfs_u32 flags) { sqfs_file_stdio_t *file; + size_t size, namelen; int open_mode, temp; sqfs_file_t *base; struct stat sb; @@ -149,12 +159,21 @@ sqfs_file_t *sqfs_open_file(const char *filename, sqfs_u32 flags) return NULL; } - file = calloc(1, sizeof(*file)); + namelen = strlen(filename); + size = sizeof(*file) + 1; + + if (SZ_ADD_OV(size, namelen, &size)) { + errno = EOVERFLOW; + return NULL; + } + + file = calloc(1, size); base = (sqfs_file_t *)file; if (file == NULL) return NULL; sqfs_object_init(file, stdio_destroy, stdio_copy); + memcpy(file->name, filename, namelen); if (flags & SQFS_FILE_OPEN_READ_ONLY) { file->readonly = true; @@ -192,5 +211,6 @@ sqfs_file_t *sqfs_open_file(const char *filename, sqfs_u32 flags) base->write_at = stdio_write_at; base->get_size = stdio_get_size; base->truncate = stdio_truncate; + base->get_filename = stdio_get_filename; return base; } -- cgit v1.2.3