=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/finger/util.c,v retrieving revision 1.3 retrieving revision 1.4 diff -c -r1.3 -r1.4 *** src/usr.bin/finger/util.c 1996/08/07 17:49:49 1.3 --- src/usr.bin/finger/util.c 1996/08/30 11:39:36 1.4 *************** *** 1,4 **** ! /* $OpenBSD: util.c,v 1.3 1996/08/07 17:49:49 downsj Exp $ */ /* * Copyright (c) 1989 The Regents of the University of California. --- 1,4 ---- ! /* $OpenBSD: util.c,v 1.4 1996/08/30 11:39:36 deraadt Exp $ */ /* * Copyright (c) 1989 The Regents of the University of California. *************** *** 38,44 **** #ifndef lint /*static char sccsid[] = "from: @(#)util.c 5.14 (Berkeley) 1/17/91";*/ ! static char rcsid[] = "$OpenBSD: util.c,v 1.3 1996/08/07 17:49:49 downsj Exp $"; #endif /* not lint */ #include --- 38,44 ---- #ifndef lint /*static char sccsid[] = "from: @(#)util.c 5.14 (Berkeley) 1/17/91";*/ ! static char rcsid[] = "$OpenBSD: util.c,v 1.4 1996/08/30 11:39:36 deraadt Exp $"; #endif /* not lint */ #include *************** *** 81,87 **** register char *p, *t; struct stat sb; extern int errno; ! char *bp, name[1024]; pn->realname = pn->office = pn->officephone = pn->homephone = NULL; --- 81,88 ---- register char *p, *t; struct stat sb; extern int errno; ! char *mbp, *bp, *name; ! int len; pn->realname = pn->office = pn->officephone = pn->homephone = NULL; *************** *** 91,112 **** pn->shell = strdup(pw->pw_shell); /* why do we skip asterisks!?!? */ ! (void)strcpy(bp = tbuf, pw->pw_gecos); if (*bp == '*') ++bp; /* ampersands get replaced by the login name */ ! if (!(p = strsep(&bp, ","))) return; ! for (t = name; *t = *p; ++p) if (*t == '&') { (void)strcpy(t, pw->pw_name); if (islower(*t)) *t = toupper(*t); while (*++t); ! } ! else ++t; pn->realname = strdup(name); pn->office = ((p = strsep(&bp, ",")) && *p) ? strdup(p) : NULL; --- 92,122 ---- pn->shell = strdup(pw->pw_shell); /* why do we skip asterisks!?!? */ ! mbp = bp = (char *)malloc(strlen(pw->pw_gecos)+1); ! strcpy(bp, pw->pw_gecos); if (*bp == '*') ++bp; /* ampersands get replaced by the login name */ ! if (!(p = strsep(&bp, ","))) { ! free(mbp); return; ! } ! for (len = 0, t = p; *p; ++p) { ! len++; ! if (*p == '&') ! len += strlen(pw->pw_name); ! } ! name = (char *)malloc(len + 1); ! for (p = t, t = name; *t = *p; ++p) if (*t == '&') { (void)strcpy(t, pw->pw_name); if (islower(*t)) *t = toupper(*t); while (*++t); ! } else ++t; + *t = '\0'; pn->realname = strdup(name); pn->office = ((p = strsep(&bp, ",")) && *p) ? strdup(p) : NULL; *************** *** 120,131 **** --- 130,145 ---- if (errno != ENOENT) { (void)fprintf(stderr, "finger: %s: %s\n", tbuf, strerror(errno)); + free(name); + free(mbp); return; } } else if (sb.st_size != 0) { pn->mailrecv = sb.st_mtime; pn->mailread = sb.st_atime; } + free(name); + free(mbp); } match(pw, user)