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

Reply via email to