Changed some safemalloc calls to New/Newz. Put a fix in FIRSTKEY to avoid
authorrjray <devnull@localhost>
Fri, 10 May 2002 07:37:08 +0000 (07:37 +0000)
committerrjray <devnull@localhost>
Fri, 10 May 2002 07:37:08 +0000 (07:37 +0000)
getting a null back from the initial tag look-up. Cause DESTROY to free some
memory that was being forgotten. Pulled out all the 3.0 and pre-4.0.3 support
code.

CVS patchset: 5428
CVS date: 2002/05/10 07:37:08

Perl-RPM/RPM/Header.xs

index db754a9..cefef06 100644 (file)
@@ -8,7 +8,7 @@
 #  define RPMERR_READERROR RPMERR_READ
 #endif
 
-static char * const rcsid = "$Id: Header.xs,v 1.25 2002/04/11 23:06:01 rjray Exp $";
+static char * const rcsid = "$Id: Header.xs,v 1.26 2002/05/10 07:37:08 rjray Exp $";
 static int scalar_tag(pTHX_ SV *, int);
 
 /*
@@ -250,7 +250,7 @@ static int new_from_fname(pTHX_ const char* source, RPM_Header* new_hdr)
     if ((retval = new_from_fd_t(fd, new_hdr)))
     {
         Fclose(fd);
-        new_hdr->source_name = safemalloc(strlen(source) + 1);
+        New(0, new_hdr->source_name, strlen(source) + 1, char);
         strcpy(new_hdr->source_name, source);
     }
 
@@ -265,8 +265,7 @@ RPM__Header rpmhdr_TIEHASH(pTHX_ char* class, SV* source, int flags)
     RPM_Header* retvalp; /* Use this to store the actual C-level data */
     SV* t_magic;  
 
-    retvalp = new_RPM_storage(RPM_Header);
-    Zero(retvalp, 1, RPM_Header);
+    Newz(0, retvalp, 1, RPM_Header);
     RETVAL = Nullhv;
 
     if (! source)
@@ -355,7 +354,7 @@ SV* rpmhdr_FETCH(pTHX_ RPM__Header self, SV* key,
     if (! (name && (namelen = strlen(name))))
         return FETCH;
 
-    uc_name = safemalloc(namelen + 3);
+    New(0, uc_name, namelen+3, char);
     for (i = 0; i < namelen; i++)
         uc_name[i] = toUPPER(name[i]);
     uc_name[i] = '\0';
@@ -453,7 +452,7 @@ int rpmhdr_STORE(pTHX_ RPM__Header self, SV* key, SV* value)
     if (! (name && (namelen = strlen(name))))
         return 0;
 
-    uc_name = safemalloc(namelen + 3);
+    New(0, uc_name, namelen+3, char);
     for (i = 0; i < namelen; i++)
         uc_name[i] = toUPPER(name[i]);
     uc_name[i] = '\0';
@@ -730,7 +729,7 @@ int rpmhdr_STORE(pTHX_ RPM__Header self, SV* key, SV* value)
                     else
                         cloned = sv_mortalcopy(*svp);
                     str_sv = SvPV(cloned, len);
-                    str_new = safemalloc(len + 1);
+                    New(0, str_new, len+1, char);
                     strncpy(str_new, str_sv, len + 1);
                 }
                 else
@@ -752,7 +751,7 @@ int rpmhdr_STORE(pTHX_ RPM__Header self, SV* key, SV* value)
                         else
                             cloned = sv_mortalcopy(*svp);
                         str_sv = SvPV(*svp, len);
-                        str_new = safemalloc(len + 1);
+                        New(0, str_new, len+1, char);
                         strncpy(str_new, str_sv, len + 1);
                         data_p[i] = str_new;
                     }
@@ -798,7 +797,7 @@ int rpmhdr_DELETE(pTHX_ RPM__Header self, SV* key)
     if (! (name && (namelen = strlen(name))))
         return 0;
 
-    uc_name = safemalloc(namelen + 3);
+    New(0, uc_name, namelen+3, char);
     for (i = 0; i < namelen; i++)
         uc_name[i] = toUPPER(name[i]);
     uc_name[i] = '\0';
@@ -846,7 +845,7 @@ bool rpmhdr_EXISTS(pTHX_ RPM__Header self, SV* key)
         return 0;
 
     /* Unlike FETCH, there will be no need for the KEY_t string */
-    uc_name = safemalloc(namelen + 1);
+    New(0, uc_name, namelen+1, char);
     for (i = 0; i < namelen; i++)
         uc_name[i] = toUPPER(name[i]);
     uc_name[i] = '\0';
@@ -888,12 +887,19 @@ int rpmhdr_FIRSTKEY(pTHX_ RPM__Header self, SV** key, SV** value)
     /* Run once to get started */
     headerNextIterator(hdr->iterator, Null(int *), Null(int *),
                        Null(const void **), Null(int *));
-    /* Now run it once, to get the first header entry */
-    if (! headerNextIterator(hdr->iterator, &tag, &type, (const void **)&ptr,
-                             &size))
-        return 0;
+    while (1)
+    {
+        /* Run it to get the header entry */
+        if (! headerNextIterator(hdr->iterator, &tag, &type,
+                                 (const void **)&ptr, &size))
+            return 0;
+
+        tagname = num2tag(aTHX_ tag);
+        /* If the one we've just gotten is null, loop */
+        if (tagname != Nullch)
+            break;
+    }
 
-    tagname = num2tag(aTHX_ tag);
     *key = newSVpv((char *)tagname, strlen(tagname));
     *value = rpmhdr_FETCH(aTHX_ self, *key, ptr, type, size);
 
@@ -948,6 +954,8 @@ void rpmhdr_DESTROY(pTHX_ RPM__Header self)
         headerFree(hdr->hdr);
 
     hv_undef(hdr->storage);
+    if (hdr->source_name)
+        Safefree(hdr->source_name);
     Safefree(hdr);
     hv_undef(self);
 }
@@ -979,7 +987,7 @@ int rpmhdr_tagtype(pTHX_ RPM__Header self, SV* key)
     if (! (name && (namelen = strlen(name))))
         return RPM_NULL_TYPE;
 
-    uc_name = safemalloc(namelen + 3);
+    New(0, uc_name, namelen+3, char);
     for (i = 0; i < namelen; i++)
         uc_name[i] = toUPPER(name[i]);
     uc_name[i] = '\0';
@@ -1363,7 +1371,7 @@ rpmhdr_scalar_tag(self, tag)
             RETVAL = 0;
         else
         {
-            uc_name = safemalloc(namelen + 1);
+            New(0, uc_name, namelen+1, char);
             for (i = 0; i < namelen; i++)
                 uc_name[i] = toUPPER(name[i]);
             uc_name[i] = '\0';