dload: ensure callback is always initialized once
Frontends rely on an initialization call for setup between downloads. Checking for intialization after checking for a completed download can skip initialization in cases where files are small enough to be downloaded all at once (FS#56408). Relying on previous download size can result in multiple initializations if there are multiple non-transfer events prior to the download starting (fS#56468). Introduce a new cb_initialized variable to the payload struct and use it to ensure that the callback is initialized exactly once prior to any actual events. Fixes FS#56408, FS#56468 Signed-off-by: Andrew Gregory <andrew.gregory.8@gmail.com> Signed-off-by: Allan McRae <allan@archlinux.org>
This commit is contained in:
parent
d0981d4c5b
commit
59bb21fce3
2 changed files with 6 additions and 4 deletions
|
@ -133,11 +133,11 @@ static int dload_progress_cb(void *file, curl_off_t dltotal, curl_off_t dlnow,
|
|||
* 0, 0: non-download event
|
||||
* x {x>0}, x: download complete
|
||||
* x {x>0, x<y}, y {y > 0}: download progress, expected total is known */
|
||||
if(current_size == total_size) {
|
||||
payload->handle->dlcb(payload->remote_name, dlnow, dltotal);
|
||||
} else if(!payload->prevprogress) {
|
||||
if(!payload->cb_initialized) {
|
||||
payload->handle->dlcb(payload->remote_name, 0, -1);
|
||||
} else if(payload->prevprogress == current_size) {
|
||||
payload->cb_initialized = 1;
|
||||
}
|
||||
if(payload->prevprogress == current_size) {
|
||||
payload->handle->dlcb(payload->remote_name, 0, 0);
|
||||
} else {
|
||||
/* do NOT include initial_size since it wasn't part of the package's
|
||||
|
@ -732,6 +732,7 @@ void _alpm_dload_payload_reset_for_retry(struct dload_payload *payload)
|
|||
payload->initial_size += payload->prevprogress;
|
||||
payload->prevprogress = 0;
|
||||
payload->unlink_on_fail = 0;
|
||||
payload->cb_initialized = 0;
|
||||
}
|
||||
|
||||
/* vim: set noet: */
|
||||
|
|
|
@ -41,6 +41,7 @@ struct dload_payload {
|
|||
int errors_ok;
|
||||
int unlink_on_fail;
|
||||
int trust_remote_name;
|
||||
int cb_initialized;
|
||||
#ifdef HAVE_LIBCURL
|
||||
CURLcode curlerr; /* last error produced by curl */
|
||||
#endif
|
||||
|
|
Loading…
Add table
Reference in a new issue