PERFORCE change 84314 for review

Robert Watson rwatson at FreeBSD.org
Mon Sep 26 22:02:05 GMT 2005


http://perforce.freebsd.org/chv.cgi?CH=84314

Change 84314 by rwatson at rwatson_zoo on 2005/09/26 22:01:05

	Be more careful about buffer length handling in canon_path():
	use strlcpy(), snprintf() to copy and combine strings.  This
	appears to fix some memory corruption problems seen on SMP
	under high load during large numbers of name space operations.

Affected files ...

.. //depot/projects/trustedbsd/audit3/sys/security/audit/kern_bsm_klib.c#12 edit

Differences ...

==== //depot/projects/trustedbsd/audit3/sys/security/audit/kern_bsm_klib.c#12 (text+ko) ====

@@ -400,16 +400,22 @@
  * to obtain the root directoty, but this results in a volfs name
  * written to the audit log. So we will leave the filename starting
  * with '/' in the audit log in this case.
+ *
+ * XXXRW: Since we combine two paths here, ideally a buffer of size
+ * MAXPATHLEN * 2 would be passed in.
  */
 void
 canon_path(struct thread *td, char *path, char *cpath)
 {
+
 	char *bufp;
 	char *retbuf, *freebuf;
+#if 0
 	int len;
+#endif
 	struct vnode *vnp;
 	struct filedesc *fdp;
-	int vfslocked;
+	int error, vfslocked;
 
 	fdp = td->td_proc->p_fd;
 	bufp = path;
@@ -436,9 +442,6 @@
 	FILEDESC_UNLOCK(fdp);
 	if (vnp != NULL) {
 		/*
-		 * XXX: Should lock vnode!
-		 */
-		/*
 		 * XXX: vn_fullpath() on FreeBSD is "less reliable"
 		 * than vn_getpath() on Darwin, so this will need more
 		 * attention in the future.  Also, the question and
@@ -447,19 +450,17 @@
 		 */
 		vfslocked = VFS_LOCK_GIANT(vnp->v_mount);
 		vn_lock(vnp, LK_EXCLUSIVE | LK_RETRY, td);
-		if (vn_fullpath(td, vnp, &retbuf, &freebuf) == 0) {
+		error = vn_fullpath(td, vnp, &retbuf, &freebuf);
+		if (error == 0) {
 			/* Copy and free buffer allocated by vn_fullpath() */
-			strlcpy(cpath, retbuf, MAXPATHLEN);
+			snprintf(cpath, MAXPATHLEN, "%s/%s", retbuf, bufp);
 			free(freebuf, M_TEMP); 
-		}
-		else {
+		} else {
 			cpath[0] = '\0';
 		}
 		vput(vnp);
 		VFS_UNLOCK_GIANT(vfslocked);
-		len = strlen(cpath);
-		strncpy(cpath + len-1, bufp, MAXPATHLEN - len);
 	} else {
-		strncpy(cpath, bufp, MAXPATHLEN);
+		strlcpy(cpath, bufp, MAXPATHLEN);
 	}
 }
To Unsubscribe: send mail to majordomo at trustedbsd.org
with "unsubscribe trustedbsd-cvs" in the body of the message



More information about the trustedbsd-cvs mailing list