From 913915853e036c9dbb052029da57e31bb27f44f9 Mon Sep 17 00:00:00 2001 From: martin Date: Tue, 15 Mar 2022 10:00:14 +0000 Subject: [PATCH] Pull up following revision(s) (requested by ozaki-r in ticket #1738): 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 --- usr.sbin/puffs/mount_9p/node.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/usr.sbin/puffs/mount_9p/node.c b/usr.sbin/puffs/mount_9p/node.c index 6c06ce3e85cb..c5e81b9a8b09 100644 --- a/usr.sbin/puffs/mount_9p/node.c +++ b/usr.sbin/puffs/mount_9p/node.c @@ -1,4 +1,4 @@ -/* $NetBSD: node.c,v 1.21 2009/01/18 10:10:47 lukem Exp $ */ +/* $NetBSD: node.c,v 1.21.40.1 2022/03/15 10:00:14 martin Exp $ */ /* * Copyright (c) 2007 Antti Kantee. All Rights Reserved. @@ -27,7 +27,7 @@ #include #ifndef lint -__RCSID("$NetBSD: node.c,v 1.21 2009/01/18 10:10:47 lukem Exp $"); +__RCSID("$NetBSD: node.c,v 1.21.40.1 2022/03/15 10:00:14 martin Exp $"); #endif /* !lint */ #include @@ -181,6 +181,11 @@ puffs9p_node_readdir(struct puffs_usermount *pu, void *opc, struct dirent *dent, 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); /* @@ -266,6 +271,8 @@ puffs9p_node_open(struct puffs_usermount *pu, void *opc, int mode, 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,