Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 30 Oct 2002 04:55:40 +0100
From:      Dag-Erling Smorgrav <des@ofug.org>
To:        Bill Fenner <fenner@research.att.com>
Cc:        cvs-committers@FreeBSD.org, cvs-all@FreeBSD.org
Subject:   Re: Moving forward with libfetch (was Re: cvs commit: src/lib/libfetch common.c)
Message-ID:  <xzpvg3k4m2r.fsf@flood.ping.uio.no>
In-Reply-To: <200210300111.RAA12355@windsor.research.att.com> (Bill Fenner's message of "Tue, 29 Oct 2002 17:11:31 -0800")
References:  <200210300111.RAA12355@windsor.research.att.com>

next in thread | previous in thread | raw e-mail | index | archive | help
--=-=-=

Bill Fenner <fenner@research.att.com> writes:
> Given that _fetch_read() has to be able to return 0 to permit reading to
> EOF, is there really something that needs to be improved from rev 1.33?

Yes, 1.34 also fixes a bug that prevented the caller from being able
to tell the difference between EOF and a timeout.  This is important
for fetch(1) (and would be for pkg_add(8) as well except it ignores
read errors).

To summarize, 1.33 was correct but there were still cases where
_fetch_read() returned the wrong value.  1.34 fixed that but went a
little bit too far.

As for the core dumps, it seems that fixing _fetch_read() exposed a
bug in _http_fillbuf(), where it fails to set the error flag if
_fetch_read() returns -1, causing _http_readfn() to return 0 instead
of -1 (unless some data was read before the error, in which case it
will return the amount of data read, then 0 on subsequent calls).
This bug was there all along, but never manifested itself because,
until 1.34, _fetch_read() would never return -1 unless select() did,
which as far as I can tell can't happen in that particular piece of
code.

I've attached a patch for http.c.

DES
-- 
Dag-Erling Smorgrav - des@ofug.org


--=-=-=
Content-Type: text/x-patch
Content-Disposition: attachment; filename=http.diff

Index: http.c
===================================================================
RCS file: /home/ncvs/src/lib/libfetch/http.c,v
retrieving revision 1.62
diff -u -u -r1.62 http.c
--- http.c	27 Oct 2002 15:43:40 -0000	1.62
+++ http.c	30 Oct 2002 03:45:48 -0000
@@ -196,8 +196,10 @@
 	if (io->chunked == 0) {
 		if (_http_growbuf(io, len) == -1)
 			return (-1);
-		if ((io->buflen = _fetch_read(io->conn, io->buf, len)) == -1)
+		if ((io->buflen = _fetch_read(io->conn, io->buf, len)) == -1) {
+			io->error = 1;
 			return (-1);
+		}
 		io->bufpos = 0;
 		return (io->buflen);
 	}
@@ -217,8 +219,10 @@
 		len = io->chunksize;
 	if (_http_growbuf(io, len) == -1)
 		return (-1);
-	if ((io->buflen = _fetch_read(io->conn, io->buf, len)) == -1)
+	if ((io->buflen = _fetch_read(io->conn, io->buf, len)) == -1) {
+		io->error = 1;
 		return (-1);
+	}
 	io->chunksize -= io->buflen;
 
 	if (io->chunksize == 0) {

--=-=-=--

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe cvs-all" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?xzpvg3k4m2r.fsf>