diff --git a/src/pacman/callback.c b/src/pacman/callback.c index e83a97d2..1cdb1153 100644 --- a/src/pacman/callback.c +++ b/src/pacman/callback.c @@ -439,7 +439,7 @@ void cb_dl_progress(const char *filename, off_t file_xfered, off_t file_total) int len, wclen, wcwid, padwid; wchar_t *wcfname; - int totaldownload; + int totaldownload = 0; off_t xfered, total; float rate = 0.0, timediff = 0.0, f_xfered = 0.0; unsigned int eta_h = 0, eta_m = 0, eta_s = 0; @@ -456,9 +456,14 @@ void cb_dl_progress(const char *filename, off_t file_xfered, off_t file_total) /* only use TotalDownload if enabled and we have a callback value */ if(config->totaldownload && list_total) { - totaldownload = 1; - } else { - totaldownload = 0; + /* sanity check */ + if(list_xfered + file_total <= list_total) { + totaldownload = 1; + } else { + /* bogus values : don't enable totaldownload and reset */ + list_xfered = 0; + list_total = 0; + } } if(totaldownload) { @@ -469,6 +474,11 @@ void cb_dl_progress(const char *filename, off_t file_xfered, off_t file_total) total = file_total; } + /* bogus values : stop here */ + if(xfered > total) { + return; + } + /* this is basically a switch on xfered: 0, total, and * anything else */ if(file_xfered == 0) {