diff --git a/lib/mime.c b/lib/mime.c index 6c716e7743325a78b3bcf272b5719f88b1f30d01..1f94afee2c93300a4bf70e743dbd552075cb8b1c 100644 --- a/lib/mime.c +++ b/lib/mime.c @@ -1436,35 +1436,36 @@ CURLcode curl_mime_filedata(curl_mimepart *part, const char *filename) char *base; struct_stat sbuf; - if(stat(filename, &sbuf)) + if(stat(filename, &sbuf) || access(filename, R_OK)) result = CURLE_READ_ERROR; + + part->data = strdup(filename); + if (!part->data) + result = CURLE_OUT_OF_MEMORY; + + part->datasize = -1; + if (!result && S_ISREG(sbuf.st_mode)) { + part->datasize = filesize(filename, sbuf); + part->seekfunc = mime_file_seek; + } + + part->readfunc = mime_file_read; + part->freefunc = mime_file_free; + part->kind = MIMEKIND_FILE; + + /* As a side effect, set the filename to the current file's base name. + It is possible to withdraw this by explicitly calling + curl_mime_filename() with a NULL filename argument after the current + call. */ + base = strippath(filename); + if (!base) + result = CURLE_OUT_OF_MEMORY; else { - part->data = strdup(filename); - if(!part->data) - result = CURLE_OUT_OF_MEMORY; - else { - part->datasize = -1; - if(S_ISREG(sbuf.st_mode)) { - part->datasize = filesize(filename, sbuf); - part->seekfunc = mime_file_seek; - } + CURLcode res = curl_mime_filename(part, base); - part->readfunc = mime_file_read; - part->freefunc = mime_file_free; - part->kind = MIMEKIND_FILE; - - /* As a side effect, set the filename to the current file's base name. - It is possible to withdraw this by explicitly calling - curl_mime_filename() with a NULL filename argument after the current - call. */ - base = strippath(filename); - if(!base) - result = CURLE_OUT_OF_MEMORY; - else { - result = curl_mime_filename(part, base); - free(base); - } - } + if (res) + result = res; + free(base); } } return result;