mirror of
git://anongit.mindrot.org/openssh.git
synced 2024-11-30 18:03:32 +08:00
ce324cf58b
Copying the given string into the buffer with strlcpy(3) confers no benefit in this context because we have already determined the string's length with strlen(3) in order to allocate that buffer. Thread: https://marc.info/?l=openbsd-tech&m=164687525802691&w=2 ok dtucker@ millert@ OpenBSD-Commit-ID: f8bfc082e36e2d2dc4e1feece02fe274155ca11a
119 lines
2.5 KiB
C
119 lines
2.5 KiB
C
/* $OpenBSD: xmalloc.c,v 1.37 2022/03/13 23:27:54 cheloha 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".
|
|
*/
|
|
|
|
#include "includes.h"
|
|
|
|
#include <stdarg.h>
|
|
#ifdef HAVE_STDINT_H
|
|
# include <stdint.h>
|
|
#endif
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#include "xmalloc.h"
|
|
#include "log.h"
|
|
|
|
#if defined(__OpenBSD__)
|
|
char *malloc_options = "S";
|
|
#endif /* __OpenBSD__ */
|
|
|
|
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 %zu bytes)", size);
|
|
return ptr;
|
|
}
|
|
|
|
void *
|
|
xcalloc(size_t nmemb, size_t size)
|
|
{
|
|
void *ptr;
|
|
|
|
if (size == 0 || nmemb == 0)
|
|
fatal("xcalloc: zero size");
|
|
if (SIZE_MAX / nmemb < size)
|
|
fatal("xcalloc: nmemb * size > SIZE_MAX");
|
|
ptr = calloc(nmemb, size);
|
|
if (ptr == NULL)
|
|
fatal("xcalloc: out of memory (allocating %zu bytes)",
|
|
size * nmemb);
|
|
return ptr;
|
|
}
|
|
|
|
void *
|
|
xreallocarray(void *ptr, size_t nmemb, size_t size)
|
|
{
|
|
void *new_ptr;
|
|
|
|
new_ptr = reallocarray(ptr, nmemb, size);
|
|
if (new_ptr == NULL)
|
|
fatal("xreallocarray: out of memory (%zu elements of %zu bytes)",
|
|
nmemb, size);
|
|
return new_ptr;
|
|
}
|
|
|
|
void *
|
|
xrecallocarray(void *ptr, size_t onmemb, size_t nmemb, size_t size)
|
|
{
|
|
void *new_ptr;
|
|
|
|
new_ptr = recallocarray(ptr, onmemb, nmemb, size);
|
|
if (new_ptr == NULL)
|
|
fatal("xrecallocarray: out of memory (%zu elements of %zu bytes)",
|
|
nmemb, size);
|
|
return new_ptr;
|
|
}
|
|
|
|
char *
|
|
xstrdup(const char *str)
|
|
{
|
|
size_t len;
|
|
char *cp;
|
|
|
|
len = strlen(str) + 1;
|
|
cp = xmalloc(len);
|
|
return memcpy(cp, str, len);
|
|
}
|
|
|
|
int
|
|
xvasprintf(char **ret, const char *fmt, va_list ap)
|
|
{
|
|
int i;
|
|
|
|
i = vasprintf(ret, fmt, ap);
|
|
if (i < 0 || *ret == NULL)
|
|
fatal("xvasprintf: could not allocate memory");
|
|
return i;
|
|
}
|
|
|
|
int
|
|
xasprintf(char **ret, const char *fmt, ...)
|
|
{
|
|
va_list ap;
|
|
int i;
|
|
|
|
va_start(ap, fmt);
|
|
i = xvasprintf(ret, fmt, ap);
|
|
va_end(ap);
|
|
return i;
|
|
}
|