summaryrefslogtreecommitdiffstats
path: root/lib/mem.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/mem.c')
-rw-r--r--lib/mem.c143
1 files changed, 143 insertions, 0 deletions
diff --git a/lib/mem.c b/lib/mem.c
new file mode 100644
index 0000000..c6a78b1
--- /dev/null
+++ b/lib/mem.c
@@ -0,0 +1,143 @@
+/*
+ * Copyright (C) 2001-2012 Free Software Foundation, Inc.
+ *
+ * Author: Nikos Mavrogiannopoulos
+ *
+ * This file is part of GnuTLS.
+ *
+ * The GnuTLS is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>
+ *
+ */
+
+#include "gnutls_int.h"
+#include "errors.h"
+#include <num.h>
+#include "xalloc-oversized.h"
+
+gnutls_alloc_function gnutls_secure_malloc = malloc;
+gnutls_alloc_function gnutls_malloc = malloc;
+gnutls_free_function gnutls_free = free;
+gnutls_realloc_function gnutls_realloc = realloc;
+
+void *(*gnutls_calloc) (size_t, size_t) = calloc;
+char *(*gnutls_strdup) (const char *) = _gnutls_strdup;
+
+/* This realloc will free ptr in case realloc
+ * fails.
+ */
+void *gnutls_realloc_fast(void *ptr, size_t size)
+{
+ void *ret;
+
+ if (size == 0)
+ return ptr;
+
+ ret = gnutls_realloc(ptr, size);
+ if (ret == NULL) {
+ gnutls_free(ptr);
+ }
+
+ return ret;
+}
+
+/* This will free ptr in case reallocarray fails.
+ */
+void *_gnutls_reallocarray_fast(void *ptr, size_t nmemb, size_t size)
+{
+ void *ret;
+
+ if (size == 0)
+ return ptr;
+
+ ret = _gnutls_reallocarray(ptr, nmemb, size);
+ if (ret == NULL) {
+ gnutls_free(ptr);
+ }
+
+ return ret;
+}
+
+char *_gnutls_strdup(const char *str)
+{
+ size_t siz;
+ char *ret;
+
+ if(unlikely(!str))
+ return NULL;
+
+ siz = strlen(str) + 1;
+
+ ret = gnutls_malloc(siz);
+ if (ret != NULL)
+ memcpy(ret, str, siz);
+ return ret;
+}
+
+void *_gnutls_reallocarray(void *ptr, size_t nmemb, size_t size)
+{
+ return xalloc_oversized(nmemb, size) ? NULL :
+ gnutls_realloc(ptr, nmemb * size);
+}
+
+#if 0
+/* don't use them. They are included for documentation.
+ */
+
+/**
+ * gnutls_malloc:
+ * @s: size to allocate in bytes
+ *
+ * This function will allocate 's' bytes data, and
+ * return a pointer to memory. This function is supposed
+ * to be used by callbacks.
+ *
+ * The allocation function used is the one set by
+ * gnutls_global_set_mem_functions().
+ **/
+void *gnutls_malloc(size_t s)
+{
+ int x;
+}
+
+/**
+ * gnutls_free:
+ * @ptr: pointer to memory
+ *
+ * This function will free data pointed by ptr.
+ *
+ * The deallocation function used is the one set by
+ * gnutls_global_set_mem_functions().
+ *
+ **/
+void gnutls_free(void *ptr)
+{
+ int x;
+}
+
+#endif
+
+/* Returns 1 if the provided buffer is all zero.
+ * It leaks no information via timing.
+ */
+unsigned _gnutls_mem_is_zero(const uint8_t *ptr, unsigned size)
+{
+ unsigned i;
+ uint8_t res = 0;
+
+ for (i=0;i<size;i++) {
+ res |= ptr[i];
+ }
+
+ return ((res==0)?1:0);
+}