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