summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan McGee <dan@archlinux.org>2007-11-15 05:51:16 +0100
committerDan McGee <dan@archlinux.org>2007-11-15 05:51:16 +0100
commitf75ee7176235f2c1a531113985d715ddcafb6d05 (patch)
tree0b43fc0659f6049dddd65624239fb3a0b30cab4c
parentc244cfecf654d34032585530f00d68501ec63d77 (diff)
downloadpacman-f75ee7176235f2c1a531113985d715ddcafb6d05.tar.gz
pacman-f75ee7176235f2c1a531113985d715ddcafb6d05.tar.xz
Fix alpm_list_copy_data
So I spent a good 4 hours tracking a bug down tonight due to alpm_list_copy_data not actually doing what I expected to do. We can't find the size of an object we don't know the type of, so rewrite it so we pass in the size explicitly. This was making _alpm_pkg_dup fail and causing all sorts of other issues. Signed-off-by: Dan McGee <dan@archlinux.org>
-rw-r--r--lib/libalpm/alpm_list.c12
-rw-r--r--lib/libalpm/alpm_list.h2
-rw-r--r--lib/libalpm/package.c6
3 files changed, 12 insertions, 8 deletions
diff --git a/lib/libalpm/alpm_list.c b/lib/libalpm/alpm_list.c
index 774d1dbe..c1e4cb8e 100644
--- a/lib/libalpm/alpm_list.c
+++ b/lib/libalpm/alpm_list.c
@@ -399,21 +399,23 @@ alpm_list_t SYMEXPORT *alpm_list_copy(const alpm_list_t *list)
/**
* @brief Copy a list and copy the data.
- *
- * The data must be constant size!
+ * Note that the data elements to be copied should not contain pointers
+ * and should also be of constant size.
*
* @param list the list to copy
+ * @param size the size of each data element
*
* @return a copy of the original list, data copied as well
*/
-alpm_list_t SYMEXPORT *alpm_list_copy_data(const alpm_list_t *list)
+alpm_list_t SYMEXPORT *alpm_list_copy_data(const alpm_list_t *list,
+ size_t size)
{
const alpm_list_t *lp = list;
alpm_list_t *newlist = NULL;
while(lp) {
- void *newdata = calloc(1, sizeof(lp->data));
+ void *newdata = calloc(1, size);
if(newdata) {
- memcpy(newdata, lp->data, sizeof(lp->data));
+ memcpy(newdata, lp->data, size);
newlist = alpm_list_add(newlist, newdata);
lp = lp->next;
}
diff --git a/lib/libalpm/alpm_list.h b/lib/libalpm/alpm_list.h
index de35f18e..b364670e 100644
--- a/lib/libalpm/alpm_list.h
+++ b/lib/libalpm/alpm_list.h
@@ -60,7 +60,7 @@ alpm_list_t *alpm_list_remove(alpm_list_t *haystack, const void *needle, alpm_li
alpm_list_t *alpm_list_remove_dupes(const alpm_list_t *list);
alpm_list_t *alpm_list_strdup(const alpm_list_t *list);
alpm_list_t *alpm_list_copy(const alpm_list_t *list);
-alpm_list_t *alpm_list_copy_data(const alpm_list_t *list);
+alpm_list_t *alpm_list_copy_data(const alpm_list_t *list, size_t size);
alpm_list_t *alpm_list_reverse(alpm_list_t *list);
/* item accessors */
diff --git a/lib/libalpm/package.c b/lib/libalpm/package.c
index 2c6fc29c..d9927668 100644
--- a/lib/libalpm/package.c
+++ b/lib/libalpm/package.c
@@ -675,12 +675,14 @@ pmpkg_t *_alpm_pkg_dup(pmpkg_t *pkg)
newpkg->conflicts = alpm_list_strdup(alpm_pkg_get_conflicts(pkg));
newpkg->files = alpm_list_strdup(alpm_pkg_get_files(pkg));
newpkg->backup = alpm_list_strdup(alpm_pkg_get_backup(pkg));
- newpkg->depends = alpm_list_copy_data(alpm_pkg_get_depends(pkg));
+ newpkg->depends = alpm_list_copy_data(alpm_pkg_get_depends(pkg),
+ sizeof(pmdepend_t));
newpkg->optdepends = alpm_list_strdup(alpm_pkg_get_optdepends(pkg));
newpkg->groups = alpm_list_strdup(alpm_pkg_get_groups(pkg));
newpkg->provides = alpm_list_strdup(alpm_pkg_get_provides(pkg));
newpkg->replaces = alpm_list_strdup(alpm_pkg_get_replaces(pkg));
- newpkg->deltas = alpm_list_copy_data(alpm_pkg_get_deltas(pkg));
+ newpkg->deltas = alpm_list_copy_data(alpm_pkg_get_deltas(pkg),
+ sizeof(pmdelta_t));
/* internal */
if(newpkg->origin == PKG_FROM_FILE) {
newpkg->origin_data.file = strdup(pkg->origin_data.file);