diff options
author | Panu Matilainen <pmatilai@redhat.com> | 2008-03-31 09:25:18 +0300 |
---|---|---|
committer | Panu Matilainen <pmatilai@redhat.com> | 2008-03-31 09:25:18 +0300 |
commit | 58afc25abb0ebb7826c00b688fb1825d5b0087c0 (patch) | |
tree | 1006a843dd4920c6ecd286a648e287c5ed304032 /lib/rpmds.c | |
parent | ed07bf20d3bffaa4d99b4b6db2460b1046d7ead3 (diff) | |
download | rpm-58afc25abb0ebb7826c00b688fb1825d5b0087c0.tar.gz rpm-58afc25abb0ebb7826c00b688fb1825d5b0087c0.tar.bz2 rpm-58afc25abb0ebb7826c00b688fb1825d5b0087c0.zip |
Copy N + EVR into ds in rpmdsSingle() instead of just referring
- previously a ds created by rpmdsSingle() would turn invalid as soon as
the N and EVR strings were freed by caller (or went out of scope), ick
- convert the N + EVR strings passed to rpmdsSingle() to similar construct
as is returned by headerGetEntry so headerFreeData will free both the
pointers + contents.
Diffstat (limited to 'lib/rpmds.c')
-rw-r--r-- | lib/rpmds.c | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/lib/rpmds.c b/lib/rpmds.c index ac88e756b..daebcbe70 100644 --- a/lib/rpmds.c +++ b/lib/rpmds.c @@ -82,6 +82,22 @@ 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 headerGetEntry returns data so it will + * be freed by headerFreeData(). + */ +static const char ** str2hge(const char *str) +{ + const char ** arr; + char *t = xmalloc(sizeof(*arr) + strlen(str) + 1); + arr = (const char **) t; + t += sizeof(*arr); + strcpy(t, str); + arr[0] = t; + return arr; +} + rpmds rpmdsUnlink(rpmds ds, const char * msg) { if (ds == NULL) return NULL; @@ -311,12 +327,12 @@ rpmds rpmdsSingle(rpmTag tagN, const char * N, const char * EVR, rpmsenseFlags F ds->BT = now; } ds->Count = 1; - ds->N = xmalloc(sizeof(*ds->N)); - ds->N[0] = N; + + ds->N = str2hge(N); ds->Nt = RPM_FORCEFREE_TYPE; /* XXX to insure that hfd will free */ - ds->EVR = xmalloc(sizeof(*ds->EVR)); - ds->EVR[0] = EVR; + ds->EVR = str2hge(EVR); ds->EVRt = RPM_FORCEFREE_TYPE; /* XXX to insure that hfd will free */ + ds->Flags = xmalloc(sizeof(*ds->Flags)); ds->Flags[0] = Flags; ds->i = 0; |