Module Name:    src
Committed By:   martin
Date:           Tue Mar 15 09:58:39 UTC 2022

Modified Files:
        src/usr.sbin/puffs/mount_9p [netbsd-9]: node.c

Log Message:
Pull up following revision(s) (requested by ozaki-r in ticket #1434):

        usr.sbin/puffs/mount_9p/node.c: revision 1.30
        usr.sbin/puffs/mount_9p/node.c: revision 1.31

mount_9p: fix writing to a file opened with write-only mode

With the page cache, writing data to a file may demand to read contents
from a storage to fill a page in the page cache first.

Opening a file with write-only mode by a user lets a mount_9p process
open a file with write-only mode too at a 9p server.  Thus, a read
request to the file from the page cache fails.

So we need to open a file always with read mode (internally) even if it
is opened with write-only mode by a user.

Note that the change doesn't mean that mount_9p allows users to read
contents from a file that is opened with write-only mode.

 -

mount_9p: check returned type for Tread


To generate a diff of this commit:
cvs rdiff -u -r1.23 -r1.23.2.1 src/usr.sbin/puffs/mount_9p/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_9p/node.c
diff -u src/usr.sbin/puffs/mount_9p/node.c:1.23 src/usr.sbin/puffs/mount_9p/node.c:1.23.2.1
--- src/usr.sbin/puffs/mount_9p/node.c:1.23	Fri Jun  7 05:34:34 2019
+++ src/usr.sbin/puffs/mount_9p/node.c	Tue Mar 15 09:58:38 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: node.c,v 1.23 2019/06/07 05:34:34 ozaki-r Exp $	*/
+/*	$NetBSD: node.c,v 1.23.2.1 2022/03/15 09:58:38 martin Exp $	*/
 
 /*
  * Copyright (c) 2007  Antti Kantee.  All Rights Reserved.
@@ -27,7 +27,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: node.c,v 1.23 2019/06/07 05:34:34 ozaki-r Exp $");
+__RCSID("$NetBSD: node.c,v 1.23.2.1 2022/03/15 09:58:38 martin Exp $");
 #endif /* !lint */
 
 #include <assert.h>
@@ -185,6 +185,11 @@ puffs9p_node_readdir(struct puffs_usermo
 	p9pbuf_put_4(pb, *reslen); /* XXX */
 	GETRESPONSE(pb);
 
+	if (p9pbuf_get_type(pb) != P9PROTO_R_READ) {
+		rv = proto_handle_rerror(pu, pb);
+		goto out;
+	}
+
 	p9pbuf_get_4(pb, &count);
 
 	/*
@@ -271,6 +276,8 @@ puffs9p_node_open(struct puffs_usermount
 
 	puffs_setback(pcc, PUFFS_SETBACK_INACT_N1);
 	if (pn->pn_va.va_type != VDIR) {
+		/* Always require read access for page cache */
+		mode |= FREAD;
 		if (mode & FREAD && p9n->fid_read == P9P_INVALFID) {
 			nfid = NEXTFID(p9p);
 			error = proto_cc_open(pu, p9n->fid_base, nfid,

Reply via email to