summaryrefslogtreecommitdiff
path: root/lib/sqfs
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sqfs')
-rw-r--r--lib/sqfs/Makemodule.am1
-rw-r--r--lib/sqfs/alloc.c37
-rw-r--r--lib/sqfs/comp/internal.h2
-rw-r--r--lib/sqfs/data_reader.c2
-rw-r--r--lib/sqfs/data_writer/internal.h2
-rw-r--r--lib/sqfs/dir_reader.c2
-rw-r--r--lib/sqfs/dir_writer.c2
-rw-r--r--lib/sqfs/meta_reader.c2
-rw-r--r--lib/sqfs/meta_writer.c2
-rw-r--r--lib/sqfs/read_inode.c2
-rw-r--r--lib/sqfs/read_super.c2
-rw-r--r--lib/sqfs/read_table.c2
-rw-r--r--lib/sqfs/read_tree.c2
-rw-r--r--lib/sqfs/str_table.c2
-rw-r--r--lib/sqfs/util.h31
-rw-r--r--lib/sqfs/write_table.c2
-rw-r--r--lib/sqfs/xattr_reader.c2
-rw-r--r--lib/sqfs/xattr_writer.c2
18 files changed, 84 insertions, 15 deletions
diff --git a/lib/sqfs/Makemodule.am b/lib/sqfs/Makemodule.am
index be405cf..59cdbcb 100644
--- a/lib/sqfs/Makemodule.am
+++ b/lib/sqfs/Makemodule.am
@@ -24,6 +24,7 @@ libsquashfs_la_SOURCES += lib/sqfs/data_writer/internal.h lib/sqfs/data_reader.c
libsquashfs_la_SOURCES += lib/sqfs/data_writer/common.c
libsquashfs_la_SOURCES += lib/sqfs/data_writer/fileapi.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_CPPFLAGS = $(AM_CPPFLAGS)
libsquashfs_la_LDFLAGS = $(AM_LDFLAGS)
libsquashfs_la_CFLAGS = $(AM_CFLAGS) $(PTHREAD_CFLAGS) $(ZLIB_CFLAGS)
diff --git a/lib/sqfs/alloc.c b/lib/sqfs/alloc.c
new file mode 100644
index 0000000..e8305d8
--- /dev/null
+++ b/lib/sqfs/alloc.c
@@ -0,0 +1,37 @@
+/* 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/comp/internal.h b/lib/sqfs/comp/internal.h
index dabf1a6..c687d41 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/util.h"
+#include "../util.h"
SQFS_INTERNAL
int sqfs_generic_write_options(sqfs_file_t *file, const void *data,
diff --git a/lib/sqfs/data_reader.c b/lib/sqfs/data_reader.c
index b105096..6a0db35 100644
--- a/lib/sqfs/data_reader.c
+++ b/lib/sqfs/data_reader.c
@@ -14,7 +14,7 @@
#include "sqfs/table.h"
#include "sqfs/inode.h"
#include "sqfs/io.h"
-#include "util/util.h"
+#include "util.h"
#include <stdlib.h>
#include <string.h>
diff --git a/lib/sqfs/data_writer/internal.h b/lib/sqfs/data_writer/internal.h
index 9c64b6c..d6e26cd 100644
--- a/lib/sqfs/data_writer/internal.h
+++ b/lib/sqfs/data_writer/internal.h
@@ -16,7 +16,7 @@
#include "sqfs/error.h"
#include "sqfs/block.h"
#include "sqfs/io.h"
-#include "util/util.h"
+#include "../util.h"
#include <string.h>
#include <stdlib.h>
diff --git a/lib/sqfs/dir_reader.c b/lib/sqfs/dir_reader.c
index bae24d5..bda7d7a 100644
--- a/lib/sqfs/dir_reader.c
+++ b/lib/sqfs/dir_reader.c
@@ -14,7 +14,7 @@
#include "sqfs/inode.h"
#include "sqfs/error.h"
#include "sqfs/dir.h"
-#include "util/util.h"
+#include "util.h"
#include <string.h>
#include <stdlib.h>
diff --git a/lib/sqfs/dir_writer.c b/lib/sqfs/dir_writer.c
index 673c103..bdd5dd1 100644
--- a/lib/sqfs/dir_writer.c
+++ b/lib/sqfs/dir_writer.c
@@ -13,7 +13,7 @@
#include "sqfs/error.h"
#include "sqfs/block.h"
#include "sqfs/dir.h"
-#include "util/util.h"
+#include "util.h"
#include <stdlib.h>
#include <string.h>
diff --git a/lib/sqfs/meta_reader.c b/lib/sqfs/meta_reader.c
index 0b8b33a..19e856a 100644
--- a/lib/sqfs/meta_reader.c
+++ b/lib/sqfs/meta_reader.c
@@ -12,7 +12,7 @@
#include "sqfs/error.h"
#include "sqfs/block.h"
#include "sqfs/io.h"
-#include "util/util.h"
+#include "util.h"
#include <stdlib.h>
#include <string.h>
diff --git a/lib/sqfs/meta_writer.c b/lib/sqfs/meta_writer.c
index cdd34e8..acb2235 100644
--- a/lib/sqfs/meta_writer.c
+++ b/lib/sqfs/meta_writer.c
@@ -12,7 +12,7 @@
#include "sqfs/error.h"
#include "sqfs/block.h"
#include "sqfs/io.h"
-#include "util/util.h"
+#include "util.h"
#include <string.h>
#include <stdlib.h>
diff --git a/lib/sqfs/read_inode.c b/lib/sqfs/read_inode.c
index fa3ec31..11d7a1c 100644
--- a/lib/sqfs/read_inode.c
+++ b/lib/sqfs/read_inode.c
@@ -12,7 +12,7 @@
#include "sqfs/super.h"
#include "sqfs/inode.h"
#include "sqfs/dir.h"
-#include "util/util.h"
+#include "util.h"
#include <stdlib.h>
#include <string.h>
diff --git a/lib/sqfs/read_super.c b/lib/sqfs/read_super.c
index f5cc988..8b3f019 100644
--- a/lib/sqfs/read_super.c
+++ b/lib/sqfs/read_super.c
@@ -10,7 +10,7 @@
#include "sqfs/super.h"
#include "sqfs/error.h"
#include "sqfs/io.h"
-#include "util/util.h"
+#include "util.h"
#include <string.h>
diff --git a/lib/sqfs/read_table.c b/lib/sqfs/read_table.c
index 747c8bc..096ac1a 100644
--- a/lib/sqfs/read_table.c
+++ b/lib/sqfs/read_table.c
@@ -12,7 +12,7 @@
#include "sqfs/table.h"
#include "sqfs/block.h"
#include "sqfs/io.h"
-#include "util/util.h"
+#include "util.h"
#include <stdlib.h>
diff --git a/lib/sqfs/read_tree.c b/lib/sqfs/read_tree.c
index eaf7c16..5464595 100644
--- a/lib/sqfs/read_tree.c
+++ b/lib/sqfs/read_tree.c
@@ -15,7 +15,7 @@
#include "sqfs/inode.h"
#include "sqfs/error.h"
#include "sqfs/dir.h"
-#include "util/util.h"
+#include "util.h"
#include <string.h>
#include <stdlib.h>
diff --git a/lib/sqfs/str_table.c b/lib/sqfs/str_table.c
index 1ec0ef7..c0a364f 100644
--- a/lib/sqfs/str_table.c
+++ b/lib/sqfs/str_table.c
@@ -11,8 +11,8 @@
#include <string.h>
#include "sqfs/error.h"
-#include "util/util.h"
#include "str_table.h"
+#include "util.h"
/* R5 hash function (borrowed from reiserfs) */
static sqfs_u32 strhash(const char *s)
diff --git a/lib/sqfs/util.h b/lib/sqfs/util.h
new file mode 100644
index 0000000..a379c0d
--- /dev/null
+++ b/lib/sqfs/util.h
@@ -0,0 +1,31 @@
+/* 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 */
diff --git a/lib/sqfs/write_table.c b/lib/sqfs/write_table.c
index b8946a5..1931b83 100644
--- a/lib/sqfs/write_table.c
+++ b/lib/sqfs/write_table.c
@@ -13,7 +13,7 @@
#include "sqfs/table.h"
#include "sqfs/block.h"
#include "sqfs/io.h"
-#include "util/util.h"
+#include "util.h"
#include <stdlib.h>
diff --git a/lib/sqfs/xattr_reader.c b/lib/sqfs/xattr_reader.c
index 250b4bd..d5b003b 100644
--- a/lib/sqfs/xattr_reader.c
+++ b/lib/sqfs/xattr_reader.c
@@ -14,7 +14,7 @@
#include "sqfs/error.h"
#include "sqfs/block.h"
#include "sqfs/io.h"
-#include "util/util.h"
+#include "util.h"
#include <stdlib.h>
#include <string.h>
diff --git a/lib/sqfs/xattr_writer.c b/lib/sqfs/xattr_writer.c
index 2e6a074..047e411 100644
--- a/lib/sqfs/xattr_writer.c
+++ b/lib/sqfs/xattr_writer.c
@@ -15,8 +15,8 @@
#include "sqfs/block.h"
#include "sqfs/io.h"
-#include "util/util.h"
#include "str_table.h"
+#include "util.h"
#include <stdlib.h>
#include <string.h>