poldek: poldek/pkgdir/dir/dir.c, poldek/pkgdir/rpmdb/rpmdb.c, poldek/pm/rpm...

mis mis at pld-linux.org
Sat May 31 15:01:45 CEST 2008


Author: mis                          Date: Sat May 31 13:01:44 2008 GMT
Module: poldek                        Tag: HEAD
---- Log message:
- fixed memleak with rpm5 - pm_rpmhdr_langs() returns tn_array

---- Files affected:
poldek/poldek/pkgdir/dir:
   dir.c (1.29 -> 1.30) 
poldek/poldek/pkgdir/rpmdb:
   rpmdb.c (1.31 -> 1.32) 
poldek/poldek/pm/rpm:
   pm_rpm.h (1.22 -> 1.23) , rpmhdr.c (1.12 -> 1.13) 
poldek/poldek:
   pkgroup.c (1.27 -> 1.28) , pkgu.c (1.40 -> 1.41) 

---- Diffs:

================================================================
Index: poldek/poldek/pkgdir/dir/dir.c
diff -u poldek/poldek/pkgdir/dir/dir.c:1.29 poldek/poldek/pkgdir/dir/dir.c:1.30
--- poldek/poldek/pkgdir/dir/dir.c:1.29	Sat Feb  2 22:49:04 2008
+++ poldek/poldek/pkgdir/dir/dir.c	Sat May 31 15:01:38 2008
@@ -250,7 +250,7 @@
         }
 
         if (pkg == NULL) {  /* not exists in previous index */
-            char **langs;
+            tn_array *langs;
             
             nnew++;
             n_assert(h);        /* loaded in previous if block */
@@ -261,10 +261,10 @@
             pkg->load_pkguinf = load_pkguinf;
 
             if ((langs = pm_rpmhdr_langs(h))) {
-                int i = 0;
-                while (langs[i])
-                    pkgdir__update_avlangs(pkgdir, langs[i++], 1);
-                free(langs);
+                int i;
+                for (i=0; i < n_array_size(langs); i++)
+                    pkgdir__update_avlangs(pkgdir, n_array_nth(langs, i), 1);
+                n_array_free(langs);
             }
             pkg->groupid = pkgroup_idx_update_rpmhdr(pkgroups, h);
             

================================================================
Index: poldek/poldek/pkgdir/rpmdb/rpmdb.c
diff -u poldek/poldek/pkgdir/rpmdb/rpmdb.c:1.31 poldek/poldek/pkgdir/rpmdb/rpmdb.c:1.32
--- poldek/poldek/pkgdir/rpmdb/rpmdb.c:1.31	Sat Feb  2 22:49:04 2008
+++ poldek/poldek/pkgdir/rpmdb/rpmdb.c	Sat May 31 15:01:39 2008
@@ -144,7 +144,7 @@
 int load_package(unsigned int recno, void *header, struct pkgdir *pkgdir) 
 {
     struct pkg  *pkg;
-    char        **langs;
+    tn_array    *langs;
         
     pkg = pm_rpm_ldhdr(pkgdir->na, header, NULL, 0, PKG_LDCAPREQS);
     
@@ -162,10 +162,10 @@
     n_array_push(pkgdir->pkgs, pkg);
 
     if ((langs = pm_rpmhdr_langs(header))) {
-        int i = 0;
-        while (langs[i])
-            pkgdir__update_avlangs(pkgdir, langs[i++], 1);
-        free(langs);
+        int i;
+        for (i=0; i < n_array_size(langs); i++)
+            pkgdir__update_avlangs(pkgdir, n_array_nth(langs, i), 1);
+        n_array_free(langs);
     }
     
     return 1;

================================================================
Index: poldek/poldek/pm/rpm/pm_rpm.h
diff -u poldek/poldek/pm/rpm/pm_rpm.h:1.22 poldek/poldek/pm/rpm/pm_rpm.h:1.23
--- poldek/poldek/pm/rpm/pm_rpm.h:1.22	Sun Feb 24 23:40:43 2008
+++ poldek/poldek/pm/rpm/pm_rpm.h	Sat May 31 15:01:39 2008
@@ -134,7 +134,7 @@
                    const char **version, const char **release,
                    const char **arch, int *color);
 
-char **pm_rpmhdr_langs(Header h);
+tn_array *pm_rpmhdr_langs(Header h);
 
 int pm_rpmhdr_get_entry(Header h, int32_t tag, void *buf, int32_t *type, int32_t *cnt);
 int pm_rpmhdr_get_raw_entry(Header h, int32_t tag, void *buf, int32_t *cnt);

================================================================
Index: poldek/poldek/pm/rpm/rpmhdr.c
diff -u poldek/poldek/pm/rpm/rpmhdr.c:1.12 poldek/poldek/pm/rpm/rpmhdr.c:1.13
--- poldek/poldek/pm/rpm/rpmhdr.c:1.12	Sun Feb 24 23:14:08 2008
+++ poldek/poldek/pm/rpm/rpmhdr.c	Sat May 31 15:01:39 2008
@@ -204,28 +204,28 @@
     return h;
 }
 
