summaryrefslogtreecommitdiff
path: root/malloc/beware_overflow
diff options
context:
space:
mode:
authorMartial Simon <msimon_fr@hotmail.com>2025-09-15 01:07:58 +0200
committerMartial Simon <msimon_fr@hotmail.com>2025-09-15 01:07:58 +0200
commit967be9e750221ab2ab783f95df79bb26d290a45e (patch)
tree6802900a5e975f9f68b169f0f503f040056d6952 /malloc/beware_overflow
add: added projectsHEADmain
Diffstat (limited to 'malloc/beware_overflow')
-rw-r--r--malloc/beware_overflow/beware_overflow.c10
-rw-r--r--malloc/beware_overflow/beware_overflow.h8
-rw-r--r--malloc/beware_overflow/main.c21
3 files changed, 39 insertions, 0 deletions
diff --git a/malloc/beware_overflow/beware_overflow.c b/malloc/beware_overflow/beware_overflow.c
new file mode 100644
index 0000000..4b2555c
--- /dev/null
+++ b/malloc/beware_overflow/beware_overflow.c
@@ -0,0 +1,10 @@
+#include "beware_overflow.h"
+
+void *beware_overflow(void *ptr, size_t nmemb, size_t size)
+{
+ size_t res;
+ if (__builtin_umull_overflow(nmemb, size, &res))
+ return NULL;
+ char *r = ptr;
+ return r + res;
+}
diff --git a/malloc/beware_overflow/beware_overflow.h b/malloc/beware_overflow/beware_overflow.h
new file mode 100644
index 0000000..821e81e
--- /dev/null
+++ b/malloc/beware_overflow/beware_overflow.h
@@ -0,0 +1,8 @@
+#ifndef BEWARE_OVERFLOW_H
+#define BEWARE_OVERFLOW_H
+
+#include <stddef.h>
+
+void *beware_overflow(void *ptr, size_t nmemb, size_t size);
+
+#endif /* BEWARE_OVERFLOW_H */
diff --git a/malloc/beware_overflow/main.c b/malloc/beware_overflow/main.c
new file mode 100644
index 0000000..42fd689
--- /dev/null
+++ b/malloc/beware_overflow/main.c
@@ -0,0 +1,21 @@
+#include <stddef.h>
+#include <stdio.h>
+
+#include "beware_overflow.h"
+
+void print_overflow(void *ptr, size_t nmemb, size_t size)
+{
+ void *begin = ptr;
+ void *res = beware_overflow(ptr, nmemb, size);
+ if (res)
+ printf("Pointer was incremented from %p to %p.\n", begin, res);
+ else
+ printf("Overflow detected between %ld and %ld.\n", nmemb, size);
+}
+
+int main(void)
+{
+ print_overflow((void *)0x1000, 25, 6);
+ print_overflow((void *)0x40000, 12345678904, 12345678904);
+ return 0;
+}