mirror of
https://github.com/moparisthebest/pacman
synced 2024-12-22 07:48:50 -05:00
Attempt to fix up some of the brokenness around failed package loads
This is a bit of a mess, due to the fact that we have a progress meter running. It is also ironic that we are in the midst of a method named "commit" when we haven't done a damn thing yet, and can still fail hard if either a checksum or signature is invalid or unrecognized. Adapt the former test_md5sum method to be invoked for any of the various failure types, which at least gives the user some indication of what packages are failing. A second patch will be needed to actually show worthwhile error codes, but this is going to involve modifying the actual data passed with the callback. Signed-off-by: Dan McGee <dan@archlinux.org>
This commit is contained in:
parent
1d16875db7
commit
9d09c9fdf7
@ -1093,6 +1093,7 @@ enum _alpm_errno_t {
|
||||
ALPM_ERR_PKG_NOT_FOUND,
|
||||
ALPM_ERR_PKG_IGNORED,
|
||||
ALPM_ERR_PKG_INVALID,
|
||||
ALPM_ERR_PKG_INVALID_CHECKSUM,
|
||||
ALPM_ERR_PKG_INVALID_SIG,
|
||||
ALPM_ERR_PKG_OPEN,
|
||||
ALPM_ERR_PKG_CANT_REMOVE,
|
||||
|
@ -313,7 +313,7 @@ alpm_pkg_t *_alpm_pkg_load_internal(alpm_handle_t *handle, const char *pkgfile,
|
||||
_alpm_log(handle, ALPM_LOG_DEBUG, "checking md5sum for %s\n", pkgfile);
|
||||
if(_alpm_test_md5sum(pkgfile, md5sum) != 0) {
|
||||
alpm_pkg_free(newpkg);
|
||||
RET_ERR(handle, ALPM_ERR_PKG_INVALID, NULL);
|
||||
RET_ERR(handle, ALPM_ERR_PKG_INVALID_CHECKSUM, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -108,6 +108,8 @@ const char SYMEXPORT *alpm_strerror(enum _alpm_errno_t err)
|
||||
case ALPM_ERR_PKG_IGNORED:
|
||||
return _("operation cancelled due to ignorepkg");
|
||||
case ALPM_ERR_PKG_INVALID:
|
||||
return _("invalid or corrupted package");
|
||||
case ALPM_ERR_PKG_INVALID_CHECKSUM:
|
||||
return _("invalid or corrupted package (checksum)");
|
||||
case ALPM_ERR_PKG_INVALID_SIG:
|
||||
return _("invalid or corrupted package (PGP signature)");
|
||||
|
@ -677,24 +677,18 @@ static int apply_deltas(alpm_handle_t *handle)
|
||||
*
|
||||
* @param trans the transaction
|
||||
* @param filename the absolute path of the file to test
|
||||
* @param md5sum the expected md5sum of the file
|
||||
*
|
||||
* @return 0 if the md5sum matched, 1 if not, -1 in case of errors
|
||||
* @return 1 if file was removed, 0 otherwise
|
||||
*/
|
||||
static int test_md5sum(alpm_trans_t *trans, const char *filepath,
|
||||
const char *md5sum)
|
||||
static int prompt_to_delete(alpm_trans_t *trans, const char *filepath)
|
||||
{
|
||||
int ret = _alpm_test_md5sum(filepath, md5sum);
|
||||
if(ret == 1) {
|
||||
int doremove = 0;
|
||||
QUESTION(trans, ALPM_TRANS_CONV_CORRUPTED_PKG, (char *)filepath,
|
||||
NULL, NULL, &doremove);
|
||||
if(doremove) {
|
||||
unlink(filepath);
|
||||
}
|
||||
int doremove = 0;
|
||||
QUESTION(trans, ALPM_TRANS_CONV_CORRUPTED_PKG, (char *)filepath,
|
||||
NULL, NULL, &doremove);
|
||||
if(doremove) {
|
||||
unlink(filepath);
|
||||
}
|
||||
|
||||
return ret;
|
||||
return doremove;
|
||||
}
|
||||
|
||||
static int validate_deltas(alpm_handle_t *handle, alpm_list_t *deltas,
|
||||
@ -715,7 +709,9 @@ static int validate_deltas(alpm_handle_t *handle, alpm_list_t *deltas,
|
||||
alpm_delta_t *d = alpm_list_getdata(i);
|
||||
char *filepath = _alpm_filecache_find(handle, d->delta);
|
||||
|
||||
if(test_md5sum(trans, filepath, d->delta_md5) != 0) {
|
||||
ret = _alpm_test_md5sum(filepath, d->delta_md5);
|
||||
if(ret != 0) {
|
||||
prompt_to_delete(trans, filepath);
|
||||
errors++;
|
||||
*data = alpm_list_add(*data, strdup(d->delta));
|
||||
}
|
||||
@ -903,6 +899,7 @@ int _alpm_sync_commit(alpm_handle_t *handle, alpm_list_t **data)
|
||||
alpm_pkg_t *pkgfile =_alpm_pkg_load_internal(handle, filepath, 1, spkg->md5sum,
|
||||
spkg->base64_sig, level);
|
||||
if(!pkgfile) {
|
||||
prompt_to_delete(trans, filepath);
|
||||
errors++;
|
||||
*data = alpm_list_add(*data, strdup(filename));
|
||||
FREE(filepath);
|
||||
@ -920,7 +917,10 @@ int _alpm_sync_commit(alpm_handle_t *handle, alpm_list_t **data)
|
||||
|
||||
|
||||
if(errors) {
|
||||
RET_ERR(handle, ALPM_ERR_PKG_INVALID, -1);
|
||||
if(!handle->pm_errno) {
|
||||
RET_ERR(handle, ALPM_ERR_PKG_INVALID, -1);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(trans->flags & ALPM_TRANS_FLAG_DOWNLOADONLY) {
|
||||
|
@ -844,9 +844,11 @@ int sync_prepare_execute(void)
|
||||
}
|
||||
break;
|
||||
case ALPM_ERR_PKG_INVALID:
|
||||
case ALPM_ERR_PKG_INVALID_CHECKSUM:
|
||||
case ALPM_ERR_PKG_INVALID_SIG:
|
||||
case ALPM_ERR_DLT_INVALID:
|
||||
for(i = data; i; i = alpm_list_next(i)) {
|
||||
char *filename = alpm_list_getdata(i);
|
||||
const char *filename = alpm_list_getdata(i);
|
||||
printf(_("%s is invalid or corrupted\n"), filename);
|
||||
}
|
||||
break;
|
||||
|
Loading…
Reference in New Issue
Block a user