Module Name:    src
Committed By:   jakllsch
Date:           Fri Jan 20 22:07:58 UTC 2012

Modified Files:
        src/usr.sbin/puffs/mount_psshfs: node.c

Log Message:
Ensure psshfs_node_read() completely reads all data before return.
Fixes file corruption in psshfs exposed with kernel MAXPHYS at 128KiB.


To generate a diff of this commit:
cvs rdiff -u -r1.63 -r1.64 src/usr.sbin/puffs/mount_psshfs/node.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.sbin/puffs/mount_psshfs/node.c
diff -u src/usr.sbin/puffs/mount_psshfs/node.c:1.63 src/usr.sbin/puffs/mount_psshfs/node.c:1.64
--- src/usr.sbin/puffs/mount_psshfs/node.c:1.63	Fri Aug 12 04:14:00 2011
+++ src/usr.sbin/puffs/mount_psshfs/node.c	Fri Jan 20 22:07:58 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: node.c,v 1.63 2011/08/12 04:14:00 riastradh Exp $	*/
+/*	$NetBSD: node.c,v 1.64 2012/01/20 22:07:58 jakllsch Exp $	*/
 
 /*
  * Copyright (c) 2006-2009  Antti Kantee.  All Rights Reserved.
@@ -27,7 +27,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: node.c,v 1.63 2011/08/12 04:14:00 riastradh Exp $");
+__RCSID("$NetBSD: node.c,v 1.64 2012/01/20 22:07:58 jakllsch Exp $");
 #endif /* !lint */
 
 #include <assert.h>
@@ -525,6 +525,7 @@ psshfs_node_read(struct puffs_usermount 
 		goto farout;
 	}
 
+again:
 	readlen = *resid;
 	psbuf_req_data(pb, SSH_FXP_READ, reqid, psn->fhand_r, psn->fhand_r_len);
 	psbuf_put_8(pb, offset);
@@ -546,8 +547,11 @@ psshfs_node_read(struct puffs_usermount 
 	GETRESPONSE(pb, pctx->sshfd_data);
 
 	rv = psbuf_do_data(pb, buf, &readlen);
-	if (rv == 0)
+	if (rv == 0) {
 		*resid -= readlen;
+		buf += readlen;
+		offset += readlen;
+	}
 
  out:
 	if (max_reads && --psn->readcount >= max_reads) {
@@ -559,6 +563,12 @@ psshfs_node_read(struct puffs_usermount 
 		TAILQ_REMOVE(&psn->pw, pwp, pw_entries);
 	}
 
+	if (rv == 0 && *resid > 0) {
+		reqid = NEXTREQ(pctx);
+		psbuf_recycleout(pb);
+		goto again;
+	}
+
  farout:
 	/* check if we need a lazyclose */
 	if (psn->stat & PSN_HANDLECLOSE && psn->fhand_r) {

Reply via email to