mirror of
https://github.com/cryb-to/cryb-to.git
synced 2024-11-30 17:45:42 +00:00
Add and use t_compare_errno.
Unfortunately, this causes a memory leak on FreeBSD due to localization: strerror_r() attempts to load localized error messages, fails, and creates a negative cache entry which is never freed.
This commit is contained in:
parent
c31fe69263
commit
8bc14dca97
3 changed files with 32 additions and 6 deletions
|
@ -103,6 +103,7 @@ int t_is_not_null(const void *);
|
||||||
int t_compare_mem(const void *, const void *, size_t);
|
int t_compare_mem(const void *, const void *, size_t);
|
||||||
int t_compare_str(const char *, const char *);
|
int t_compare_str(const char *, const char *);
|
||||||
int t_compare_strn(const char *, const char *, size_t);
|
int t_compare_strn(const char *, const char *, size_t);
|
||||||
|
int t_compare_errno(int, int);
|
||||||
#define t_compare_num(n, t) int t_compare_##n(t, t);
|
#define t_compare_num(n, t) int t_compare_##n(t, t);
|
||||||
t_compare_num(i, int);
|
t_compare_num(i, int);
|
||||||
t_compare_num(u, unsigned int);
|
t_compare_num(u, unsigned int);
|
||||||
|
|
|
@ -169,6 +169,32 @@ t_compare_strn(const char *expected, const char *received, size_t len)
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Compare to errno values, and print a verbose message if they differ.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
t_compare_errno(int expected, int received)
|
||||||
|
{
|
||||||
|
char errbuf[256];
|
||||||
|
|
||||||
|
if (expected != received) {
|
||||||
|
if (expected == 0) {
|
||||||
|
t_printv("expected no errno\n");
|
||||||
|
} else {
|
||||||
|
strerror_r(expected, errbuf, sizeof errbuf);
|
||||||
|
t_printv("expected errno: %s\n", strerror(expected));
|
||||||
|
}
|
||||||
|
if (received == 0) {
|
||||||
|
t_printv("received no errno\n");
|
||||||
|
} else {
|
||||||
|
strerror_r(received, errbuf, sizeof errbuf);
|
||||||
|
t_printv("received errno: %s\n", strerror(received));
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Compare two numbers, and print a verbose message if they differ.
|
* Compare two numbers, and print a verbose message if they differ.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -306,16 +306,15 @@ t_rfc3986(char **desc CRYB_UNUSED, void *arg)
|
||||||
struct t_case *t = arg;
|
struct t_case *t = arg;
|
||||||
char buf[256];
|
char buf[256];
|
||||||
size_t len;
|
size_t len;
|
||||||
int ret;
|
int fret, ret;
|
||||||
|
|
||||||
memset(buf, 0, sizeof buf);
|
memset(buf, 0, sizeof buf);
|
||||||
errno = 0;
|
|
||||||
len = t->blen > sizeof buf ? sizeof buf : t->blen;
|
len = t->blen > sizeof buf ? sizeof buf : t->blen;
|
||||||
ret = t_compare_i(t->ret,
|
fret = t->func(t->in, t->ilen, t->out ? buf : NULL, &len);
|
||||||
t->func(t->in, t->ilen, t->out ? buf : NULL, &len));
|
ret = t_compare_i(t->ret, fret);
|
||||||
|
if (fret != 0)
|
||||||
|
ret &= t_compare_errno(t->err, errno);
|
||||||
ret &= t_compare_sz(t->olen, len);
|
ret &= t_compare_sz(t->olen, len);
|
||||||
if (t->ret != 0 || errno != 0)
|
|
||||||
ret &= t_compare_i(t->err, errno);
|
|
||||||
if (t->out)
|
if (t->out)
|
||||||
ret &= t_compare_strn(t->out, buf, t->blen - 1);
|
ret &= t_compare_strn(t->out, buf, t->blen - 1);
|
||||||
return (ret);
|
return (ret);
|
||||||
|
|
Loading…
Reference in a new issue