Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/netbsd-8]: src/usr.sbin/puffs/mount_9p Pull up following revision(s) (re...



details:   https://anonhg.NetBSD.org/src/rev/d27138de23e4
branches:  netbsd-8
changeset: 363911:d27138de23e4
user:      martin <martin%NetBSD.org@localhost>
date:      Tue Mar 15 10:00:14 2022 +0000

description:
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

diffstat:

 usr.sbin/puffs/mount_9p/node.c |  11 +++++++++--
 1 files changed, 9 insertions(+), 2 deletions(-)

diffs (39 lines):

diff -r ecaa65df5348 -r d27138de23e4 usr.sbin/puffs/mount_9p/node.c
--- a/usr.sbin/puffs/mount_9p/node.c    Sun Mar 13 09:54:47 2022 +0000
+++ b/usr.sbin/puffs/mount_9p/node.c    Tue Mar 15 10:00:14 2022 +0000
@@ -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 <sys/cdefs.h>
 #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 <assert.h>
@@ -181,6 +181,11 @@
        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 @@
 
        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,



Home | Main Index | Thread Index | Old Index