]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
gmputil: assert length is non-zero
authorPablo Neira Ayuso <pablo@netfilter.org>
Wed, 14 Aug 2019 08:07:22 +0000 (10:07 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Wed, 14 Aug 2019 13:17:24 +0000 (15:17 +0200)
Importing, exporting and byteswapping zero length data should not
happen.

Use macro definition so we know from where the assertion is triggered in
the code for easier diagnosing in the future.

When importing datatype.h from gmputil.h, it seems gcc complains on
missing declarations in json.h.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
include/gmputil.h
include/json.h
src/gmputil.c

index ad63d67b4e059f5338fa0998c3941d5d10b6f06d..0cb85a7d07930f541772f289a656365e011b1e42 100644 (file)
@@ -52,12 +52,31 @@ extern uint32_t mpz_get_be32(const mpz_t op);
 extern uint16_t mpz_get_be16(const mpz_t op);
 
 enum byteorder;
-extern void *mpz_export_data(void *data, const mpz_t op,
-                            enum byteorder byteorder,
-                            unsigned int len);
-extern void mpz_import_data(mpz_t rop, const void *data,
-                           enum byteorder byteorder,
-                           unsigned int len);
-extern void mpz_switch_byteorder(mpz_t rop, unsigned int len);
+extern void *__mpz_export_data(void *data, const mpz_t op,
+                              enum byteorder byteorder, unsigned int len);
+extern void __mpz_import_data(mpz_t rop, const void *data,
+                             enum byteorder byteorder, unsigned int len);
+extern void __mpz_switch_byteorder(mpz_t rop, unsigned int len);
+
+#include <assert.h>
+#include <datatype.h>
+
+#define mpz_export_data(data, op, byteorder, len)              \
+{                                                              \
+       assert(len > 0);                                        \
+       __mpz_export_data(data, op, byteorder, len);            \
+}
+
+#define mpz_import_data(rop, data, byteorder, len)             \
+{                                                              \
+       assert(len > 0);                                        \
+       __mpz_import_data(rop, data, byteorder, len);           \
+}
+
+#define mpz_switch_byteorder(rop, len)                         \
+{                                                              \
+       assert(len > 0);                                        \
+       __mpz_switch_byteorder(rop, len);                       \
+}
 
 #endif /* NFTABLES_GMPUTIL_H */
index 7f2df7c8220f7e7d6f0bb4c9d57409d5e9b6915b..20d6c2a4a8e77784467612b77d1ff237931eda8c 100644 (file)
@@ -15,6 +15,10 @@ struct stmt;
 struct symbol_table;
 struct table;
 struct netlink_mon_handler;
+struct nft_ctx;
+struct location;
+struct output_ctx;
+struct list_head;
 
 #ifdef HAVE_LIBJANSSON
 
index a25f42ee2b64853f48e137b763a74ed2c9c3e56c..b356460fa739ca48ac421e0a4c4c35061d6e24ad 100644 (file)
@@ -87,9 +87,8 @@ uint16_t mpz_get_be16(const mpz_t op)
        return mpz_get_type(uint16_t, MPZ_BIG_ENDIAN, op);
 }
 
-void *mpz_export_data(void *data, const mpz_t op,
-                     enum byteorder byteorder,
-                     unsigned int len)
+void *__mpz_export_data(void *data, const mpz_t op, enum byteorder byteorder,
+                       unsigned int len)
 {
        enum mpz_word_order order;
        enum mpz_byte_order endian;
@@ -111,9 +110,8 @@ void *mpz_export_data(void *data, const mpz_t op,
        return data;
 }
 
-void mpz_import_data(mpz_t rop, const void *data,
-                    enum byteorder byteorder,
-                    unsigned int len)
+void __mpz_import_data(mpz_t rop, const void *data, enum byteorder byteorder,
+                      unsigned int len)
 {
        enum mpz_word_order order;
        enum mpz_byte_order endian;
@@ -133,12 +131,12 @@ void mpz_import_data(mpz_t rop, const void *data,
        mpz_import(rop, len, order, 1, endian, 0, data);
 }
 
-void mpz_switch_byteorder(mpz_t rop, unsigned int len)
+void __mpz_switch_byteorder(mpz_t rop, unsigned int len)
 {
        char data[len];
 
-       mpz_export_data(data, rop, BYTEORDER_BIG_ENDIAN, len);
-       mpz_import_data(rop, data, BYTEORDER_HOST_ENDIAN, len);
+       __mpz_export_data(data, rop, BYTEORDER_BIG_ENDIAN, len);
+       __mpz_import_data(rop, data, BYTEORDER_HOST_ENDIAN, len);
 }
 
 #ifndef HAVE_LIBGMP