APLOG_USE_MODULE(http);
static int ap_set_byterange(request_rec *r, apr_off_t clength,
- apr_array_header_t *indexes);
+ apr_array_header_t **indexes);
/*
* Here we try to be compatible with clients that want multipart/x-byteranges
}
#define BYTERANGE_FMT "%" APR_OFF_T_FMT "-%" APR_OFF_T_FMT "/%" APR_OFF_T_FMT
+#define MAX_PREALLOC_RANGES 100
static apr_status_t copy_brigade_range(apr_bucket_brigade *bb,
apr_bucket_brigade *bbout,
indexes_t *idx;
int i;
- indexes = apr_array_make(r->pool, 10, sizeof(indexes_t));
-
/*
* Iterate through the brigade until reaching EOS or a bucket with
* unknown length.
return ap_pass_brigade(f->next, bb);
}
- num_ranges = ap_set_byterange(r, clength, indexes);
+ num_ranges = ap_set_byterange(r, clength, &indexes);
/* We have nothing to do, get out of the way. */
if (num_ranges == 0) {
}
static int ap_set_byterange(request_rec *r, apr_off_t clength,
- apr_array_header_t *indexes)
+ apr_array_header_t **indexes)
{
const char *range, *or;
const char *if_range;
int in_merge = 0;
indexes_t *idx;
int overlaps = 0, reversals = 0;
+ int i, ranges = 1;
+ const char *it;
if (r->assbackwards) {
return 0;
range += 6;
or = apr_pstrdup(r->pool, range);
- merged = apr_array_make(r->pool, 10, sizeof(char *));
+ it = range;
+ for (i = 0; i < strlen(it); i++) {
+ if (*it == ',') {
+ ranges++;
+ }
+ }
+ if (ranges > MAX_PREALLOC_RANGES) {
+ ranges = MAX_PREALLOC_RANGES;
+ }
+ *indexes = apr_array_make(r->pool, ranges, sizeof(indexes_t));
+ merged = apr_array_make(r->pool, ranges, sizeof(char *));
while ((cur = ap_getword(r->pool, &range, ','))) {
char *dash;
char *errp;
new = (char **)apr_array_push(merged);
*new = apr_psprintf(r->pool, "%" APR_OFF_T_FMT "-%" APR_OFF_T_FMT,
ostart, oend);
- idx = (indexes_t *)apr_array_push(indexes);
+ idx = (indexes_t *)apr_array_push(*indexes);
idx->start = ostart;
idx->end = oend;
sum_lengths += oend - ostart + 1;
new = (char **)apr_array_push(merged);
*new = apr_psprintf(r->pool, "%" APR_OFF_T_FMT "-%" APR_OFF_T_FMT,
ostart, oend);
- idx = (indexes_t *)apr_array_push(indexes);
+ idx = (indexes_t *)apr_array_push(*indexes);
idx->start = ostart;
idx->end = oend;
sum_lengths += oend - ostart + 1;