From: rjray Date: Mon, 5 Jun 2000 08:14:32 +0000 (+0000) Subject: Found and fixed a segfault-causing bug. Added a method called is_source() X-Git-Tag: tznext/4.11.0.1.tizen20130304~8347 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=12113fad01ebb45b0e156921518720d04c5ebeb4;p=tools%2Flibrpm-tizen.git Found and fixed a segfault-causing bug. Added a method called is_source() to ID whether the header is from a SRPM. CVS patchset: 3813 CVS date: 2000/06/05 08:14:32 --- diff --git a/Perl-RPM/RPM/Header.xs b/Perl-RPM/RPM/Header.xs index 4c3af05..b40e319 100644 --- a/Perl-RPM/RPM/Header.xs +++ b/Perl-RPM/RPM/Header.xs @@ -4,7 +4,7 @@ #include "RPM.h" -static char * const rcsid = "$Id: Header.xs,v 1.3 2000/06/02 07:54:49 rjray Exp $"; +static char * const rcsid = "$Id: Header.xs,v 1.4 2000/06/05 08:14:32 rjray Exp $"; /* Use this define for deriving the saved Header struct, rather than coding @@ -252,9 +252,9 @@ RPM__Header rpmhdr_TIEHASH(pTHX_ SV* class, SV* source, int flags) { hdr_struct->hdr = (Header)SvRV(source); /* We simply don't know these three settings at this point */ - hdr_struct->isSource = -1; - hdr_struct->major = -1; - hdr_struct->minor = -1; + hdr_struct->isSource = 0; + hdr_struct->major = 0; + hdr_struct->minor = 0; } /* These three are likely to be most of the data requests, anyway */ @@ -740,11 +740,22 @@ int rpmhdr_NEXTKEY(pTHX_ RPM__Header self, SV* key, if (! hdr->iterator) return 0; - /* Run it once, to get the next header entry */ - if (! headerNextIterator(hdr->iterator, &tag, &type, (void **)&ptr, &size)) - return 0; + /* Iterate here, since there are internal tags that may be present for + which we don't want to expose to the user. */ + while (1) + { + /* Run it once, to get the next header entry */ + if (! headerNextIterator(hdr->iterator, &tag, &type, (void **)&ptr, + &size)) + /* Last tag. Inform perl that iteration is over. */ + return 0; + + tagname = num2tag(aTHX_ tag); + /* This means that any time num2tag couldn't map it, we iterate */ + if (tagname != Nullch) + break; + } - tagname = num2tag(aTHX_ tag); *nextkey = newSVpv((char *)tagname, strlen(tagname)); *nextvalue = rpmhdr_FETCH(aTHX_ self, *nextkey, ptr, type, size); @@ -851,6 +862,20 @@ int rpmhdr_write(pTHX_ RPM__Header self, SV* gv_in, int magicp) return written; } +/* T/F test whether the header references a SRPM */ +int rpmhdr_is_source(pTHX_ RPM__Header self) +{ + SV** svp; + RPM_Header* hdr; + + header_from_object_ret(svp, hdr, self, 0); + + if (! hdr->hdr) + return 0; + else + return (hdr->isSource); +} + MODULE = RPM::Header PACKAGE = RPM::Header PREFIX = rpmhdr_ @@ -1017,3 +1042,12 @@ rpmhdr_write(self, gv, magicp=0) } OUTPUT: RETVAL + +int +rpmhdr_is_source(self) + RPM::Header self; + PROTOTYPE: $ + CODE: + RETVAL = rpmhdr_is_source(aTHX_ self); + OUTPUT: + RETVAL