--- IO-AIO/AIO.xs 2007/06/01 13:25:51 1.101 +++ IO-AIO/AIO.xs 2007/06/03 09:44:17 1.102 @@ -1423,7 +1423,7 @@ } void -aio_read (SV *fh, SV *offset, UV length, SV8 *data, UV dataoffset, SV *callback=&PL_sv_undef) +aio_read (SV *fh, SV *offset, SV *length, SV8 *data, IV dataoffset, SV *callback=&PL_sv_undef) ALIAS: aio_read = REQ_READ aio_write = REQ_WRITE @@ -1432,6 +1432,7 @@ { STRLEN svlen; char *svptr = SvPVbyte (data, svlen); + UV len = SvUV (length); SvUPGRADE (data, SVt_PV); SvPOK_on (data); @@ -1440,21 +1441,21 @@ dataoffset += svlen; if (dataoffset < 0 || dataoffset > svlen) - croak ("data offset outside of string"); + croak ("dataoffset outside of data scalar"); if (ix == REQ_WRITE) { /* write: check length and adjust. */ - if (length < 0 || length + dataoffset > svlen) - length = svlen - dataoffset; + if (!SvOK (length) || len + dataoffset > svlen) + len = svlen - dataoffset; } else { /* read: grow scalar as necessary */ - svptr = SvGROW (data, length + dataoffset + 1); + svptr = SvGROW (data, len + dataoffset + 1); } - if (length < 0) + if (len < 0) croak ("length must not be negative"); { @@ -1465,7 +1466,7 @@ req->int1 = PerlIO_fileno (ix == REQ_READ ? IoIFP (sv_2io (fh)) : IoOFP (sv_2io (fh))); req->offs = SvOK (offset) ? SvVAL64 (offset) : -1; - req->size = length; + req->size = len; req->sv2 = SvREFCNT_inc (data); req->ptr1 = (char *)svptr + dataoffset; req->stroffset = dataoffset;