Module Name: src Committed By: christos Date: Fri Jun 26 15:49:03 UTC 2009
Modified Files: src/sys/kern: vfs_lookup.c Log Message: magic symlink cleanup: - use size_t for len - don't call strlen multiple times in macro - add gid - off by one in bounds calculation To generate a diff of this commit: cvs rdiff -u -r1.114 -r1.115 src/sys/kern/vfs_lookup.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/vfs_lookup.c diff -u src/sys/kern/vfs_lookup.c:1.114 src/sys/kern/vfs_lookup.c:1.115 --- src/sys/kern/vfs_lookup.c:1.114 Mon May 4 02:05:19 2009 +++ src/sys/kern/vfs_lookup.c Fri Jun 26 11:49:03 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: vfs_lookup.c,v 1.114 2009/05/04 06:05:19 yamt Exp $ */ +/* $NetBSD: vfs_lookup.c,v 1.115 2009/06/26 15:49:03 christos Exp $ */ /* * Copyright (c) 1982, 1986, 1989, 1993 @@ -37,7 +37,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: vfs_lookup.c,v 1.114 2009/05/04 06:05:19 yamt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vfs_lookup.c,v 1.115 2009/06/26 15:49:03 christos Exp $"); #include "opt_magiclinks.h" @@ -98,23 +98,23 @@ !strncmp((str), &cp[i], VNL(str)) #define SUBSTITUTE(m, s, sl) \ - if ((newlen + (sl)) > MAXPATHLEN) \ - return (1); \ + if ((newlen + (sl)) >= MAXPATHLEN) \ + return 1; \ i += VNL(m); \ if (termchar != '/') \ i++; \ - memcpy(&tmp[newlen], (s), (sl)); \ + (void)memcpy(&tmp[newlen], (s), (sl)); \ newlen += (sl); \ change = 1; \ termchar = '/'; static int -symlink_magic(struct proc *p, char *cp, int *len) +symlink_magic(struct proc *p, char *cp, size_t *len) { char *tmp; - int change, i, newlen; - int termchar = '/'; - char uidtmp[11]; /* XXX elad */ + size_t change, i, newlen, slen; + char termchar = '/'; + char idtmp[11]; /* enough for 32 bit *unsigned* integer */ tmp = PNBUF_GET(); @@ -137,37 +137,43 @@ * to frequency of use. */ if (MATCH("machine_arch")) { - SUBSTITUTE("machine_arch", MACHINE_ARCH, - sizeof(MACHINE_ARCH) - 1); + slen = VNL(MACHINE_ARCH); + SUBSTITUTE("machine_arch", MACHINE_ARCH, slen); } else if (MATCH("machine")) { - SUBSTITUTE("machine", MACHINE, - sizeof(MACHINE) - 1); + slen = VNL(MACHINE); + SUBSTITUTE("machine", MACHINE, slen); } else if (MATCH("hostname")) { - SUBSTITUTE("hostname", hostname, - hostnamelen); + SUBSTITUTE("hostname", hostname, hostnamelen); } else if (MATCH("osrelease")) { - SUBSTITUTE("osrelease", osrelease, - strlen(osrelease)); + slen = strlen(osrelease); + SUBSTITUTE("osrelease", osrelease, slen); } else if (MATCH("emul")) { - SUBSTITUTE("emul", p->p_emul->e_name, - strlen(p->p_emul->e_name)); + slen = strlen(p->p_emul->e_name); + SUBSTITUTE("emul", p->p_emul->e_name, slen); } else if (MATCH("kernel_ident")) { - SUBSTITUTE("kernel_ident", kernel_ident, - strlen(kernel_ident)); + slen = strlen(kernel_ident); + SUBSTITUTE("kernel_ident", kernel_ident, slen); } else if (MATCH("domainname")) { - SUBSTITUTE("domainname", domainname, - domainnamelen); + SUBSTITUTE("domainname", domainname, domainnamelen); } else if (MATCH("ostype")) { - SUBSTITUTE("ostype", ostype, - strlen(ostype)); + slen = strlen(ostype); + SUBSTITUTE("ostype", ostype, slen); } else if (MATCH("uid")) { - (void)snprintf(uidtmp, sizeof(uidtmp), "%u", + slen = snprintf(idtmp, sizeof(idtmp), "%u", kauth_cred_geteuid(kauth_cred_get())); - SUBSTITUTE("uid", uidtmp, strlen(uidtmp)); + SUBSTITUTE("uid", idtmp, slen); } else if (MATCH("ruid")) { - (void)snprintf(uidtmp, sizeof(uidtmp), "%u", + slen = snprintf(idtmp, sizeof(idtmp), "%u", kauth_cred_getuid(kauth_cred_get())); - SUBSTITUTE("ruid", uidtmp, strlen(uidtmp)); + SUBSTITUTE("ruid", idtmp, slen); + } else if (MATCH("gid")) { + slen = snprintf(idtmp, sizeof(idtmp), "%u", + kauth_cred_getegid(kauth_cred_get())); + SUBSTITUTE("gid", idtmp, slen); + } else if (MATCH("rgid")) { + slen = snprintf(idtmp, sizeof(idtmp), "%u", + kauth_cred_getgid(kauth_cred_get())); + SUBSTITUTE("rgid", idtmp, slen); } else { tmp[newlen++] = '@'; if (termchar == VC) @@ -176,12 +182,12 @@ } if (change) { - memcpy(cp, tmp, newlen); + (void)memcpy(cp, tmp, newlen); *len = newlen; } PNBUF_PUT(tmp); - return (0); + return 0; } #undef VNL @@ -219,7 +225,8 @@ struct iovec aiov; /* uio for reading symbolic links */ struct lwp *l = curlwp; /* thread doing namei() */ struct uio auio; - int error, linklen; + int error; + size_t linklen; struct componentname *cnp = &ndp->ni_cnd; #ifdef DIAGNOSTIC