summaryrefslogtreecommitdiff
path: root/usr.sbin/ypserv/mkalias
diff options
context:
space:
mode:
authorFederico G. Schwindt <fgsch@cvs.openbsd.org>2007-08-05 14:25:49 +0000
committerFederico G. Schwindt <fgsch@cvs.openbsd.org>2007-08-05 14:25:49 +0000
commit156a4e1ecaf5cf84d1d0d627ccc51bb006b1237a (patch)
tree5533c5c50f30d4914cfa4741518902ac1ba8fac5 /usr.sbin/ypserv/mkalias
parent25cb2bbe1b9d72a35d998140e536c1558ec18590 (diff)
use memchr and a memrchr like implementation on non C strings. fixes
a crash triggered by specific malloc.conf settings. with help and ok millert@
Diffstat (limited to 'usr.sbin/ypserv/mkalias')
-rw-r--r--usr.sbin/ypserv/mkalias/mkalias.c40
1 files changed, 28 insertions, 12 deletions
diff --git a/usr.sbin/ypserv/mkalias/mkalias.c b/usr.sbin/ypserv/mkalias/mkalias.c
index bbe0e04005e..20bb9297f31 100644
--- a/usr.sbin/ypserv/mkalias/mkalias.c
+++ b/usr.sbin/ypserv/mkalias/mkalias.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mkalias.c,v 1.18 2006/11/10 20:44:07 mk Exp $ */
+/* $OpenBSD: mkalias.c,v 1.19 2007/08/05 14:25:48 fgsch Exp $ */
/*
* Copyright (c) 1997 Mats O Jansson <moj@stacken.kth.se>
@@ -27,7 +27,7 @@
*/
#ifndef lint
-static const char rcsid[] = "$OpenBSD: mkalias.c,v 1.18 2006/11/10 20:44:07 mk Exp $";
+static const char rcsid[] = "$OpenBSD: mkalias.c,v 1.19 2007/08/05 14:25:48 fgsch Exp $";
#endif
#include <ctype.h>
@@ -45,13 +45,28 @@ static const char rcsid[] = "$OpenBSD: mkalias.c,v 1.18 2006/11/10 20:44:07 mk E
#include "ypdb.h"
#include "ypdef.h"
+char *
+findlast(const char *b, int c, size_t len)
+{
+ const char *p;
+
+ if (len != 0) {
+ p = b + len - 1;
+ do {
+ if (*p == c)
+ return ((char *)p);
+ } while (p-- != b);
+ }
+ return (NULL);
+}
+
static void
-split_address(char *address, int len, char *user, char *host)
+split_address(char *address, size_t len, char *user, char *host)
{
char *c, *s, *r;
int i = 0;
- if (strchr(address, '@')) {
+ if (memchr(address, '@', len)) {
s = user;
for (c = address; i < len; i++) {
if (*c == '@') {
@@ -65,7 +80,7 @@ split_address(char *address, int len, char *user, char *host)
*s = '\0';
}
- if ((r = strrchr(address, '!'))) {
+ if ((r = findlast(address, '!', len))) {
s = host;
for (c = address; i < len; i++) {
if (c == r) {
@@ -81,13 +96,13 @@ split_address(char *address, int len, char *user, char *host)
}
static int
-check_host(char *address, char *host, int dflag, int uflag, int Eflag)
+check_host(char *address, size_t len, char *host, int dflag, int uflag, int Eflag)
{
u_char answer[PACKETSZ];
int status;
- if ((dflag && strchr(address, '@')) ||
- (uflag && strchr(address, '!')))
+ if ((dflag && memchr(address, '@', len)) ||
+ (uflag && memchr(address, '!', len)))
return(0);
if ((_res.options & RES_INIT) == 0)
@@ -252,17 +267,18 @@ fail:
continue; /* Sendmail token */
if (strncmp(key.dptr, "YP_", 3)==0) /* YP token */
continue;
- if (strchr(val.dptr, ','))
+ if (memchr(val.dptr, ',', val.dsize))
continue; /* List... */
- if (strchr(val.dptr, '|'))
+ if (memchr(val.dptr, '|', val.dsize))
continue; /* Pipe... */
- if (!(strchr(val.dptr, '@') || strchr(val.dptr, '!')))
+ if (!(memchr(val.dptr, '@', val.dsize) ||
+ memchr(val.dptr, '!', val.dsize)))
continue; /* Skip local users */
split_address(val.dptr, val.dsize, user, host);
- if (eflag && check_host(val.dptr, host, dflag, uflag, Eflag)) {
+ if (eflag && check_host(val.dptr, val.dsize, host, dflag, uflag, Eflag)) {
printf("Invalid host %s in %*.*s:%*.*s\n",
host, key.dsize, key.dsize, key.dptr,
val.dsize, val.dsize, val.dptr);