93fd817536
It has become a common idiom in sbase to check strlcat() and strlcpy() using if (strl{cat, cpy}(dst, src, siz) >= siz) eprintf("path too long\n"); However, this was not carried out consistently and to this very day, some tools employed unchecked calls to these functions, effectively allowing silent truncations to happen, which in turn may lead to security issues. To finally put an end to this, the e*-functions detect truncation automatically and the caller can lean back and enjoy coding without trouble. :)
75 lines
2.0 KiB
C
75 lines
2.0 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 *erealloc(void *, size_t);
|
|
#undef reallocarray
|
|
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);
|
|
size_t estrlcat(char *, const char *, size_t);
|
|
#undef strlcpy
|
|
size_t strlcpy(char *, const char *, size_t);
|
|
size_t estrlcpy(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 *);
|
|
#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 *);
|