]> andersk Git - openssh.git/blobdiff - xmalloc.c
- djm@cvs.openbsd.org 2010/01/30 02:54:53
[openssh.git] / xmalloc.c
index 4a8d190c654a44885b11a4c5a0eeaf8f32357516..9985b4cc2a3494cc89c1c6e3242b95de88712246 100644 (file)
--- a/xmalloc.c
+++ b/xmalloc.c
+/* $OpenBSD: xmalloc.c,v 1.27 2006/08/03 03:34:42 deraadt Exp $ */
 /*
+ * Author: Tatu Ylonen <ylo@cs.hut.fi>
+ * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
+ *                    All rights reserved
+ * Versions of malloc and friends that check their results, and never return
+ * failure (they call fatal if they encounter an error).
+ *
+ * As far as I am concerned, the code I have written for this software
+ * can be used freely for any purpose.  Any derived versions of this
+ * software must be clearly marked as such, and if the derived work is
+ * incompatible with the protocol description in the RFC file, it must be
+ * called by a name other than "ssh" or "Secure Shell".
+ */
 
-xmalloc.c
-
-Author: Tatu Ylonen <ylo@cs.hut.fi>
+#include "includes.h"
 
-Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
-                   All rights reserved
+#include <sys/param.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
 
-Created: Mon Mar 20 21:23:10 1995 ylo
+#include "xmalloc.h"
+#include "log.h"
 
-Versions of malloc and friends that check their results, and never return
-failure (they call fatal if they encounter an error).
+void *
+xmalloc(size_t size)
+{
+       void *ptr;
 
-*/
+       if (size == 0)
+               fatal("xmalloc: zero size");
+       ptr = malloc(size);
+       if (ptr == NULL)
+               fatal("xmalloc: out of memory (allocating %lu bytes)", (u_long) size);
+       return ptr;
+}
 
-#include "includes.h"
-RCSID("$Id$");
+void *
+xcalloc(size_t nmemb, size_t size)
+{
+       void *ptr;
 
-#include "ssh.h"
+       if (size == 0 || nmemb == 0)
+               fatal("xcalloc: zero size");
+       if (SIZE_T_MAX / nmemb < size)
+               fatal("xcalloc: nmemb * size > SIZE_T_MAX");
+       ptr = calloc(nmemb, size);
+       if (ptr == NULL)
+               fatal("xcalloc: out of memory (allocating %lu bytes)",
+                   (u_long)(size * nmemb));
+       return ptr;
+}
 
-void *xmalloc(size_t size)
+void *
+xrealloc(void *ptr, size_t nmemb, size_t size)
 {
-  void *ptr = malloc(size);
-  if (ptr == NULL)
-    fatal("xmalloc: out of memory (allocating %d bytes)", (int)size);
-  return ptr;
+       void *new_ptr;
+       size_t new_size = nmemb * size;
+
+       if (new_size == 0)
+               fatal("xrealloc: zero size");
+       if (SIZE_T_MAX / nmemb < size)
+               fatal("xrealloc: nmemb * size > SIZE_T_MAX");
+       if (ptr == NULL)
+               new_ptr = malloc(new_size);
+       else
+               new_ptr = realloc(ptr, new_size);
+       if (new_ptr == NULL)
+               fatal("xrealloc: out of memory (new_size %lu bytes)",
+                   (u_long) new_size);
+       return new_ptr;
 }
 
-void *xrealloc(void *ptr, size_t new_size)
+void
+xfree(void *ptr)
 {
-  void *new_ptr;
-
-  if (ptr == NULL)
-    fatal("xrealloc: NULL pointer given as argument");
-  new_ptr = realloc(ptr, new_size);
-  if (new_ptr == NULL)
-    fatal("xrealloc: out of memory (new_size %d bytes)", (int)new_size);
-  return new_ptr;
+       if (ptr == NULL)
+               fatal("xfree: NULL pointer given as argument");
+       free(ptr);
 }
 
-void xfree(void *ptr)
+char *
+xstrdup(const char *str)
 {
-  if (ptr == NULL)
-    fatal("xfree: NULL pointer given as argument");
-  free(ptr);
+       size_t len;
+       char *cp;
+
+       len = strlen(str) + 1;
+       cp = xmalloc(len);
+       strlcpy(cp, str, len);
+       return cp;
 }
 
-char *xstrdup(const char *str)
+int
+xasprintf(char **ret, const char *fmt, ...)
 {
-  int len = strlen(str) + 1;
+       va_list ap;
+       int i;
+
+       va_start(ap, fmt);
+       i = vasprintf(ret, fmt, ap);
+       va_end(ap);
+
+       if (i < 0 || *ret == NULL)
+               fatal("xasprintf: could not allocate memory");
 
-  char *cp = xmalloc(len);
-  strlcpy(cp, str, len);
-  return cp;
+       return (i);
 }
This page took 0.042805 seconds and 4 git commands to generate.