Merge pull request #24933 from keszybz/erradicate-strerror
Erradicate strerror
This commit is contained in:
+19
-5
@@ -6,6 +6,21 @@
|
||||
|
||||
#include "macro.h"
|
||||
|
||||
/* strerror(3) says that glibc uses a maximum length of 1024 bytes. */
|
||||
#define ERRNO_BUF_LEN 1024
|
||||
|
||||
/* Note: the lifetime of the compound literal is the immediately surrounding block,
|
||||
* see C11 §6.5.2.5, and
|
||||
* https://stackoverflow.com/questions/34880638/compound-literal-lifetime-and-if-blocks
|
||||
*
|
||||
* Note that we use the GNU variant of strerror_r() here. */
|
||||
#define STRERROR(errnum) strerror_r(abs(errnum), (char[ERRNO_BUF_LEN]){}, ERRNO_BUF_LEN)
|
||||
|
||||
/* A helper to print an error message or message for functions that return 0 on EOF.
|
||||
* Note that we can't use ({ … }) to define a temporary variable, so errnum is
|
||||
* evaluated twice. */
|
||||
#define STRERROR_OR_EOF(errnum) ((errnum) != 0 ? STRERROR(errnum) : "Unexpected EOF")
|
||||
|
||||
static inline void _reset_errno_(int *saved_errno) {
|
||||
if (*saved_errno < 0) /* Invalidated by UNPROTECT_ERRNO? */
|
||||
return;
|
||||
@@ -22,6 +37,10 @@ static inline void _reset_errno_(int *saved_errno) {
|
||||
_saved_errno_ = -1; \
|
||||
} while (false)
|
||||
|
||||
#define LOCAL_ERRNO(value) \
|
||||
PROTECT_ERRNO; \
|
||||
errno = abs(value)
|
||||
|
||||
static inline int negative_errno(void) {
|
||||
/* This helper should be used to shut up gcc if you know 'errno' is
|
||||
* negative. Instead of "return -errno;", use "return negative_errno();"
|
||||
@@ -54,11 +73,6 @@ static inline int RET_NERRNO(int ret) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline const char *strerror_safe(int error) {
|
||||
/* 'safe' here does NOT mean thread safety. */
|
||||
return strerror(abs(error)); /* lgtm [cpp/potentially-dangerous-function] */
|
||||
}
|
||||
|
||||
static inline int errno_or_else(int fallback) {
|
||||
/* To be used when invoking library calls where errno handling is not defined clearly: we return
|
||||
* errno if it is set, and the specified error otherwise. The idea is that the caller initializes
|
||||
|
||||
@@ -66,7 +66,7 @@ bool in4_addr_is_link_local_dynamic(const struct in_addr *a) {
|
||||
bool in6_addr_is_link_local(const struct in6_addr *a) {
|
||||
assert(a);
|
||||
|
||||
return IN6_IS_ADDR_LINKLOCAL(a); /* lgtm [cpp/potentially-dangerous-function] */
|
||||
return IN6_IS_ADDR_LINKLOCAL(a);
|
||||
}
|
||||
|
||||
int in_addr_is_link_local(int family, const union in_addr_union *u) {
|
||||
@@ -131,7 +131,7 @@ int in_addr_is_localhost(int family, const union in_addr_union *u) {
|
||||
return in4_addr_is_localhost(&u->in);
|
||||
|
||||
if (family == AF_INET6)
|
||||
return IN6_IS_ADDR_LOOPBACK(&u->in6); /* lgtm [cpp/potentially-dangerous-function] */
|
||||
return IN6_IS_ADDR_LOOPBACK(&u->in6);
|
||||
|
||||
return -EAFNOSUPPORT;
|
||||
}
|
||||
@@ -144,7 +144,7 @@ int in_addr_is_localhost_one(int family, const union in_addr_union *u) {
|
||||
return be32toh(u->in.s_addr) == UINT32_C(0x7F000001);
|
||||
|
||||
if (family == AF_INET6)
|
||||
return IN6_IS_ADDR_LOOPBACK(&u->in6); /* lgtm [cpp/potentially-dangerous-function] */
|
||||
return IN6_IS_ADDR_LOOPBACK(&u->in6);
|
||||
|
||||
return -EAFNOSUPPORT;
|
||||
}
|
||||
@@ -194,8 +194,7 @@ int in_addr_prefix_intersect(
|
||||
assert(a);
|
||||
assert(b);
|
||||
|
||||
/* Checks whether there are any addresses that are in both
|
||||
* networks */
|
||||
/* Checks whether there are any addresses that are in both networks */
|
||||
|
||||
m = MIN(aprefixlen, bprefixlen);
|
||||
|
||||
@@ -203,7 +202,7 @@ int in_addr_prefix_intersect(
|
||||
uint32_t x, nm;
|
||||
|
||||
x = be32toh(a->in.s_addr ^ b->in.s_addr);
|
||||
nm = (m == 0) ? 0 : 0xFFFFFFFFUL << (32 - m);
|
||||
nm = m == 0 ? 0 : 0xFFFFFFFFUL << (32 - m);
|
||||
|
||||
return (x & nm) == 0;
|
||||
}
|
||||
|
||||
+9
-11
@@ -732,14 +732,12 @@ int log_internalv(
|
||||
const char *format,
|
||||
va_list ap) {
|
||||
|
||||
char buffer[LINE_MAX];
|
||||
PROTECT_ERRNO;
|
||||
|
||||
if (_likely_(LOG_PRI(level) > log_max_level))
|
||||
return -ERRNO_VALUE(error);
|
||||
|
||||
/* Make sure that %m maps to the specified error (or "Success"). */
|
||||
errno = ERRNO_VALUE(error);
|
||||
char buffer[LINE_MAX];
|
||||
LOCAL_ERRNO(ERRNO_VALUE(error));
|
||||
|
||||
(void) vsnprintf(buffer, sizeof buffer, format, ap);
|
||||
|
||||
@@ -777,14 +775,13 @@ int log_object_internalv(
|
||||
const char *format,
|
||||
va_list ap) {
|
||||
|
||||
PROTECT_ERRNO;
|
||||
char *buffer, *b;
|
||||
|
||||
if (_likely_(LOG_PRI(level) > log_max_level))
|
||||
return -ERRNO_VALUE(error);
|
||||
|
||||
/* Make sure that %m maps to the specified error (or "Success"). */
|
||||
errno = ERRNO_VALUE(error);
|
||||
LOCAL_ERRNO(ERRNO_VALUE(error));
|
||||
|
||||
/* Prepend the object name before the message */
|
||||
if (object) {
|
||||
@@ -1341,18 +1338,19 @@ int log_syntax_internal(
|
||||
const char *func,
|
||||
const char *format, ...) {
|
||||
|
||||
PROTECT_ERRNO;
|
||||
|
||||
if (log_syntax_callback)
|
||||
log_syntax_callback(unit, level, log_syntax_callback_userdata);
|
||||
|
||||
PROTECT_ERRNO;
|
||||
char buffer[LINE_MAX];
|
||||
va_list ap;
|
||||
const char *unit_fmt = NULL;
|
||||
|
||||
if (_likely_(LOG_PRI(level) > log_max_level) ||
|
||||
log_target == LOG_TARGET_NULL)
|
||||
return -ERRNO_VALUE(error);
|
||||
|
||||
char buffer[LINE_MAX];
|
||||
va_list ap;
|
||||
const char *unit_fmt = NULL;
|
||||
|
||||
errno = ERRNO_VALUE(error);
|
||||
|
||||
va_start(ap, format);
|
||||
|
||||
@@ -815,7 +815,7 @@ int wait_for_terminate_with_timeout(pid_t pid, usec_t timeout) {
|
||||
if (status.si_pid == pid) {
|
||||
/* This is the correct child. */
|
||||
if (status.si_code == CLD_EXITED)
|
||||
return (status.si_status == 0) ? 0 : -EPROTO;
|
||||
return status.si_status == 0 ? 0 : -EPROTO;
|
||||
else
|
||||
return -EPROTO;
|
||||
}
|
||||
|
||||
@@ -9,16 +9,16 @@
|
||||
#include "macro.h"
|
||||
#include "memory-util.h"
|
||||
|
||||
#define snprintf_ok(buf, len, fmt, ...) \
|
||||
({ \
|
||||
char *_buf = (buf); \
|
||||
size_t _len = (len); \
|
||||
int _snpf = snprintf(_buf, _len, (fmt), __VA_ARGS__); \
|
||||
_snpf >= 0 && (size_t) _snpf < _len ? _buf : NULL; \
|
||||
#define snprintf_ok(buf, len, fmt, ...) \
|
||||
({ \
|
||||
char *_buf = (buf); \
|
||||
size_t _len = (len); \
|
||||
int _snpf = snprintf(_buf, _len, (fmt), ##__VA_ARGS__); \
|
||||
_snpf >= 0 && (size_t) _snpf < _len ? _buf : NULL; \
|
||||
})
|
||||
|
||||
#define xsprintf(buf, fmt, ...) \
|
||||
assert_message_se(snprintf_ok(buf, ELEMENTSOF(buf), fmt, __VA_ARGS__), "xsprintf: " #buf "[] must be big enough")
|
||||
assert_message_se(snprintf_ok(buf, ELEMENTSOF(buf), fmt, ##__VA_ARGS__), "xsprintf: " #buf "[] must be big enough")
|
||||
|
||||
#define VA_FORMAT_ADVANCE(format, ap) \
|
||||
do { \
|
||||
|
||||
Reference in New Issue
Block a user