[pacman-dev] [PATCH] db.c: require unique database names

Andrew Gregory andrew.gregory.8 at gmail.com
Sat Nov 30 20:45:02 EST 2013


Allowing multiple databases with the same name causes conflicts as they
both point to the same database file but may use different servers,
usages, or siglevels.

Signed-off-by: Andrew Gregory <andrew.gregory.8 at gmail.com>
---
 doc/pacman.conf.5.txt |  9 +++++----
 lib/libalpm/db.c      | 13 +++++++++++++
 2 files changed, 18 insertions(+), 4 deletions(-)

diff --git a/doc/pacman.conf.5.txt b/doc/pacman.conf.5.txt
index 8cd2d0e..9c3dffe 100644
--- a/doc/pacman.conf.5.txt
+++ b/doc/pacman.conf.5.txt
@@ -202,10 +202,11 @@ Repository Sections
 -------------------
 Each repository section defines a section name and at least one location where
 the packages can be found. The section name is defined by the string within
-square brackets (the two above are 'current'  and  'custom'). Locations are
-defined with the 'Server' directive and follow a URL naming structure. If you
-want to use a local directory, you can specify the full path with a ``file://''
-prefix, as shown above.
+square brackets (the two above are 'core'  and  'custom'). Repository names
+must be unique and the name 'local' is reserved for the database of installed
+packages. Locations are defined with the 'Server' directive and follow a URL
+naming structure. If you want to use a local directory, you can specify the
+full path with a ``file://'' prefix, as shown above.
 
 A common way to define DB locations utilizes the 'Include' directive. For each
 repository defined in the configuration file, a single 'Include' directive can
diff --git a/lib/libalpm/db.c b/lib/libalpm/db.c
index 528b04b..2069a7b 100644
--- a/lib/libalpm/db.c
+++ b/lib/libalpm/db.c
@@ -46,6 +46,8 @@
 alpm_db_t SYMEXPORT *alpm_register_syncdb(alpm_handle_t *handle,
 		const char *treename, alpm_siglevel_t level)
 {
+	alpm_list_t *i;
+
 	/* Sanity checks */
 	CHECK_HANDLE(handle, return NULL);
 	ASSERT(treename != NULL && strlen(treename) != 0,
@@ -53,6 +55,17 @@ alpm_db_t SYMEXPORT *alpm_register_syncdb(alpm_handle_t *handle,
 	/* Do not register a database if a transaction is on-going */
 	ASSERT(handle->trans == NULL, RET_ERR(handle, ALPM_ERR_TRANS_NOT_NULL, NULL));
 
+	/* ensure database name is unique */
+	if(strcmp(treename, "local") == 0) {
+			RET_ERR(handle, ALPM_ERR_DB_NOT_NULL, NULL);
+	}
+	for(i = handle->dbs_sync; i; i = i->next) {
+		alpm_db_t *d = i->data;
+		if(strcmp(treename, d->treename) == 0) {
+			RET_ERR(handle, ALPM_ERR_DB_NOT_NULL, NULL);
+		}
+	}
+
 	return _alpm_db_register_sync(handle, treename, level);
 }
 
-- 
1.8.4.2



More information about the pacman-dev mailing list