From a46dd884ec348b3ce23b9f53302e6626a90ae631 Mon Sep 17 00:00:00 2001 From: Panu Matilainen Date: Tue, 20 Jan 2009 12:55:35 +0200 Subject: [PATCH] rpmdsMerge() expects ds->N and ds->EVR as argv-style arrays (ticket #22) - use rpmdsDupArgv() instead of cloning headerGet() behavior to fix this for rpmdsSingle() and rpmdsThis() generated dependency sets - this is a regression from rpm 4.4.x, but for rpmdsNew() created sets rpmdsMerge() has never worked as headerGet() doesn't return NULL terminated arrays --- lib/rpmds.c | 32 ++++++-------------------------- 1 file changed, 6 insertions(+), 26 deletions(-) diff --git a/lib/rpmds.c b/lib/rpmds.c index f102884..45b43bc 100644 --- a/lib/rpmds.c +++ b/lib/rpmds.c @@ -43,6 +43,8 @@ struct rpmds_s { int nrefs; /*!< Reference count. */ }; +static const char ** rpmdsDupArgv(const char ** argv, int argc); + static int dsType(rpmTag tag, const char ** Type, rpmTag * tagEVR, rpmTag * tagF) { @@ -80,28 +82,6 @@ static int dsType(rpmTag tag, return rc; } -/* - * Dupe a string into string array (of size 1) + contents stored in a single - * allocation block similarly to how header data is returned so it will - * be freed by single free(). - */ -static const char ** str2hge(const char *str) -{ - const char ** arr; - size_t slen = str ? strlen(str) + 1 : 0; - char *t = xmalloc(sizeof(*arr) + slen); - arr = (const char **) t; - - if (str) { - t += sizeof(*arr); - strcpy(t, str); - } else { - t = NULL; - } - arr[0] = t; - return arr; -} - rpmds rpmdsUnlink(rpmds ds, const char * msg) { if (ds == NULL) return NULL; @@ -263,8 +243,8 @@ rpmds rpmdsThis(Header h, rpmTag tagN, rpmsenseFlags Flags) ds->tagN = tagN; ds->Count = 1; ds->nopromote = _rpmds_nopromote; - ds->N = str2hge(n); - ds->EVR = str2hge(evr); + ds->N = rpmdsDupArgv(&n, 1); + ds->EVR = rpmdsDupArgv((const char **)&evr, 1); free(evr); ds->Flags = xmalloc(sizeof(*ds->Flags)); ds->Flags[0] = Flags; @@ -298,8 +278,8 @@ rpmds rpmdsSingle(rpmTag tagN, const char * N, const char * EVR, rpmsenseFlags F ds->Count = 1; ds->nopromote = _rpmds_nopromote; - ds->N = str2hge(N); - ds->EVR = str2hge(EVR); + ds->N = rpmdsDupArgv(&N, 1); + ds->EVR = rpmdsDupArgv(&EVR, 1); ds->Flags = xmalloc(sizeof(*ds->Flags)); ds->Flags[0] = Flags; -- 2.7.4