kern/163076: It is not possible to read in chunks from linprocfs
and procfs.
Jaakko Heinonen
jh at FreeBSD.org
Tue Dec 6 13:30:13 UTC 2011
The following reply was made to PR kern/163076; it has been noted by GNATS.
From: Jaakko Heinonen <jh at FreeBSD.org>
To: Poul-Henning Kamp <phk at phk.freebsd.dk>
Cc: Petr Salinger <Petr.Salinger at seznam.cz>, bug-followup at FreeBSD.org
Subject: Re: kern/163076: It is not possible to read in chunks from linprocfs
and procfs.
Date: Tue, 6 Dec 2011 15:21:36 +0200
On 2011-12-06, Poul-Henning Kamp wrote:
> >Shouldn't sbuf_finish() then check s->s_error before appending the
> >trailing '\0' and setting the SBUF_FINISHED flag? The problem in
> >question wasn't caught earlier because sbuf_finish() happily finishes
> >the buffer even if it has an error.
>
> I belive the code is written so that there is always reserved space
> for the final '\0'
>
> sbuf_finish() should finish _any_ sbuf, and return zero only if
> the finished buffer is fully OK.
Anyway I find it inconsistent that you can successfully call
sbuf_finish() and sbuf_data() but not for example sbuf_len() on an
errored buffer.
Thus you can "fix" the problem with the subtle change below.
%%%
Index: sys/fs/pseudofs/pseudofs_vnops.c
===================================================================
--- sys/fs/pseudofs/pseudofs_vnops.c (revision 228153)
+++ sys/fs/pseudofs/pseudofs_vnops.c (working copy)
@@ -651,7 +651,7 @@ pfs_read(struct vop_read_args *va)
}
sbuf_finish(sb);
- error = uiomove_frombuf(sbuf_data(sb), sbuf_len(sb), uio);
+ error = uiomove_frombuf(sbuf_data(sb), strlen(sbuf_data(sb)), uio);
sbuf_delete(sb);
ret:
vn_lock(vn, locked | LK_RETRY);
%%%
--
Jaakko
More information about the freebsd-bugs
mailing list