-let's not introduce stdbool shortly before the release
[oweals/gnunet.git] / src / util / common_allocation.c
index 1828d826a5a24a4355f92b0b6dd528adc6219f83..b5473671bb41c64e8de432aa1d43e1fa9609a948 100644 (file)
@@ -4,7 +4,7 @@
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
-     by the Free Software Foundation; either version 2, or (at your
+     by the Free Software Foundation; either version 3, or (at your
      option) any later version.
 
      GNUnet is distributed in the hope that it will be useful, but
      option) any later version.
 
      GNUnet is distributed in the hope that it will be useful, but
@@ -24,7 +24,7 @@
  * @author Christian Grothoff
  */
 #include "platform.h"
  * @author Christian Grothoff
  */
 #include "platform.h"
-#include "gnunet_common.h"
+#include "gnunet_util_lib.h"
 #if HAVE_MALLOC_H
 #include <malloc.h>
 #endif
 #if HAVE_MALLOC_H
 #include <malloc.h>
 #endif
@@ -197,6 +197,9 @@ GNUNET_xrealloc_ (void *ptr, size_t n, const char *filename, int linenumber)
 #if WINDOWS
 #define M_SIZE(p) _msize (p)
 #endif
 #if WINDOWS
 #define M_SIZE(p) _msize (p)
 #endif
+#ifdef FREEBSD
+#include <malloc_np.h>
+#endif
 #if HAVE_MALLOC_USABLE_SIZE
 #define M_SIZE(p) malloc_usable_size (p)
 #elif HAVE_MALLOC_SIZE
 #if HAVE_MALLOC_USABLE_SIZE
 #define M_SIZE(p) malloc_usable_size (p)
 #elif HAVE_MALLOC_SIZE
@@ -224,9 +227,9 @@ GNUNET_xfree_ (void *ptr, const char *filename, int linenumber)
   {
     const uint64_t baadfood = GNUNET_ntohll (0xBAADF00DBAADF00DLL);
     uint64_t *base = ptr;
   {
     const uint64_t baadfood = GNUNET_ntohll (0xBAADF00DBAADF00DLL);
     uint64_t *base = ptr;
-    size_t s = M_SIZE (ptr);  
+    size_t s = M_SIZE (ptr);
     size_t i;
     size_t i;
-    
+
     for (i=0;i<s/8;i++)
       base[i] = baadfood;
     memcpy (&base[s/8], &baadfood, s % 8);
     for (i=0;i<s/8;i++)
       base[i] = baadfood;
     memcpy (&base[s/8], &baadfood, s % 8);
@@ -256,6 +259,21 @@ GNUNET_xstrdup_ (const char *str, const char *filename, int linenumber)
 }
 
 
 }
 
 
+#if ! HAVE_STRNLEN
+static size_t
+strnlen (const char *s,
+        size_t n)
+{
+  const char *e;
+
+  e = memchr (s, '\0', n);
+  if (NULL == e)
+    return n;
+  return e - s;
+}
+#endif
+
+
 /**
  * Dup partially a string (same semantics as strndup).
  *
 /**
  * Dup partially a string (same semantics as strndup).
  *
@@ -271,8 +289,10 @@ GNUNET_xstrndup_ (const char *str, size_t len, const char *filename,
 {
   char *res;
 
 {
   char *res;
 
+  if (0 == len)
+    return GNUNET_strdup ("");
   GNUNET_assert_at (str != NULL, filename, linenumber);
   GNUNET_assert_at (str != NULL, filename, linenumber);
-  len = GNUNET_MIN (len, strlen (str));
+  len = strnlen (str, len);
   res = GNUNET_xmalloc_ (len + 1, filename, linenumber);
   memcpy (res, str, len);
   /* res[len] = '\0'; 'malloc' zeros out anyway */
   res = GNUNET_xmalloc_ (len + 1, filename, linenumber);
   memcpy (res, str, len);
   /* res[len] = '\0'; 'malloc' zeros out anyway */