From: Greg Stein Date: Fri, 23 Feb 2001 13:16:51 +0000 (+0000) Subject: use apr_off_t and APR_OFF_T_FMT (for portability to 64-bit off_t systems) X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e06d05d166f54181dcdef3a52788e28db49be937;p=apache use apr_off_t and APR_OFF_T_FMT (for portability to 64-bit off_t systems) Submitted by: Jeff Trawick Reviewed by: Greg Stein git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@88288 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/modules/dav/main/mod_dav.c b/modules/dav/main/mod_dav.c index 63d923c7c2..3c7ab332d5 100644 --- a/modules/dav/main/mod_dav.c +++ b/modules/dav/main/mod_dav.c @@ -81,6 +81,7 @@ */ #include "apr_strings.h" +#include "apr_lib.h" /* for apr_is* */ #define APR_WANT_STRFUNC #include "apr_want.h" @@ -686,7 +687,7 @@ static dav_error * dav_open_lockdb(request_rec *r, int ro, dav_lockdb **lockdb) } static int dav_parse_range(request_rec *r, - off_t *range_start, off_t *range_end) + apr_off_t *range_start, apr_off_t *range_end) { const char *range_c; char *range; @@ -706,8 +707,11 @@ static int dav_parse_range(request_rec *r, } *dash = *slash = '\0'; + + /* ### atol may not be large enough for the apr_off_t */ *range_start = atol(range + 6); *range_end = atol(dash + 1); + if (*range_end < *range_start || (slash[1] != '*' && atol(slash + 1) <= *range_end)) { /* invalid range. ignore it (per S14.16 of RFC2616) */ @@ -811,8 +815,8 @@ static int dav_method_get(request_rec *r) dav_error *err; void *buffer; int has_range; - off_t range_start; - off_t range_end; + apr_off_t range_start; + apr_off_t range_end; /* set up the HTTP headers for the response */ if ((err = (*resource->hooks->set_headers)(r, resource)) != NULL) { @@ -835,8 +839,10 @@ static int dav_method_get(request_rec *r) r->status = HTTP_PARTIAL_CONTENT; apr_table_setn(r->headers_out, "Content-Range", - apr_psprintf(r->pool, "bytes %ld-%ld/*", - range_start, range_end)); + apr_psprintf(r->pool, + "bytes %" APR_OFF_T_FMT + "-%" APR_OFF_T_FMT "/*", + range_start, range_end)); ap_set_content_length(r, range_end - range_start + 1); } @@ -870,7 +876,7 @@ static int dav_method_get(request_rec *r) buffer = apr_palloc(r->pool, DAV_READ_BLOCKSIZE); while (1) { - size_t amt; + apr_size_t amt; if (!has_range) amt = DAV_READ_BLOCKSIZE; @@ -878,7 +884,7 @@ static int dav_method_get(request_rec *r) amt = DAV_READ_BLOCKSIZE; else { /* note: range_end - range_start is an ssize_t */ - amt = (size_t)(range_end - range_start + 1); + amt = (apr_size_t)(range_end - range_start + 1); } if ((err = (*resource->hooks->read_stream)(stream, buffer, @@ -954,8 +960,8 @@ static int dav_method_put(request_rec *r) dav_stream *stream; dav_response *multi_response; int has_range; - off_t range_start; - off_t range_end; + apr_off_t range_start; + apr_off_t range_end; if ((result = ap_setup_client_block(r, REQUEST_CHUNKED_DECHUNK)) != OK) { return result;