| @@ -50,8 +50,7 @@ struct Curl_easy; |
| #define STOP_FILLING ((size_t)-2) |
| |
| static size_t mime_subparts_read(char *buffer, size_t size, size_t nitems, |
| - | void *instream, bool *hasread, |
| - | size_t call_depth); |
| + | void *instream, bool *hasread); |
| static curl_off_t mime_size(curl_mimepart *part); |
| |
| /* Quoted-printable character class table. |
| @@ -701,14 +700,10 @@ static size_t readback_bytes(struct mime_state *state, |
| /* Read a non-encoded part content. */ |
| |
| static size_t read_part_content(curl_mimepart *part, char *buffer, |
| - | size_t bufsize, bool *hasread, |
| - | size_t call_depth) |
| + | size_t bufsize, bool *hasread) |
| { |
| size_t sz = 0; |
| |
| - | if(++call_depth > MAX_MIME_LEVELS) |
| - | return READ_ERROR; |
| - | |
| switch(part->lastreadstatus) { |
| case 0: |
| case CURL_READFUNC_ABORT: |
| @@ -731,8 +726,7 @@ static size_t read_part_content(curl_mimepart *part, char *buffer, |
| * Cannot be processed as other kinds since read function requires |
| * an additional parameter and is highly recursive. |
| */ |
| - | sz = mime_subparts_read(buffer, 1, bufsize, part->arg, hasread, |
| - | call_depth); |
| + | sz = mime_subparts_read(buffer, 1, bufsize, part->arg, hasread); |
| break; |
| case MIMEKIND_FILE: |
| if(part->fp && feof(part->fp)) |
| @@ -771,17 +765,13 @@ static size_t read_part_content(curl_mimepart *part, char *buffer, |
| |
| /* Read and encode part content. */ |
| static size_t read_encoded_part_content(curl_mimepart *part, char *buffer, |
| - | size_t bufsize, bool *hasread, |
| - | size_t call_depth) |
| + | size_t bufsize, bool *hasread) |
| { |
| struct mime_encoder_state *st = &part->encstate; |
| size_t cursize = 0; |
| size_t sz; |
| bool ateof = FALSE; |
| |
| - | if(++call_depth > MAX_MIME_LEVELS) |
| - | return READ_ERROR; |
| - | |
| for(;;) { |
| if(st->bufbeg < st->bufend || ateof) { |
| /* Encode buffered data. */ |
| @@ -814,7 +804,7 @@ static size_t read_encoded_part_content(curl_mimepart *part, char *buffer, |
| if(st->bufend >= sizeof(st->buf)) |
| return cursize ? cursize : READ_ERROR; /* Buffer full. */ |
| sz = read_part_content(part, st->buf + st->bufend, |
| - | sizeof(st->buf) - st->bufend, hasread, call_depth); |
| + | sizeof(st->buf) - st->bufend, hasread); |
| switch(sz) { |
| case 0: |
| ateof = TRUE; |
| @@ -835,14 +825,10 @@ static size_t read_encoded_part_content(curl_mimepart *part, char *buffer, |
| |
| /* Readback a mime part. */ |
| static size_t readback_part(curl_mimepart *part, |
| - | char *buffer, size_t bufsize, bool *hasread, |
| - | size_t call_depth) |
| + | char *buffer, size_t bufsize, bool *hasread) |
| { |
| size_t cursize = 0; |
| |
| - | if(++call_depth > MAX_MIME_LEVELS) |
| - | return READ_ERROR; |
| - | |
| /* Readback from part. */ |
| while(bufsize) { |
| size_t sz = 0; |
| @@ -886,10 +872,9 @@ static size_t readback_part(curl_mimepart *part, |
| break; |
| case MIMESTATE_CONTENT: |
| if(part->encoder) |
| - | sz = read_encoded_part_content(part, buffer, bufsize, hasread, |
| - | call_depth); |
| + | sz = read_encoded_part_content(part, buffer, bufsize, hasread); |
| else |
| - | sz = read_part_content(part, buffer, bufsize, hasread, call_depth); |
| + | sz = read_part_content(part, buffer, bufsize, hasread); |
| switch(sz) { |
| case 0: |
| mimesetstate(&part->state, MIMESTATE_END, NULL); |
| @@ -923,16 +908,12 @@ static size_t readback_part(curl_mimepart *part, |
| |
| /* Readback from mime. Warning: not a read callback function. */ |
| static size_t mime_subparts_read(char *buffer, size_t size, size_t nitems, |
| - | void *instream, bool *hasread, |
| - | size_t call_depth) |
| + | void *instream, bool *hasread) |
| { |
| curl_mime *mime = (curl_mime *)instream; |
| size_t cursize = 0; |
| (void)size; /* Always 1 */ |
| |
| - | if(++call_depth > MAX_MIME_LEVELS) |
| - | return READ_ERROR; |
| - | |
| while(nitems) { |
| size_t sz = 0; |
| curl_mimepart *part = mime->state.ptr; |
| @@ -967,7 +948,7 @@ static size_t mime_subparts_read(char *buffer, size_t size, size_t nitems, |
| mimesetstate(&mime->state, MIMESTATE_END, NULL); |
| break; |
| } |
| - | sz = readback_part(part, buffer, nitems, hasread, call_depth); |
| + | sz = readback_part(part, buffer, nitems, hasread); |
| switch(sz) { |
| case CURL_READFUNC_ABORT: |
| case CURL_READFUNC_PAUSE: |
| @@ -1551,7 +1532,7 @@ size_t Curl_mime_read(char *buffer, size_t size, size_t nitems, void *instream) |
| * adding any data and this loops infinitely. */ |
| do { |
| hasread = FALSE; |
| - | ret = readback_part(part, buffer, nitems, &hasread, 0); |
| + | ret = readback_part(part, buffer, nitems, &hasread); |
| /* |
| * If this is not possible to get some data without calling more than |
| * one read callback (probably because a content encoder is not able to |
| @@ -1774,11 +1755,12 @@ static CURLcode add_content_disposition(struct Curl_easy *data, |
| return CURLE_OK; |
| } |
| |
| - | CURLcode Curl_mime_prepare_headers(struct Curl_easy *data, |
| - | curl_mimepart *part, |
| - | const char *contenttype, |
| - | const char *disposition, |
| - | enum mimestrategy strategy) |
| + | static CURLcode mime_prepare_headers(struct Curl_easy *data, |
| + | curl_mimepart *part, |
| + | const char *contenttype, |
| + | const char *disposition, |
| + | enum mimestrategy strategy, |
| + | size_t call_depth) |
| { |
| curl_mime *mime = NULL; |
| const char *boundary = NULL; |
| @@ -1786,6 +1768,9 @@ CURLcode Curl_mime_prepare_headers(struct Curl_easy *data, |
| const char *cte = NULL; |
| CURLcode result = CURLE_OK; |
| |
| + | if(++call_depth > MAX_MIME_LEVELS) |
| + | return CURLE_TOO_LARGE; |
| + | |
| /* Get rid of previously prepared headers. */ |
| curl_slist_free_all(part->curlheaders); |
| part->curlheaders = NULL; |
| @@ -1874,8 +1859,8 @@ CURLcode Curl_mime_prepare_headers(struct Curl_easy *data, |
| if(content_type_match(contenttype, STRCONST("multipart/form-data"))) |
| disposition = "form-data"; |
| for(subpart = mime->firstpart; subpart; subpart = subpart->nextpart) { |
| - | result = Curl_mime_prepare_headers(data, subpart, NULL, |
| - | disposition, strategy); |
| + | result = mime_prepare_headers(data, subpart, NULL, |
| + | disposition, strategy, call_depth); |
| if(result) |
| return result; |
| } |
| @@ -1883,6 +1868,16 @@ CURLcode Curl_mime_prepare_headers(struct Curl_easy *data, |
| return result; |
| } |
| |
| + | CURLcode Curl_mime_prepare_headers(struct Curl_easy *data, |
| + | curl_mimepart *part, |
| + | const char *contenttype, |
| + | const char *disposition, |
| + | enum mimestrategy strategy) |
| + | { |
| + | return mime_prepare_headers(data, part, contenttype, disposition, |
| + | strategy, 0); |
| + | } |
| + | |
| /* Recursively reset paused status in the given part. */ |
| static void mime_unpause(curl_mimepart *part) |
| { |