3c33abc520
A function used only in the OpenBSD-Kernel as of now, but it surely provides a helpful interface when you just don't want to make sure the incoming pointer to erealloc() is really NULL so it behaves like malloc, making it a bit more safer. Talking about *allocarray(): It's definitely a major step in code- hardening. Especially as a system administrator, you should be able to trust your core tools without having to worry about segfaults like this, which can easily lead to privilege escalation. How do the GNU coreutils handle this? $ strings -n 4611686018427387903 strings: invalid minimum string length -1 $ strings -n 4611686018427387904 strings: invalid minimum string length 0 They silently overflow... In comparison, sbase: $ strings -n 4611686018427387903 mallocarray: out of memory $ strings -n 4611686018427387904 mallocarray: out of memory The first out of memory is actually a true OOM returned by malloc, whereas the second one is a detected overflow, which is not marked in a special way. Now tell me which diagnostic error-messages are easier to understand.
76 lines
2.1 KiB
C
76 lines
2.1 KiB
C
/* See LICENSE file for copyright and license details. */
|
|
#include <sys/types.h>
|
|
|
|
#include <regex.h>
|
|
#include <stddef.h>
|
|
|
|
#include "arg.h"
|
|
#include "compat.h"
|
|
|
|
#define UTF8_POINT(c) (((c) & 0xc0) != 0x80)
|
|
|
|
#undef MIN
|
|
#define MIN(x,y) ((x) < (y) ? (x) : (y))
|
|
#undef MAX
|
|
#define MAX(x,y) ((x) > (y) ? (x) : (y))
|
|
#undef LIMIT
|
|
#define LIMIT(x, a, b) (x) = (x) < (a) ? (a) : (x) > (b) ? (b) : (x)
|
|
|
|
#define LEN(x) (sizeof (x) / sizeof *(x))
|
|
|
|
extern char *argv0;
|
|
|
|
char *agetcwd(void);
|
|
void apathmax(char **, size_t *);
|
|
|
|
void *ecalloc(size_t, size_t);
|
|
void *emalloc(size_t);
|
|
void *mallocarray(size_t, size_t);
|
|
void *emallocarray(size_t, size_t);
|
|
void *erealloc(void *, size_t);
|
|
void *reallocarray(void *, size_t, size_t);
|
|
void *ereallocarray(void *, size_t, size_t);
|
|
char *estrdup(const char *);
|
|
char *estrndup(const char *, size_t);
|
|
void *encalloc(int, size_t, size_t);
|
|
void *enmalloc(int, size_t);
|
|
void *enrealloc(int, void *, size_t);
|
|
char *enstrdup(int, const char *);
|
|
char *enstrndup(int, const char *, size_t);
|
|
|
|
void enprintf(int, const char *, ...);
|
|
void eprintf(const char *, ...);
|
|
void weprintf(const char *, ...);
|
|
|
|
double estrtod(const char *);
|
|
|
|
#undef strcasestr
|
|
char *strcasestr(const char *, const char *);
|
|
|
|
#undef strlcat
|
|
size_t strlcat(char *, const char *, size_t);
|
|
#undef strlcpy
|
|
size_t strlcpy(char *, const char *, size_t);
|
|
|
|
#undef strsep
|
|
char *strsep(char **, const char *);
|
|
|
|
/* regex */
|
|
int enregcomp(int, regex_t *, const char *, int);
|
|
int eregcomp(regex_t *, const char *, int);
|
|
|
|
/* misc */
|
|
void enmasse(int, char **, int (*)(const char *, const char *, int));
|
|
void fnck(const char *, const char *, int (*)(const char *, const char *, int), int);
|
|
mode_t getumask(void);
|
|
char *humansize(double);
|
|
mode_t parsemode(const char *, mode_t, mode_t);
|
|
void putword(const char *);
|
|
extern int recurse_follow;
|
|
void recurse(const char *, void (*)(const char *, int), int);
|
|
#undef strtonum
|
|
long long strtonum(const char *, long long, long long, const char **);
|
|
long long enstrtonum(int, const char *, long long, long long);
|
|
long long estrtonum(const char *, long long, long long);
|
|
size_t unescape(char *);
|