Date: Thu, 10 Jan 2002 11:52:53 -0800 (PST) From: Vladislav Shabanov <vs@rambler-co.ru> To: freebsd-gnats-submit@FreeBSD.org Subject: kern/33771: bug in sendfile implementation if nbytes != 0 and struct sf_hdtr *hdtr->headers != NULL Message-ID: <200201101952.g0AJqrO12027@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 33771
>Category: kern
>Synopsis: bug in sendfile implementation if nbytes != 0 and struct sf_hdtr *hdtr->headers != NULL
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Thu Jan 10 12:00:10 PST 2002
>Closed-Date:
>Last-Modified:
>Originator: Vladislav Shabanov
>Release: RELENG_4
>Organization:
Rambler
>Environment:
FreeBSD index2.park.rambler.ru 4.4-RC FreeBSD 4.4-RC #2: Mon Oct 1 14:27:56 MSD
2001 root@index2.park.rambler.ru:/usr/src/sys/compile/INDEX2 i386
>Description:
sendfile does the following:
if (uap->hdtr != NULL) {
....
if (hdtr.headers != NULL) {
...
error = writev(p, &nuap);
sbytes += p->p_retval[0];
}
}
if we have headers, sbytes > 0
next, in the main loop we do the following:
...
if (uap->nbytes && xfsize > (uap->nbytes - sbytes))
xfsize = uap->nbytes - sbytes;
in this code we think that sbytes accumulates only
file`s contents. Therefore, the last NNN bytes of
file will be forgotten. (NNN = p->p_retval[0] fron writev)
>How-To-Repeat:
.
>Fix:
use separate counter for the header size:
off_t off, xfsize, sbytes = 0, sbytes1 = 0;
....
if (hdtr.headers != NULL) {
nuap.fd = uap->s;
nuap.iovp = hdtr.headers;
nuap.iovcnt = hdtr.hdr_cnt;
error = writev(p, &nuap);
if (error)
goto done;
sbytes1 = p->p_retval[0];
}
....
done:
if (uap->sbytes != NULL) {
sbytes += sbytes1;
copyout(&sbytes, uap->sbytes, sizeof(off_t));
}
>Release-Note:
>Audit-Trail:
>Unformatted:
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200201101952.g0AJqrO12027>
