mirror of
https://github.com/moparisthebest/pacman
synced 2024-12-23 00:08:50 -05:00
Give sensible feedback when a repo has no configured servers
This fixes FS#14899. When running an -Sp operation without servers configured for a repository, we would segfault, so add an assert to the backend method returning the first server preventing a null pointer dereference. In addition, add a new error code to libalpm that indicates we have no servers configured for a repository. This makes -Sy and -S <package> operations fail gracefully and helpfully when a repo is set up with no servers, as the default mirrorlist in Arch is provided this way. Signed-off-by: Dan McGee <dan@archlinux.org>
This commit is contained in:
parent
19b8b63885
commit
aa579b8438
@ -480,6 +480,7 @@ enum _pmerrno_t {
|
|||||||
PM_ERR_DB_REMOVE,
|
PM_ERR_DB_REMOVE,
|
||||||
/* Servers */
|
/* Servers */
|
||||||
PM_ERR_SERVER_BAD_URL,
|
PM_ERR_SERVER_BAD_URL,
|
||||||
|
PM_ERR_SERVER_NONE,
|
||||||
/* Transactions */
|
/* Transactions */
|
||||||
PM_ERR_TRANS_NOT_NULL,
|
PM_ERR_TRANS_NOT_NULL,
|
||||||
PM_ERR_TRANS_NULL,
|
PM_ERR_TRANS_NULL,
|
||||||
|
@ -232,6 +232,7 @@ const char SYMEXPORT *alpm_db_get_url(const pmdb_t *db)
|
|||||||
/* Sanity checks */
|
/* Sanity checks */
|
||||||
ASSERT(handle != NULL, return(NULL));
|
ASSERT(handle != NULL, return(NULL));
|
||||||
ASSERT(db != NULL, return(NULL));
|
ASSERT(db != NULL, return(NULL));
|
||||||
|
ASSERT(db->servers != NULL, return(NULL));
|
||||||
|
|
||||||
url = (char*)db->servers->data;
|
url = (char*)db->servers->data;
|
||||||
|
|
||||||
|
@ -388,6 +388,8 @@ int _alpm_download_single_file(const char *filename,
|
|||||||
alpm_list_t *i;
|
alpm_list_t *i;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
|
|
||||||
|
ASSERT(servers != NULL, RET_ERR(PM_ERR_SERVER_NONE, -1));
|
||||||
|
|
||||||
for(i = servers; i; i = i->next) {
|
for(i = servers; i; i = i->next) {
|
||||||
const char *server = i->data;
|
const char *server = i->data;
|
||||||
char *fileurl = NULL;
|
char *fileurl = NULL;
|
||||||
|
@ -84,6 +84,8 @@ const char SYMEXPORT *alpm_strerror(int err)
|
|||||||
/* Servers */
|
/* Servers */
|
||||||
case PM_ERR_SERVER_BAD_URL:
|
case PM_ERR_SERVER_BAD_URL:
|
||||||
return _("invalid url for server");
|
return _("invalid url for server");
|
||||||
|
case PM_ERR_SERVER_NONE:
|
||||||
|
return _("no servers configured for repository");
|
||||||
/* Transactions */
|
/* Transactions */
|
||||||
case PM_ERR_TRANS_NOT_NULL:
|
case PM_ERR_TRANS_NOT_NULL:
|
||||||
return _("transaction already initialized");
|
return _("transaction already initialized");
|
||||||
|
@ -769,7 +769,9 @@ int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t **data)
|
|||||||
if(_alpm_download_files(files, current->servers, cachedir)) {
|
if(_alpm_download_files(files, current->servers, cachedir)) {
|
||||||
_alpm_log(PM_LOG_WARNING, _("failed to retrieve some files from %s\n"),
|
_alpm_log(PM_LOG_WARNING, _("failed to retrieve some files from %s\n"),
|
||||||
current->treename);
|
current->treename);
|
||||||
pm_errno = PM_ERR_RETRIEVE;
|
if(pm_errno == 0) {
|
||||||
|
pm_errno = PM_ERR_RETRIEVE;
|
||||||
|
}
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
FREELIST(files);
|
FREELIST(files);
|
||||||
|
@ -675,7 +675,15 @@ static int sync_trans(alpm_list_t *targets)
|
|||||||
for(i = packages; i; i = alpm_list_next(i)) {
|
for(i = packages; i; i = alpm_list_next(i)) {
|
||||||
pmpkg_t *pkg = alpm_list_getdata(i);
|
pmpkg_t *pkg = alpm_list_getdata(i);
|
||||||
pmdb_t *db = alpm_pkg_get_db(pkg);
|
pmdb_t *db = alpm_pkg_get_db(pkg);
|
||||||
printf("%s/%s\n", alpm_db_get_url(db), alpm_pkg_get_filename(pkg));
|
const char *dburl = alpm_db_get_url(db);
|
||||||
|
if(dburl) {
|
||||||
|
printf("%s/%s\n", dburl, alpm_pkg_get_filename(pkg));
|
||||||
|
} else {
|
||||||
|
/* can't use WARNING here, we don't show warnings in -Sp... */
|
||||||
|
pm_fprintf(stderr, PM_LOG_ERROR, _("no database for package: %s\n"),
|
||||||
|
alpm_pkg_get_name(pkg));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
/* we are done */
|
/* we are done */
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
Loading…
Reference in New Issue
Block a user