-char **pm_rpmhdr_langs(Header h)
+tn_array *pm_rpmhdr_langs(Header h)
 {
+    tn_array *alangs;
     char **langs;
-    
+    int t, n = 0, i;
+
 #ifndef HAVE_RPMPKGREAD         /* rpm < 5 */
     langs = headerGetLangs(h);
-#else
-    int cnt, type, i = 0;
-    char **tmp;
+    while (langs[n])
+        n++;
+    t = t;
     
-    pm_rpmhdr_get_entry(h, RPMTAG_HEADERI18NTABLE, &langs, &type, &cnt);
+#else
+    pm_rpmhdr_get_entry(h, RPMTAG_HEADERI18NTABLE, &langs, &t, &n);
+#endif
+
+    alangs = n_array_new(n, free, (tn_fn_cmp)strcmp);
+    for (i=0; i < n ; i++)
+        n_array_push(alangs, n_strdup(langs[i]));
     
-    /* terminate list by NULL */
-    tmp = n_malloc(sizeof(*tmp) * (cnt + 1));
-    for (i=0; i < cnt ; i++)
-        tmp[i] = n_strdup(langs[i]); /* XXX, memleak, TOFIX */
-    tmp[i] = NULL;
     free(langs);
-    langs = tmp;
-    
-#endif
-    return langs;
+    return alangs;
 }
 
 

