On Wed, Nov 02, 2005 at 11:21:18AM +0000, Joe Orton wrote:
> On Wed, Nov 02, 2005 at 10:44:02AM +0000, Colm MacCarthaigh wrote:
> > On Wed, Nov 02, 2005 at 10:33:50AM +0000, Joe Orton wrote:
> > > This sounds very confused.  On 64-bit platforms there are never any 
> > > magic CFLAGS needed, no sendfile64() needed, and should be no problems 
> > > handling >2Gb files in the first place.
> > 
> > Doesn't seem to be that way on IA64, my sys/sendfile.h has:
> 
> off_t is 64-bit on IA64, the LFS stuff is probably just there for -m32 
> builds or compatibility.  I just tested a 3Gb download with 2.1.9 on my 
> x86_64 box and it worked fine.  (as it should with 2.0.x also; nothing 
> really has changed on this front in 2.1.x for 64-bit builds)

I think you're right, and I think I've found the source of the problem:
apr's network_io/unix/sendrecv.c has:

    #if APR_HAS_LARGE_FILES && defined(HAVE_SENDFILE64)
        apr_off_t off = *offset;
    #define sendfile sendfile64
    
    #elif APR_HAS_LARGE_FILES && SIZEOF_OFF_T == 4
        /* 64-bit apr_off_t but no sendfile64(): fail if trying to send
         * past the 2Gb limit. */
        off_t off;
    
        if ((apr_int64_t)*offset + *len > INT_MAX) {
            return EINVAL;
        }
    
and it's the latter branch that gets trigged on IA64, because
APR_HAS_LARGE_FILES is defined but HAVE_SENDFILE64 isn't. The trouble is
that INT_MAX is;

        #  define INT_MAX       2147483647

so, apr_socket_sendfile is returning EINVAL when it shouldn't be.

-- 
Colm MacCárthaigh                        Public Key: [EMAIL PROTECTED]

Reply via email to