Previously successfull but non 200 responses would still be written to
disk before trying the next server. This would lead to the next download
resuming with the html response in the file.

---

v2: ensure allow_resume is passed to callback
Signed-off-by: morganamilo <morganam...@archlinux.org>
---
 lib/libalpm/dload.c | 13 ++++++-------
 1 file changed, 6 insertions(+), 7 deletions(-)

diff --git a/lib/libalpm/dload.c b/lib/libalpm/dload.c
index 2d8b4d6d..734132d3 100644
--- a/lib/libalpm/dload.c
+++ b/lib/libalpm/dload.c
@@ -404,7 +404,7 @@ static FILE *create_tempfile(struct dload_payload *payload, 
const char *localpat
 }
 
 /* Return 0 if retry was successful, -1 otherwise */
-static int curl_retry_next_server(CURLM *curlm, CURL *curl, struct 
dload_payload *payload)
+static int curl_retry_next_server(CURLM *curlm, CURL *curl, struct 
dload_payload *payload, int allow_resume)
 {
        const char *server;
        size_t len;
@@ -428,10 +428,9 @@ static int curl_retry_next_server(CURLM *curlm, CURL 
*curl, struct dload_payload
        MALLOC(payload->fileurl, len, RET_ERR(handle, ALPM_ERR_MEMORY, -1));
        snprintf(payload->fileurl, len, "%s/%s", server, payload->filepath);
 
-
        fflush(payload->localf);
 
-       if(payload->allow_resume && stat(payload->tempfile_name, &st) == 0) {
+       if(allow_resume && stat(payload->tempfile_name, &st) == 0) {
                /* a previous partial download exists, resume from end of file. 
*/
                payload->tempfile_openmode = "ab";
                curl_easy_setopt(curl, CURLOPT_RESUME_FROM_LARGE, 
(curl_off_t)st.st_size);
@@ -449,7 +448,7 @@ static int curl_retry_next_server(CURLM *curlm, CURL *curl, 
struct dload_payload
 
        if(handle->dlcb && !payload->signature) {
                alpm_download_event_retry_t cb_data;
-               cb_data.resume = payload->allow_resume;
+               cb_data.resume = allow_resume;
                handle->dlcb(handle->dlcb_ctx, payload->remote_name, 
ALPM_DOWNLOAD_RETRY, &cb_data);
        }
 
@@ -510,7 +509,7 @@ static int curl_check_finished_download(CURLM *curlm, 
CURLMsg *msg,
                                                        payload->remote_name, 
hostname, payload->error_buffer);
                                        server_soft_error(handle, 
payload->fileurl);
                                }
-                               if(curl_retry_next_server(curlm, curl, payload) 
== 0) {
+                               if(curl_retry_next_server(curlm, curl, payload, 
0) == 0) {
                                        (*active_downloads_num)++;
                                        return 2;
                                } else {
@@ -537,7 +536,7 @@ static int curl_check_finished_download(CURLM *curlm, 
CURLMsg *msg,
                                        _("failed retrieving file '%s' from %s 
: %s\n"),
                                        payload->remote_name, hostname, 
payload->error_buffer);
                        server_hard_error(handle, payload->fileurl);
-                       if(curl_retry_next_server(curlm, curl, payload) == 0) {
+                       if(curl_retry_next_server(curlm, curl, payload, 
payload->allow_resume) == 0) {
                                (*active_downloads_num)++;
                                return 2;
                        } else {
@@ -556,7 +555,7 @@ static int curl_check_finished_download(CURLM *curlm, 
CURLMsg *msg,
                                                "failed retrieving file '%s' 
from %s : %s\n",
                                                payload->remote_name, hostname, 
payload->error_buffer);
                        }
-                       if(curl_retry_next_server(curlm, curl, payload) == 0) {
+                       if(curl_retry_next_server(curlm, curl, payload, 
payload->allow_resume) == 0) {
                                (*active_downloads_num)++;
                                return 2;
                        } else {
-- 
2.31.1

Reply via email to