Handle .part files that are the size of the correct package
In rare cases, likely due to a well timed Ctrl+C, but possibly due to a
broken mirror, a ".part" file may have size at least that of the correct
package size.
When encountering this issue, currently pacman fails in different ways
depending on where the package falls in the list to download. If last,
"wrong or NULL argument passed" error is reported, or a "invalid or
corrupt package" issue if not.
Capture these .part files, and remove the extension. This lets pacman
either use the package if valid, or offer to remove it if it fails checksum
or signature verification.
Signed-off-by: Allan McRae <allan@archlinux.org>
(cherry picked from commit e6a6d30793
)
This commit is contained in:
parent
c2fa9f85cc
commit
76c50e3439
2 changed files with 18 additions and 2 deletions
|
@ -414,6 +414,12 @@ static int curl_download_internal(struct dload_payload *payload,
|
||||||
|
|
||||||
curl_set_handle_opts(payload, curl, error_buffer);
|
curl_set_handle_opts(payload, curl, error_buffer);
|
||||||
|
|
||||||
|
if(payload->max_size == payload->initial_size) {
|
||||||
|
/* .part file is complete */
|
||||||
|
ret = 0;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
if(localf == NULL) {
|
if(localf == NULL) {
|
||||||
localf = fopen(payload->tempfile_name, payload->tempfile_openmode);
|
localf = fopen(payload->tempfile_name, payload->tempfile_openmode);
|
||||||
if(localf == NULL) {
|
if(localf == NULL) {
|
||||||
|
|
|
@ -731,6 +731,8 @@ static int find_dl_candidates(alpm_db_t *repo, alpm_list_t **files)
|
||||||
alpm_pkg_t *spkg = i->data;
|
alpm_pkg_t *spkg = i->data;
|
||||||
|
|
||||||
if(spkg->origin != ALPM_PKG_FROM_FILE && repo == spkg->origin_data.db) {
|
if(spkg->origin != ALPM_PKG_FROM_FILE && repo == spkg->origin_data.db) {
|
||||||
|
char *fpath = NULL;
|
||||||
|
|
||||||
if(!repo->servers) {
|
if(!repo->servers) {
|
||||||
handle->pm_errno = ALPM_ERR_SERVER_NONE;
|
handle->pm_errno = ALPM_ERR_SERVER_NONE;
|
||||||
_alpm_log(handle, ALPM_LOG_ERROR, "%s: %s\n",
|
_alpm_log(handle, ALPM_LOG_ERROR, "%s: %s\n",
|
||||||
|
@ -738,13 +740,21 @@ static int find_dl_candidates(alpm_db_t *repo, alpm_list_t **files)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(spkg->download_size != 0) {
|
ASSERT(spkg->filename != NULL, RET_ERR(handle, ALPM_ERR_PKG_INVALID_NAME, -1));
|
||||||
|
|
||||||
|
if(spkg->download_size == 0) {
|
||||||
|
/* check for file in cache - allows us to handle complete .part files */
|
||||||
|
fpath = _alpm_filecache_find(handle, spkg->filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(spkg->download_size != 0 || !fpath) {
|
||||||
struct dload_payload *payload;
|
struct dload_payload *payload;
|
||||||
ASSERT(spkg->filename != NULL, RET_ERR(handle, ALPM_ERR_PKG_INVALID_NAME, -1));
|
|
||||||
payload = build_payload(handle, spkg->filename, spkg->size, repo->servers);
|
payload = build_payload(handle, spkg->filename, spkg->size, repo->servers);
|
||||||
ASSERT(payload, return -1);
|
ASSERT(payload, return -1);
|
||||||
*files = alpm_list_add(*files, payload);
|
*files = alpm_list_add(*files, payload);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FREE(fpath);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue