summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/Makefile2
-rw-r--r--lib/birdlib.h13
-rw-r--r--lib/ip.c2
-rw-r--r--lib/ip.h4
-rw-r--r--lib/resource.h10
-rw-r--r--lib/string.h3
-rw-r--r--lib/strtoul.c61
7 files changed, 88 insertions, 7 deletions
diff --git a/lib/Makefile b/lib/Makefile
index 01f3114d..18816bb3 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -1,4 +1,4 @@
-src := bitops.c checksum.c event.c flowspec.c idm.c ip.c lists.c mac.c md5.c mempool.c net.c patmatch.c printf.c resource.c sha1.c sha256.c sha512.c slab.c slists.c tbf.c timer.c xmalloc.c
+src := bitops.c checksum.c event.c flowspec.c idm.c ip.c lists.c mac.c md5.c mempool.c net.c patmatch.c printf.c resource.c sha1.c sha256.c sha512.c slab.c slists.c strtoul.c tbf.c timer.c xmalloc.c
obj := $(src-o-files)
$(all-daemon)
diff --git a/lib/birdlib.h b/lib/birdlib.h
index 7cd78032..30ea433c 100644
--- a/lib/birdlib.h
+++ b/lib/birdlib.h
@@ -73,6 +73,10 @@ static inline int u64_cmp(u64 i1, u64 i2)
#define UNUSED __attribute__((unused))
#define PACKED __attribute__((packed))
+#ifndef HAVE_THREAD_LOCAL
+#define _Thread_local
+#endif
+
/* Microsecond time */
typedef s64 btime;
@@ -164,6 +168,15 @@ void debug(const char *msg, ...); /* Printf to debug output */
#define ASSERT(x) do { if (!(x)) log(L_BUG "Assertion '%s' failed at %s:%d", #x, __FILE__, __LINE__); } while(0)
#endif
+#ifdef DEBUGGING
+asm(
+ ".pushsection \".debug_gdb_scripts\", \"MS\",@progbits,1\n"
+ ".byte 1\n" /* Python */
+ ".asciz \"bird-gdb.py\"\n"
+ ".popsection\n"
+ );
+#endif
+
/* Pseudorandom numbers */
u32 random_u32(void);
diff --git a/lib/ip.c b/lib/ip.c
index 9497248c..2d195160 100644
--- a/lib/ip.c
+++ b/lib/ip.c
@@ -245,7 +245,7 @@ ip4_pton(const char *a, ip4_addr *o)
char *d, *c = strchr(a, '.');
if (!c != !i)
return 0;
- l = strtoul(a, &d, 10);
+ l = bstrtoul10(a, &d);
if (((d != c) && *d) || (l > 255))
return 0;
ia = (ia << 8) | l;
diff --git a/lib/ip.h b/lib/ip.h
index b78a5e22..945f2893 100644
--- a/lib/ip.h
+++ b/lib/ip.h
@@ -354,12 +354,12 @@ mpls_put(char *buf, int len, u32 *stack)
* Unaligned data access (in network order)
*/
-static inline ip4_addr get_ip4(void *buf)
+static inline ip4_addr get_ip4(const void *buf)
{
return _MI4(get_u32(buf));
}
-static inline ip6_addr get_ip6(void *buf)
+static inline ip6_addr get_ip6(const void *buf)
{
ip6_addr a;
memcpy(&a, buf, 16);
diff --git a/lib/resource.h b/lib/resource.h
index 91049b81..ad17d9ed 100644
--- a/lib/resource.h
+++ b/lib/resource.h
@@ -101,9 +101,13 @@ void buffer_realloc(void **buf, unsigned *size, unsigned need, unsigned item_siz
*/
#define DMALLOC_DISABLE
#include <dmalloc.h>
-#define xmalloc(size) dmalloc_malloc(__FILE__, __LINE__, (size), DMALLOC_FUNC_MALLOC, 0, 1)
-#define xrealloc(ptr, size) dmalloc_realloc(__FILE__, __LINE__, (ptr), (size), DMALLOC_FUNC_REALLOC, 1)
-#define xfree(ptr) dmalloc_free(__FILE__, __LINE__, (ptr), DMALLOC_FUNC_FREE)
+#define xmalloc(size) \
+ dmalloc_malloc(__FILE__, __LINE__, (size), DMALLOC_FUNC_MALLOC, 0, 1)
+#define xrealloc(ptr, size) \
+ dmalloc_realloc(__FILE__, __LINE__, (ptr), (size), DMALLOC_FUNC_REALLOC, 1)
+#define xfree(ptr) \
+ dmalloc_free(__FILE__, __LINE__, (ptr), DMALLOC_FUNC_FREE)
+
#else
/*
* Unfortunately, several libraries we might want to link to define
diff --git a/lib/string.h b/lib/string.h
index bd4fd2a0..d6ae5ef7 100644
--- a/lib/string.h
+++ b/lib/string.h
@@ -24,6 +24,9 @@ int buffer_vprint(buffer *buf, const char *fmt, va_list args);
int buffer_print(buffer *buf, const char *fmt, ...);
void buffer_puts(buffer *buf, const char *str);
+u64 bstrtoul10(const char *str, char **end);
+u64 bstrtoul16(const char *str, char **end);
+
int patmatch(const byte *pat, const byte *str);
static inline char *xbasename(const char *str)
diff --git a/lib/strtoul.c b/lib/strtoul.c
new file mode 100644
index 00000000..44a1bb1d
--- /dev/null
+++ b/lib/strtoul.c
@@ -0,0 +1,61 @@
+/*
+ * BIRD Library -- Parse numbers
+ *
+ * (c) 2019 Maria Matejka <mq@jmq.cz>
+ *
+ * Can be freely distributed and used under the terms of the GNU GPL.
+ */
+
+#include "nest/bird.h"
+#include "lib/string.h"
+
+#include <errno.h>
+
+#define ULI_MAX_DIV10 (UINT64_MAX / 10)
+#define ULI_MAX_MOD10 (UINT64_MAX % 10)
+
+u64
+bstrtoul10(const char *str, char **end)
+{
+ u64 out = 0;
+ for (*end = (char *) str; (**end >= '0') && (**end <= '9'); (*end)++) {
+ u64 digit = **end - '0';
+ if ((out > ULI_MAX_DIV10) ||
+ (out == ULI_MAX_DIV10) && (digit > ULI_MAX_MOD10)) {
+ errno = ERANGE;
+ return UINT64_MAX;
+ }
+
+ out *= 10;
+ out += (**end) - '0';
+ }
+ return out;
+}
+
+u64
+bstrtoul16(const char *str, char **end)
+{
+ u64 out = 0;
+ for (int i=0; i<=(64/4); i++) {
+ switch (str[i]) {
+ case '0' ... '9':
+ out *= 16;
+ out += str[i] - '0';
+ break;
+ case 'a' ... 'f':
+ out *= 16;
+ out += str[i] + 10 - 'a';
+ break;
+ case 'A' ... 'F':
+ out *= 16;
+ out += str[i] + 10 - 'A';
+ break;
+ default:
+ *end = (char *) &(str[i]);
+ return out;
+ }
+ }
+
+ errno = ERANGE;
+ return UINT64_MAX;
+}