diff options
Diffstat (limited to 'lib/sqfs')
-rw-r--r-- | lib/sqfs/Makemodule.am | 5 | ||||
-rw-r--r-- | lib/sqfs/alloc.c | 37 | ||||
-rw-r--r-- | lib/sqfs/block_processor/internal.h | 2 | ||||
-rw-r--r-- | lib/sqfs/comp/internal.h | 2 | ||||
-rw-r--r-- | lib/sqfs/str_table.c | 174 | ||||
-rw-r--r-- | lib/sqfs/str_table.h | 51 | ||||
-rw-r--r-- | lib/sqfs/util.h | 31 |
7 files changed, 5 insertions, 297 deletions
diff --git a/lib/sqfs/Makemodule.am b/lib/sqfs/Makemodule.am index aada6c6..591eda2 100644 --- a/lib/sqfs/Makemodule.am +++ b/lib/sqfs/Makemodule.am @@ -24,8 +24,6 @@ libsquashfs_la_SOURCES += lib/sqfs/write_super.c lib/sqfs/data_reader.c libsquashfs_la_SOURCES += lib/sqfs/block_processor/internal.h libsquashfs_la_SOURCES += lib/sqfs/block_processor/common.c libsquashfs_la_SOURCES += lib/sqfs/block_processor/xxhash.c -libsquashfs_la_SOURCES += lib/sqfs/str_table.c lib/sqfs/str_table.h -libsquashfs_la_SOURCES += lib/sqfs/alloc.c lib/sqfs/util.h libsquashfs_la_SOURCES += lib/sqfs/frag_table.c include/sqfs/frag_table.h libsquashfs_la_SOURCES += lib/sqfs/block_writer.c include/sqfs/block_writer.h libsquashfs_la_CPPFLAGS = $(AM_CPPFLAGS) @@ -36,6 +34,9 @@ libsquashfs_la_CFLAGS += $(ZSTD_CFLAGS) $(PTHREAD_CFLAGS) libsquashfs_la_LIBADD = $(XZ_LIBS) $(ZLIB_LIBS) $(LZ4_LIBS) libsquashfs_la_LIBADD += $(ZSTD_LIBS) $(PTHREAD_LIBS) +# directly "import" stuff from libutil +libsquashfs_la_SOURCES += lib/util/str_table.c lib/util/alloc.c + if WINDOWS libsquashfs_la_SOURCES += lib/sqfs/win32/io_file.c libsquashfs_la_CFLAGS += -DWINVER=0x0600 -D_WIN32_WINNT=0x0600 diff --git a/lib/sqfs/alloc.c b/lib/sqfs/alloc.c deleted file mode 100644 index e8305d8..0000000 --- a/lib/sqfs/alloc.c +++ /dev/null @@ -1,37 +0,0 @@ -/* SPDX-License-Identifier: LGPL-3.0-or-later */ -/* - * alloc.c - * - * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at> - */ -#include "config.h" - -#include "util.h" - -#include <stdlib.h> -#include <errno.h> - -void *alloc_flex(size_t base_size, size_t item_size, size_t nmemb) -{ - size_t size; - - if (SZ_MUL_OV(nmemb, item_size, &size) || - SZ_ADD_OV(base_size, size, &size)) { - errno = EOVERFLOW; - return NULL; - } - - return calloc(1, size); -} - -void *alloc_array(size_t item_size, size_t nmemb) -{ - size_t size; - - if (SZ_MUL_OV(nmemb, item_size, &size)) { - errno = EOVERFLOW; - return NULL; - } - - return calloc(1, size); -} diff --git a/lib/sqfs/block_processor/internal.h b/lib/sqfs/block_processor/internal.h index fb9c4a0..03a8296 100644 --- a/lib/sqfs/block_processor/internal.h +++ b/lib/sqfs/block_processor/internal.h @@ -18,7 +18,7 @@ #include "sqfs/error.h" #include "sqfs/block.h" #include "sqfs/io.h" -#include "../util.h" +#include "util.h" #include <string.h> #include <stdlib.h> diff --git a/lib/sqfs/comp/internal.h b/lib/sqfs/comp/internal.h index c687d41..7518f56 100644 --- a/lib/sqfs/comp/internal.h +++ b/lib/sqfs/comp/internal.h @@ -14,7 +14,7 @@ #include "sqfs/error.h" #include "sqfs/block.h" #include "sqfs/io.h" -#include "../util.h" +#include "util.h" SQFS_INTERNAL int sqfs_generic_write_options(sqfs_file_t *file, const void *data, diff --git a/lib/sqfs/str_table.c b/lib/sqfs/str_table.c deleted file mode 100644 index c0a364f..0000000 --- a/lib/sqfs/str_table.c +++ /dev/null @@ -1,174 +0,0 @@ -/* SPDX-License-Identifier: LGPL-3.0-or-later */ -/* - * str_table.c - * - * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at> - */ -#include "config.h" - -#include <stdint.h> -#include <stdlib.h> -#include <string.h> - -#include "sqfs/error.h" -#include "str_table.h" -#include "util.h" - -/* R5 hash function (borrowed from reiserfs) */ -static sqfs_u32 strhash(const char *s) -{ - const signed char *str = (const signed char *)s; - sqfs_u32 a = 0; - - while (*str != '\0') { - a += *str << 4; - a += *str >> 4; - a *= 11; - str++; - } - - return a; -} - -static int strings_grow(str_table_t *table) -{ - size_t newsz; - void *new; - - if (table->num_strings < table->max_strings) - return 0; - - newsz = table->max_strings ? (table->max_strings * 2) : 16; - new = realloc(table->strings, sizeof(table->strings[0]) * newsz); - - if (new == NULL) - return SQFS_ERROR_ALLOC; - - table->strings = new; - table->max_strings = newsz; - return 0; -} - -int str_table_init(str_table_t *table, size_t size) -{ - memset(table, 0, sizeof(*table)); - - table->buckets = alloc_array(size, sizeof(table->buckets[0])); - table->num_buckets = size; - - if (table->buckets == NULL) - return SQFS_ERROR_ALLOC; - - return 0; -} - -void str_table_cleanup(str_table_t *table) -{ - str_bucket_t *bucket; - size_t i; - - for (i = 0; i < table->num_buckets; ++i) { - while (table->buckets[i] != NULL) { - bucket = table->buckets[i]; - table->buckets[i] = bucket->next; - - free(bucket->str); - free(bucket); - } - } - - free(table->buckets); - free(table->strings); - memset(table, 0, sizeof(*table)); -} - -int str_table_get_index(str_table_t *table, const char *str, size_t *idx) -{ - str_bucket_t *bucket; - sqfs_u32 hash; - size_t index; - int err; - - hash = strhash(str); - index = hash % table->num_buckets; - bucket = table->buckets[index]; - - while (bucket != NULL) { - if (strcmp(bucket->str, str) == 0) { - *idx = bucket->index; - return 0; - } - - bucket = bucket->next; - } - - err = strings_grow(table); - if (err) - return err; - - bucket = calloc(1, sizeof(*bucket)); - if (bucket == NULL) - goto fail_oom; - - bucket->str = strdup(str); - if (bucket->str == NULL) - goto fail_oom; - - bucket->index = table->num_strings; - table->strings[table->num_strings++] = bucket->str; - *idx = bucket->index; - - bucket->next = table->buckets[index]; - table->buckets[index] = bucket; - return 0; -fail_oom: - free(bucket); - return SQFS_ERROR_ALLOC; -} - -const char *str_table_get_string(str_table_t *table, size_t index) -{ - if (index >= table->num_strings) - return NULL; - - return table->strings[index]; -} - -static str_bucket_t *bucket_by_index(str_table_t *table, size_t index) -{ - str_bucket_t *bucket = NULL; - sqfs_u32 hash; - - if (index < table->num_strings) { - hash = strhash(table->strings[index]); - bucket = table->buckets[hash % table->num_buckets]; - - while (bucket != NULL && bucket->index != index) - bucket = bucket->next; - } - - return bucket; -} - -void str_table_add_ref(str_table_t *table, size_t index) -{ - str_bucket_t *bucket = bucket_by_index(table, index); - - if (bucket != NULL && bucket->refcount < ~((size_t)0)) - bucket->refcount += 1; -} - -void str_table_del_ref(str_table_t *table, size_t index) -{ - str_bucket_t *bucket = bucket_by_index(table, index); - - if (bucket != NULL && bucket->refcount > 0) - bucket->refcount -= 1; -} - -size_t str_table_get_ref_count(str_table_t *table, size_t index) -{ - str_bucket_t *bucket = bucket_by_index(table, index); - - return bucket != NULL ? bucket->refcount : 0; -} diff --git a/lib/sqfs/str_table.h b/lib/sqfs/str_table.h deleted file mode 100644 index 61f8aa5..0000000 --- a/lib/sqfs/str_table.h +++ /dev/null @@ -1,51 +0,0 @@ -/* SPDX-License-Identifier: LGPL-3.0-or-later */ -/* - * str_table.h - * - * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at> - */ -#ifndef STR_TABLE_H -#define STR_TABLE_H - -#include "sqfs/predef.h" - -typedef struct str_bucket_t { - struct str_bucket_t *next; - char *str; - size_t index; - size_t refcount; -} str_bucket_t; - -/* Stores strings in a hash table and assigns an incremental, unique ID to - each string. Subsequent additions return the existing ID. The ID can be - used for (hopefully) constant time lookup of the original string. */ -typedef struct { - str_bucket_t **buckets; - size_t num_buckets; - - char **strings; - size_t num_strings; - size_t max_strings; -} str_table_t; - -/* `size` is the number of hash table buckets to use internally. */ -SQFS_INTERNAL int str_table_init(str_table_t *table, size_t size); - -SQFS_INTERNAL void str_table_cleanup(str_table_t *table); - -/* Resolve a string to an incremental, unique ID. */ -SQFS_INTERNAL -int str_table_get_index(str_table_t *table, const char *str, size_t *idx); - -/* Resolve a unique ID to the string it represents. - Returns NULL if the ID is unknown, i.e. out of bounds. */ -SQFS_INTERNAL -const char *str_table_get_string(str_table_t *table, size_t index); - -SQFS_INTERNAL void str_table_add_ref(str_table_t *table, size_t index); - -SQFS_INTERNAL void str_table_del_ref(str_table_t *table, size_t index); - -SQFS_INTERNAL size_t str_table_get_ref_count(str_table_t *table, size_t index); - -#endif /* STR_TABLE_H */ diff --git a/lib/sqfs/util.h b/lib/sqfs/util.h deleted file mode 100644 index a379c0d..0000000 --- a/lib/sqfs/util.h +++ /dev/null @@ -1,31 +0,0 @@ -/* SPDX-License-Identifier: LGPL-3.0-or-later */ -/* - * util.h - * - * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at> - */ -#ifndef SQFS_UTIL_H -#define SQFS_UTIL_H - -#include "config.h" -#include "sqfs/predef.h" -#include "compat.h" - -#include <stddef.h> - -/* - Helper for allocating data structures with flexible array members. - - 'base_size' is the size of the struct itself, 'item_size' the size of a - single array element and 'nmemb' the number of elements. - - Iternally checks for arithmetic overflows when allocating the combined thing. - */ -SQFS_INTERNAL -void *alloc_flex(size_t base_size, size_t item_size, size_t nmemb); - -/* Basically the same as calloc, but *ALWAYS* does overflow checking */ -SQFS_INTERNAL -void *alloc_array(size_t item_size, size_t nmemb); - -#endif /* SQFS_UTIL_H */ |