Skip site navigation (1)Skip section navigation (2)
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>