Module Name: src
Committed By: kre
Date: Sun Jan 13 06:10:34 UTC 2019
Modified Files:
src/lib/libwrap: expandm.c
Log Message:
Always return from expandm() with errno unaltered, so on the
off chance it failed, there's still the possibility that whatever
processes the result will be able to deal with the %m that would
(presumably) be left in the format string.
And as a frill, don't call strerror() until we know we are
going to use its result (still call it only once, no matter
how many %m's are in the format string).
To generate a diff of this commit:
cvs rdiff -u -r1.6 -r1.7 src/lib/libwrap/expandm.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/lib/libwrap/expandm.c
diff -u src/lib/libwrap/expandm.c:1.6 src/lib/libwrap/expandm.c:1.7
--- src/lib/libwrap/expandm.c:1.6 Sun Jan 13 01:32:51 2019
+++ src/lib/libwrap/expandm.c Sun Jan 13 06:10:34 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: expandm.c,v 1.6 2019/01/13 01:32:51 christos Exp $ */
+/* $NetBSD: expandm.c,v 1.7 2019/01/13 06:10:34 kre Exp $ */
/*-
* Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: expandm.c,v 1.6 2019/01/13 01:32:51 christos Exp $");
+__RCSID("$NetBSD: expandm.c,v 1.7 2019/01/13 06:10:34 kre Exp $");
#include <limits.h>
#include <stdio.h>
@@ -48,7 +48,8 @@ __RCSID("$NetBSD: expandm.c,v 1.6 2019/0
const char * __attribute__((__format_arg__(1)))
expandm(const char *fmt, const char *sf, char **rbuf)
{
- const char *e = strerror(errno);
+ const int err = errno;
+ const char *e = NULL;
char *buf, *m, *nbuf;
const char *ptr;
@@ -74,6 +75,8 @@ expandm(const char *fmt, const char *sf,
buf = nbuf;
}
+ if (__predict_true(e == NULL && (cnt & 1) != 0))
+ e = strerror(err);
if (asprintf(&nbuf, "%s%.*s%s", buf ? buf : "",
(int)(m - ptr), ptr, (cnt & 1) ? e : "%m") == -1)
goto out;
@@ -87,11 +90,13 @@ expandm(const char *fmt, const char *sf,
free(buf);
if (rbuf)
*rbuf = nbuf;
+ errno = err;
return nbuf;
out:
free(buf);
if (rbuf)
*rbuf = NULL;
+ errno = err;
return fmt;
}