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