summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormorganamilo <morganamilo@archlinux.org>2021-05-09 16:18:17 +0200
committerAllan McRae <allan@archlinux.org>2021-05-09 23:58:44 +0200
commit618fa4f675594798825a01bd0a3462903dda6ef7 (patch)
tree176fddf85532430dd284986b4c85b6f4ad1d5dad
parentd6ffa7f56134b37efb0ea798dc6a0013e8a4d561 (diff)
downloadpacman-618fa4f675594798825a01bd0a3462903dda6ef7.tar.gz
pacman-618fa4f675594798825a01bd0a3462903dda6ef7.tar.xz
libalpm: check for duplicate filenames
This partially fixes FS#67850 It fixes the case for -S'ing packages but not -U'ing urls. pacman -S a/a b/b resolving dependencies... error: packages a and b have the same filename: a-1-1-any.pkg.tar.zst error: failed to prepare transaction (duplicate filename) Signed-off-by: Allan McRae <allan@archlinux.org>
-rw-r--r--lib/libalpm/alpm.h2
-rw-r--r--lib/libalpm/error.c2
-rw-r--r--lib/libalpm/sync.c19
3 files changed, 23 insertions, 0 deletions
diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h
index aef86d78..c4acc062 100644
--- a/lib/libalpm/alpm.h
+++ b/lib/libalpm/alpm.h
@@ -257,6 +257,8 @@ typedef enum _alpm_errno_t {
ALPM_ERR_TRANS_NULL,
/** Duplicate target in transaction */
ALPM_ERR_TRANS_DUP_TARGET,
+ /** Duplicate filename in transaction */
+ ALPM_ERR_TRANS_DUP_FILENAME,
/** A transaction has not been initialized */
ALPM_ERR_TRANS_NOT_INITIALIZED,
/** Transaction has not been prepared */
diff --git a/lib/libalpm/error.c b/lib/libalpm/error.c
index c6f19599..c06d091a 100644
--- a/lib/libalpm/error.c
+++ b/lib/libalpm/error.c
@@ -90,6 +90,8 @@ const char SYMEXPORT *alpm_strerror(alpm_errno_t err)
return _("transaction not initialized");
case ALPM_ERR_TRANS_DUP_TARGET:
return _("duplicate target");
+ case ALPM_ERR_TRANS_DUP_FILENAME:
+ return _("duplicate filename");
case ALPM_ERR_TRANS_NOT_INITIALIZED:
return _("transaction not initialized");
case ALPM_ERR_TRANS_NOT_PREPARED:
diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c
index bdfab635..7ef558c4 100644
--- a/lib/libalpm/sync.c
+++ b/lib/libalpm/sync.c
@@ -464,6 +464,25 @@ int _alpm_sync_prepare(alpm_handle_t *handle, alpm_list_t **data)
}
}
+ /* Ensure two packages don't have the same filename */
+ for(i = resolved; i; i = i->next) {
+ alpm_pkg_t *pkg1 = i->data;
+ for(j = i->next; j; j = j->next) {
+ alpm_pkg_t *pkg2 = j->data;
+ if(strcmp(pkg1->filename, pkg2->filename) == 0) {
+ alpm_list_free(resolved);
+ ret = -1;
+ handle->pm_errno = ALPM_ERR_TRANS_DUP_FILENAME;
+ _alpm_log(handle, ALPM_LOG_ERROR, _("packages %s and %s have the same filename: %s\n"),
+ pkg1->name, pkg2->name, pkg1->filename);
+ }
+ }
+ }
+
+ if(ret != 0) {
+ goto cleanup;
+ }
+
/* Set DEPEND reason for pulled packages */
for(i = resolved; i; i = i->next) {
alpm_pkg_t *pkg = i->data;