================================================================
Index: poldek/poldek/pkgroup.c
diff -u poldek/poldek/pkgroup.c:1.27 poldek/poldek/pkgroup.c:1.28
--- poldek/poldek/pkgroup.c:1.27	Sat Feb  2 22:49:04 2008
+++ poldek/poldek/pkgroup.c	Sat May 31 15:01:39 2008
@@ -450,8 +450,9 @@
 
 int pkgroup_idx_update_rpmhdr(struct pkgroup_idx *idx, void *rpmhdr) 
 {
-    char               **langs, **groups;
-    int                i, ngroups = 0, nlangs = 0;
+    tn_array           *langs;
+    char               **groups;
+    int                i, ngroups = 0;
     struct pkgroup     *gr = NULL;
     Header             h;
 
@@ -460,26 +461,18 @@
         return 0;
 
     if (!pm_rpmhdr_get_raw_entry(h, RPMTAG_GROUP, (void*)&groups, &ngroups)) {
-        free(langs);
+        n_array_free(langs);
         return 0;
     }
-            
-
-    i = 0;
-    while (langs[i++] != NULL)
-        ;
-    
-    nlangs = i;
 
-    n_assert(nlangs >= ngroups);
+    n_assert(n_array_size(langs) >= ngroups);
 
-    DBGF("ngroups %d, %d, %d\n", ngroups, nlangs, rc);
+    DBGF("ngroups %d, %d, %d\n", ngroups, n_array_size(langs), rc);
     for (i=0; i < ngroups; i++) {
+        const char *lang = n_array_nth(langs, i);
         DBGF("   gr[%d of %d] %s\n", i, ngroups, groups[i]);
-        if (langs[i] == NULL)
-            break;
         
-        if (strcmp(langs[i], "C") == 0) {
+        if (n_str_eq(lang, "C")) {
             if ((gr = n_hash_get(idx->ht, groups[i])) == NULL) {
                 gr = pkgroup_new(n_array_size(idx->arr) + 1, groups[i]);
                 n_array_push(idx->arr, gr);
@@ -491,18 +484,17 @@
 
     if (gr != NULL) {
         for (i=0; i < ngroups; i++) {
-            if (langs[i] == NULL) 
-                break;
+            const char *lang = n_array_nth(langs, i);
             
-            if (strcmp(langs[i], "C") == 0 || *groups[i] == '\0')
+            if (n_str_eq(lang, "C") || *groups[i] == '\0')
                 continue;
             
-            pkgroup_add(gr, langs[i], groups[i]);
+            pkgroup_add(gr, lang, groups[i]);
         }
     }
 
     free(groups);
-    free(langs);
+    n_array_free(langs);
 
     if (gr)
         DBGF("gr_add %d %s\n", gr->id, gr->name);

================================================================
Index: poldek/poldek/pkgu.c
diff -u poldek/poldek/pkgu.c:1.40 poldek/poldek/pkgu.c:1.41
--- poldek/poldek/pkgu.c:1.40	Sun May 25 21:49:57 2008
+++ poldek/poldek/pkgu.c	Sat May 31 15:01:40 2008
@@ -641,9 +641,10 @@
 
 struct pkguinf *pkguinf_ldrpmhdr(tn_alloc *na, void *hdr)
 {
-    char               **langs, **summs, **descrs;
+    tn_array           *langs;
+    char               **summs, **descrs;
     int                nsumms, ndescrs;
-    int                i, n, nlangs = 0;
+    int                i, n;
     struct pkguinf     *pkgu;
     Header             h = hdr;
     
@@ -651,7 +652,7 @@
     pkgu->_ht = n_hash_new(3, NULL);
     
     if ((langs = pm_rpmhdr_langs(h))) {
-        tn_array *avlangs, *sl_langs;
+        tn_array *sl_langs = NULL;
         char *sl_lang;
 
         pm_rpmhdr_get_raw_entry(h, RPMTAG_SUMMARY, (void*)&summs, &nsumms);
@@ -661,24 +662,22 @@
         if (n > ndescrs)
             n = ndescrs;
 
-        avlangs = n_array_new(4, free, (tn_fn_cmp)strcmp);
         pkgu->_langs_rpmhdr = n_array_new(4, free, NULL);
-        
         for (i=0; i < n; i++) {
             struct pkguinf_i18n *inf;
+            const char *lang;
             
-            if (langs[i] == NULL)
+            if (n_array_size(langs) < i)
                 break;
             
-            n_array_push(avlangs, n_strdup(langs[i]));
-            n_array_push(pkgu->_langs_rpmhdr, n_strdup(langs[i]));
+            lang = n_array_nth(langs, i);
+            n_array_push(pkgu->_langs_rpmhdr, n_strdup(lang));
             
             inf = pkguinf_i18n_new(pkgu->_na, summs[i], descrs[i]);
-            n_hash_insert(pkgu->_ht, langs[i], inf);
+            n_hash_insert(pkgu->_ht, lang, inf);
         }
-        nlangs = n;
-
-        sl_langs = lc_lang_select(avlangs, lc_messages_lang());
+        
+        sl_langs = lc_lang_select(langs, lc_messages_lang());
         if (sl_langs == NULL)
             sl_lang = "C";
         else
@@ -693,11 +692,9 @@
             pkgu_set_recodable(pkgu, PKGUINF_DESCRIPTION, inf->description, sl_lang);
         }
 
-        n_array_free(avlangs);
-        if (sl_langs)
-            n_array_free(sl_langs);
+        n_array_free(langs);
+        n_array_cfree(&sl_langs);
         
-        free(langs);
         free(summs);
         free(descrs);
     }
================================================================

---- CVS-web:
    http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/poldek/poldek/pkgdir/dir/dir.c?r1=1.29&r2=1.30&f=u
    http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/poldek/poldek/pkgdir/rpmdb/rpmdb.c?r1=1.31&r2=1.32&f=u
    http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/poldek/poldek/pm/rpm/pm_rpm.h?r1=1.22&r2=1.23&f=u
    http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/poldek/poldek/pm/rpm/rpmhdr.c?r1=1.12&r2=1.13&f=u
    http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/poldek/poldek/pkgroup.c?r1=1.27&r2=1.28&f=u
    http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/poldek/poldek/pkgu.c?r1=1.40&r2=1.41&f=u



More information about the pld-cvs-commit mailing list