rpm  5.2.1
rpmdb/header_internal.c
Go to the documentation of this file.
00001 /*@-sizeoftype@*/
00006 #include "system.h"
00007 
00008 #define _RPMTAG_INTERNAL
00009 #include <header_internal.h>
00010 
00011 #include "debug.h"
00012 
00016 /*@observer@*/ /*@unchecked@*/
00017 int rpm_typeAlign[16] =  {
00018     1,  
00019     1,  
00020     1,  
00021     2,  
00022     4,  
00023     8,  
00024     1,  
00025     1,  
00026     1,  
00027     1,  
00028     0,
00029     0,
00030     0,
00031     0,
00032     0,
00033     0
00034 };
00035 
00036 int headerVerifyInfo(rpmuint32_t il, rpmuint32_t dl, const void * pev, void * iv, int negate)
00037 {
00038 /*@-castexpose@*/
00039     entryInfo pe = (entryInfo) pev;
00040 /*@=castexpose@*/
00041     entryInfo info = iv;
00042     rpmuint32_t i;
00043 
00044     for (i = 0; i < il; i++) {
00045         info->tag = (rpmuint32_t) ntohl(pe[i].tag);
00046         info->type = (rpmuint32_t) ntohl(pe[i].type);
00047         /* XXX Convert RPMTAG_FILESTATE to RPM_UINT8_TYPE. */
00048         if (info->tag == 1029 && info->type == 1) {
00049             info->type = RPM_UINT8_TYPE;
00050             pe[i].type = (rpmuint32_t) htonl(info->type);
00051         }
00052         info->offset = (rpmint32_t) ntohl(pe[i].offset);
00053 assert(negate || info->offset >= 0);    /* XXX insurance */
00054         if (negate)
00055             info->offset = -info->offset;
00056         info->count = (rpmuint32_t) ntohl(pe[i].count);
00057 
00058         if (hdrchkType(info->type))
00059             return (int)i;
00060         if (hdrchkAlign(info->type, info->offset))
00061             return (int)i;
00062         if (!negate && hdrchkRange((rpmint32_t)dl, info->offset))
00063             return (int)i;
00064         if (hdrchkData(info->count))
00065             return (int)i;
00066 
00067     }
00068     return -1;
00069 }
00070 /*@=sizeoftype@*/