[prev in list] [next in list] [prev in thread] [next in thread]
List: rpm-cvs
Subject: [CVS] RPM: rpm-5_4: rpm/lib/ verify.c
From: "Jeff Johnson" <jbj () rpm5 ! org>
Date: 2012-04-25 17:25:08
Message-ID: 20120425172508.7BBADA77FB () rpm5 ! org
[Download RAW message or body]
RPM Package Manager, CVS Repository
http://rpm5.org/cvs/
____________________________________________________________________________
Server: rpm5.org Name: Jeff Johnson
Root: /v/rpm/cvs Email: jbj@rpm5.org
Module: rpm Date: 25-Apr-2012 19:25:08
Branch: rpm-5_4 Handle: 2012042517250800
Modified files: (Branch: rpm-5_4)
rpm/lib verify.c
Log:
- c++: hide the C -> C++ typedef'd enum flags issue more carefully.
Summary:
Revision Changes Path
2.201.4.8 +152 -94 rpm/lib/verify.c
____________________________________________________________________________
patch -p0 <<'@@ .'
Index: rpm/lib/verify.c
============================================================================
$ cvs diff -u -r2.201.4.7 -r2.201.4.8 verify.c
--- rpm/lib/verify.c 19 Apr 2012 17:26:07 -0000 2.201.4.7
+++ rpm/lib/verify.c 25 Apr 2012 17:25:08 -0000 2.201.4.8
@@ -57,7 +57,39 @@
};
#ifdef __cplusplus
+
+#define FF_ISSET(_fflags, _FLAG) ((_fflags) & (RPMFILE_##_FLAG))
+
+#define VF_ISSET(_vflags, _FLAG) ((_vflags) & (RPMVERIFY_##_FLAG))
+#define VF_SET(_vflags, _FLAG) \
+ (*((unsigned *)&(_vflags)) |= (RPMVERIFY_##_FLAG))
+#define VF_CLR(_vflags, _FLAG) \
+ (*((unsigned *)&(_vflags)) &= ~(RPMVERIFY_##_FLAG))
+
+#define QVA_ISSET(_qvaflags, _FLAG) ((_qvaflags) & (VERIFY_##_FLAG))
+
+#define VSF_ISSET(_vsflags, _FLAG) ((_vsflags) & (RPMVSF_##_FLAG))
+#define VSF_SET(_vsflags, _FLAG) \
+ (*((unsigned *)&(_vsflags)) |= (RPMVSF_##_FLAG))
+#define VSF_CLR(_vsflags, _FLAG) \
+ (*((unsigned *)&(_vsflags)) &= ~(RPMVSF_##_FLAG))
+
GENfree(rpmvf)
+
+#else /* __cplusplus */
+
+#define FF_ISSET(_fflags, _FLAG) ((_fflags) & (RPMFILE_##_FLAG))
+
+#define VF_ISSET(_vflags, _FLAG) ((_vflags) & (RPMVERIFY_##_FLAG))
+#define VF_SET(_vflags, _FLAG) (_vflags) |= (RPMVERIFY_##_FLAG)
+#define VF_CLR(_vflags, _FLAG) (_vflags) &= ~(RPMVERIFY_##_FLAG)
+
+#define QVA_ISSET(_qvaflags, _FLAG) ((_qvaflags) & (VERIFY_##_FLAG))
+
+#define VSF_ISSET(_vsflags, _FLAG) ((_vsflags) & (RPMVSF_##_FLAG))
+#define VSF_SET(_vsflags, _FLAG) (_vsflags) |= (RPMVSF_##_FLAG)
+#define VSF_CLR(_vsflags, _FLAG) (_vsflags) &= ~(RPMVSF_##_FLAG)
+
#endif /* __cplusplus */
static rpmvf rpmvfFree(/*@only@*/ rpmvf vf)
@@ -134,10 +166,13 @@
*((unsigned *)&vf->vflags) &= ~(omitMask | RPMVERIFY_FAILURES);
/* Content checks of %ghost files are meaningless. */
- if (vf->fflags & RPMFILE_GHOST)
- *((unsigned *)&vf->vflags) &=
- ~(RPMVERIFY_FDIGEST | RPMVERIFY_FILESIZE | RPMVERIFY_MTIME |
- RPMVERIFY_LINKTO | RPMVERIFY_HMAC);
+ if (FF_ISSET(vf->fflags, GHOST)) {
+ VF_CLR(vf->vflags, FDIGEST);
+ VF_CLR(vf->vflags, FILESIZE);
+ VF_CLR(vf->vflags, MTIME);
+ VF_CLR(vf->vflags, LINKTO);
+ VF_CLR(vf->vflags, HMAC);
+ }
return vf;
}
@@ -171,42 +206,54 @@
assert(vf->fn != NULL);
if (vf->fn == NULL || Lstat(vf->fn, &sb) != 0) {
- *((unsigned *)&res) |= RPMVERIFY_LSTATFAIL;
+ VF_SET(res, LSTATFAIL);
ec = 1;
goto exit;
}
/* Not all attributes of non-regular files can be verified. */
- if (S_ISDIR(sb.st_mode))
- *((unsigned *)&vf->vflags) &=
- ~(RPMVERIFY_FDIGEST | RPMVERIFY_FILESIZE | RPMVERIFY_MTIME |
- RPMVERIFY_LINKTO | RPMVERIFY_HMAC);
- else if (S_ISLNK(sb.st_mode)) {
- *((unsigned *)&vf->vflags) &=
- ~(RPMVERIFY_FDIGEST | RPMVERIFY_FILESIZE | RPMVERIFY_MTIME |
- RPMVERIFY_MODE | RPMVERIFY_HMAC);
+ if (S_ISDIR(sb.st_mode)) {
+ VF_CLR(vf->vflags, FDIGEST);
+ VF_CLR(vf->vflags, FILESIZE);
+ VF_CLR(vf->vflags, MTIME);
+ VF_CLR(vf->vflags, LINKTO);
+ VF_CLR(vf->vflags, HMAC);
+ } else if (S_ISLNK(sb.st_mode)) {
+ VF_CLR(vf->vflags, FDIGEST);
+ VF_CLR(vf->vflags, FILESIZE);
+ VF_CLR(vf->vflags, MTIME);
+ VF_CLR(vf->vflags, MODE);
+ VF_CLR(vf->vflags, HMAC);
#if CHOWN_FOLLOWS_SYMLINK
- *((unsigned *)&vf->vflags) &= ~(RPMVERIFY_USER | RPMVERIFY_GROUP);
+ VF_CLR(vf->vflags, USER);
+ VF_CLR(vf->vflags, GROUP);
#endif
}
- else if (S_ISFIFO(sb.st_mode))
- *((unsigned *)&vf->vflags) &=
- ~(RPMVERIFY_FDIGEST | RPMVERIFY_FILESIZE | RPMVERIFY_MTIME |
- RPMVERIFY_LINKTO | RPMVERIFY_HMAC);
- else if (S_ISCHR(sb.st_mode))
- *((unsigned *)&vf->vflags) &=
- ~(RPMVERIFY_FDIGEST | RPMVERIFY_FILESIZE | RPMVERIFY_MTIME |
- RPMVERIFY_LINKTO | RPMVERIFY_HMAC);
- else if (S_ISBLK(sb.st_mode))
- *((unsigned *)&vf->vflags) &=
- ~(RPMVERIFY_FDIGEST | RPMVERIFY_FILESIZE | RPMVERIFY_MTIME |
- RPMVERIFY_LINKTO | RPMVERIFY_HMAC);
- else
- *((unsigned *)&vf->vflags) &= ~(RPMVERIFY_LINKTO);
+ else if (S_ISFIFO(sb.st_mode)) {
+ VF_CLR(vf->vflags, FDIGEST);
+ VF_CLR(vf->vflags, FILESIZE);
+ VF_CLR(vf->vflags, MTIME);
+ VF_CLR(vf->vflags, LINKTO);
+ VF_CLR(vf->vflags, HMAC);
+ } else if (S_ISCHR(sb.st_mode)) {
+ VF_CLR(vf->vflags, FDIGEST);
+ VF_CLR(vf->vflags, FILESIZE);
+ VF_CLR(vf->vflags, MTIME);
+ VF_CLR(vf->vflags, LINKTO);
+ VF_CLR(vf->vflags, HMAC);
+ } else if (S_ISBLK(sb.st_mode)) {
+ VF_CLR(vf->vflags, FDIGEST);
+ VF_CLR(vf->vflags, FILESIZE);
+ VF_CLR(vf->vflags, MTIME);
+ VF_CLR(vf->vflags, LINKTO);
+ VF_CLR(vf->vflags, HMAC);
+ } else {
+ VF_CLR(vf->vflags, LINKTO);
+ }
- if (vf->vflags & (RPMVERIFY_FDIGEST | RPMVERIFY_HMAC)) {
+ if (VF_ISSET(vf->vflags, FDIGEST) || VF_ISSET(vf->vflags, HMAC)) {
if (vf->digest == NULL || vf->dlen == 0)
- *((unsigned *)&res) |= RPMVERIFY_FDIGEST;
+ VF_SET(res, FDIGEST);
else {
/* XXX If --nofdigest, then prelinked library sizes fail to verify. */
unsigned char * fdigest = (unsigned char *)
@@ -218,73 +265,75 @@
#undef _mask
int rc = dodigest(vf->dalgo, vf->fn, fdigest, dflags, &fsize);
sb.st_size = fsize;
- if (rc)
- *((unsigned *)&res) |= (RPMVERIFY_READFAIL|RPMVERIFY_FDIGEST);
- else
+ if (rc) {
+ VF_SET(res, READFAIL);
+ VF_SET(res, FDIGEST);
+ } else
if (memcmp(fdigest, vf->digest, vf->dlen))
- *((unsigned *)&res) |= RPMVERIFY_FDIGEST;
+ VF_SET(res, FDIGEST);
}
}
- if (vf->vflags & RPMVERIFY_LINKTO) {
+ if (VF_ISSET(vf->vflags, LINKTO)) {
char linkto[1024+1];
int size = 0;
- if ((size = Readlink(vf->fn, linkto, sizeof(linkto)-1)) == -1)
- *((unsigned *)&res) |= (RPMVERIFY_READLINKFAIL|RPMVERIFY_LINKTO);
- else {
+ if ((size = Readlink(vf->fn, linkto, sizeof(linkto)-1)) == -1) {
+ VF_SET(res, READLINKFAIL);
+ VF_SET(res, LINKTO);
+ } else {
linkto[size] = '\0';
if (vf->flink == NULL || strcmp(linkto, vf->flink))
- *((unsigned *)&res) |= RPMVERIFY_LINKTO;
+ VF_SET(res, LINKTO);
}
}
- if (vf->vflags & RPMVERIFY_FILESIZE) {
+ if (VF_ISSET(vf->vflags, FILESIZE)) {
if (sb.st_size != vf->sb.st_size)
- *((unsigned *)&res) |= RPMVERIFY_FILESIZE;
+ VF_SET(res, FILESIZE);
}
- if (vf->vflags & RPMVERIFY_MODE) {
+ if (VF_ISSET(vf->vflags, MODE)) {
/* XXX AIX has sizeof(mode_t) > sizeof(unsigned short) */
unsigned short metamode = (unsigned short)vf->sb.st_mode;
unsigned short filemode = (unsigned short)sb.st_mode;
/* Comparing type of %ghost files is meaningless, but perms are OK. */
- if (vf->fflags & RPMFILE_GHOST) {
+ if (FF_ISSET(vf->fflags, GHOST)) {
metamode &= ~0xf000;
filemode &= ~0xf000;
}
if (metamode != filemode)
- *((unsigned *)&res) |= RPMVERIFY_MODE;
+ VF_SET(res, MODE);
}
- if (vf->vflags & RPMVERIFY_RDEV) {
+ if (VF_ISSET(vf->vflags, RDEV)) {
if (S_ISCHR(vf->sb.st_mode) != S_ISCHR(sb.st_mode)
|| S_ISBLK(vf->sb.st_mode) != S_ISBLK(sb.st_mode))
- *((unsigned *)&res) |= RPMVERIFY_RDEV;
+ VF_SET(res, RDEV);
else if (S_ISDEV(vf->sb.st_mode) && S_ISDEV(sb.st_mode)) {
rpmuint16_t st_rdev = (rpmuint16_t)(sb.st_rdev & 0xffff);
rpmuint16_t frdev = (rpmuint16_t)(vf->sb.st_rdev & 0xffff);
if (st_rdev != frdev)
- *((unsigned *)&res) |= RPMVERIFY_RDEV;
+ VF_SET(res, RDEV);
}
}
- if (vf->vflags & RPMVERIFY_MTIME) {
+ if (VF_ISSET(vf->vflags, MTIME)) {
if (sb.st_mtime != vf->sb.st_mtime)
- *((unsigned *)&res) |= RPMVERIFY_MTIME;
+ VF_SET(res, MTIME);
}
- if (vf->vflags & RPMVERIFY_USER) {
+ if (VF_ISSET(vf->vflags, USER)) {
const char * fuser = uidToUname(sb.st_uid);
if (fuser == NULL || vf->fuser == NULL || strcmp(fuser, vf->fuser))
- *((unsigned *)&res) |= RPMVERIFY_USER;
+ VF_SET(res, USER);
}
- if (vf->vflags & RPMVERIFY_GROUP) {
+ if (VF_ISSET(vf->vflags, GROUP)) {
const char * fgroup = gidToGname(sb.st_gid);
if (fgroup == NULL || vf->fgroup == NULL || strcmp(fgroup, vf->fgroup))
- *((unsigned *)&res) |= RPMVERIFY_GROUP;
+ VF_SET(res, GROUP);
}
exit:
@@ -295,18 +344,18 @@
char * te = t;
*te = '\0';
if (ec) {
- if (!(vf->fflags & (RPMFILE_MISSINGOK|RPMFILE_GHOST))
+ if (!(FF_ISSET(vf->fflags, MISSINGOK) ||FF_ISSET(vf->fflags, GHOST))
|| rpmIsVerbose())
{
sprintf(te, _("missing %c %s"),
- ((vf->fflags & RPMFILE_CONFIG) ? 'c' :
- (vf->fflags & RPMFILE_DOC) ? 'd' :
- (vf->fflags & RPMFILE_GHOST) ? 'g' :
- (vf->fflags & RPMFILE_LICENSE) ? 'l' :
- (vf->fflags & RPMFILE_PUBKEY) ? 'P' :
- (vf->fflags & RPMFILE_README) ? 'r' : ' '),
+ (FF_ISSET(vf->fflags, CONFIG) ? 'c' :
+ FF_ISSET(vf->fflags, DOC) ? 'd' :
+ FF_ISSET(vf->fflags, GHOST) ? 'g' :
+ FF_ISSET(vf->fflags, LICENSE) ? 'l' :
+ FF_ISSET(vf->fflags, PUBKEY) ? 'P' :
+ FF_ISSET(vf->fflags, README) ? 'r' : ' '),
vf->fn);
- if ((res & RPMVERIFY_LSTATFAIL) != 0 && errno != ENOENT) {
+ if (VF_ISSET(res, LSTATFAIL) && errno != ENOENT) {
te += strlen(te);
sprintf(te, " (%s)", strerror(errno));
}
@@ -315,23 +364,23 @@
/*@observer@*/ static const char aok[] = ".";
/*@observer@*/ static const char unknown[] = "?";
-#define _verify(_RPMVERIFY_F, _C) \
- ((res & _RPMVERIFY_F) ? _C : aok)
-#define _verifylink(_RPMVERIFY_F, _C) \
- ((res & RPMVERIFY_READLINKFAIL) ? unknown : \
- (res & _RPMVERIFY_F) ? _C : aok)
-#define _verifyfile(_RPMVERIFY_F, _C) \
- ((res & RPMVERIFY_READFAIL) ? unknown : \
- (res & _RPMVERIFY_F) ? _C : aok)
+#define _verify(_FLAG, _C) \
+ (VF_ISSET(res, _FLAG) ? _C : aok)
+#define _verifylink(_FLAG, _C) \
+ (VF_ISSET(res, READLINKFAIL) ? unknown : \
+ VF_ISSET(res, _FLAG) ? _C : aok)
+#define _verifyfile(_FLAG, _C) \
+ (VF_ISSET(res, READFAIL) ? unknown : \
+ VF_ISSET(res, _FLAG) ? _C : aok)
- const char * digest = _verifyfile(RPMVERIFY_FDIGEST, "5");
- const char * size = _verify(RPMVERIFY_FILESIZE, "S");
- const char * link = _verifylink(RPMVERIFY_LINKTO, "L");
- const char * mtime = _verify(RPMVERIFY_MTIME, "T");
- const char * rdev = _verify(RPMVERIFY_RDEV, "D");
- const char * user = _verify(RPMVERIFY_USER, "U");
- const char * group = _verify(RPMVERIFY_GROUP, "G");
- const char * mode = _verify(RPMVERIFY_MODE, "M");
+ const char * digest = _verifyfile(FDIGEST, "5");
+ const char * size = _verify(FILESIZE, "S");
+ const char * link = _verifylink(LINKTO, "L");
+ const char * mtime = _verify(MTIME, "T");
+ const char * rdev = _verify(RDEV, "D");
+ const char * user = _verify(USER, "U");
+ const char * group = _verify(GROUP, "G");
+ const char * mode = _verify(MODE, "M");
#undef _verifyfile
#undef _verifylink
@@ -339,12 +388,12 @@
sprintf(te, "%s%s%s%s%s%s%s%s %c %s",
size, mode, digest, rdev, link, user, group, mtime,
- ((vf->fflags & RPMFILE_CONFIG) ? 'c' :
- (vf->fflags & RPMFILE_DOC) ? 'd' :
- (vf->fflags & RPMFILE_GHOST) ? 'g' :
- (vf->fflags & RPMFILE_LICENSE) ? 'l' :
- (vf->fflags & RPMFILE_PUBKEY) ? 'P' :
- (vf->fflags & RPMFILE_README) ? 'r' : ' '),
+ (FF_ISSET(vf->fflags, CONFIG) ? 'c' :
+ FF_ISSET(vf->fflags, DOC) ? 'd' :
+ FF_ISSET(vf->fflags, GHOST) ? 'g' :
+ FF_ISSET(vf->fflags, LICENSE) ? 'l' :
+ FF_ISSET(vf->fflags, PUBKEY) ? 'P' :
+ FF_ISSET(vf->fflags, README) ? 'r' : ' '),
vf->fn);
}
@@ -529,16 +578,16 @@
int rc;
/* If not querying %config, skip config files. */
- if ((qva->qva_fflags & RPMFILE_CONFIG) && (fflags & RPMFILE_CONFIG))
+ if (FF_ISSET(qva->qva_fflags, CONFIG) && FF_ISSET(fflags, CONFIG))
continue;
/* If not querying %doc, skip doc files. */
- if ((qva->qva_fflags & RPMFILE_DOC) && (fflags & RPMFILE_DOC))
+ if (FF_ISSET(qva->qva_fflags, DOC) && FF_ISSET(fflags, DOC))
continue;
/* If not verifying %ghost, skip ghost files. */
/* XXX the broken!!! logic disables %ghost queries always. */
- if (!(qva->qva_fflags & RPMFILE_GHOST) && (fflags & RPMFILE_GHOST))
+ if (!(FF_ISSET(qva->qva_fflags, GHOST) && FF_ISSET(fflags, GHOST)))
continue;
/* Gather per-file data into a carrier. */
@@ -601,7 +650,7 @@
int ec = 0;
#if defined(_OPENMP)
-(void) tagName(0); /* XXX instantiate the tagname store. */
+(void) tagName((rpmTag)0); /* XXX instantiate the tagname store. */
omp_set_nested(1); /* XXX permit nested thread teams. */
#endif
@@ -611,13 +660,22 @@
/* XXX verify flags are inverted from query. */
vsflags = (rpmVSFlags) rpmExpandNumeric("%{?_vsflags_verify}");
vsflags = (rpmVSFlags) 0; /* XXX FIXME: ignore default disablers. */
- if (!(qva->qva_flags & VERIFY_DIGEST))
- *((unsigned *)&vsflags) |= _RPMVSF_NODIGESTS;
- if (!(qva->qva_flags & VERIFY_SIGNATURE))
- *((unsigned *)&vsflags) |= _RPMVSF_NOSIGNATURES;
- if (!(qva->qva_flags & VERIFY_HDRCHK))
- *((unsigned *)&vsflags) |= RPMVSF_NOHDRCHK;
- *((unsigned *)&vsflags) &= ~RPMVSF_NEEDPAYLOAD;
+ if (!QVA_ISSET(qva->qva_flags, DIGEST)) {
+ VSF_SET(vsflags, NOSHA1HEADER);
+ VSF_SET(vsflags, NOMD5HEADER);
+ VSF_SET(vsflags, NOSHA1);
+ VSF_SET(vsflags, NOMD5);
+ }
+ if (!QVA_ISSET(qva->qva_flags, SIGNATURE)) {
+ VSF_SET(vsflags, NODSAHEADER);
+ VSF_SET(vsflags, NORSAHEADER);
+ VSF_SET(vsflags, NODSA);
+ VSF_SET(vsflags, NORSA);
+ }
+ if (!QVA_ISSET(qva->qva_flags, HDRCHK)) {
+ VSF_SET(vsflags, NOHDRCHK);
+ }
+ VSF_CLR(vsflags, NEEDPAYLOAD);
odepFlags = rpmtsSetDFlags(ts, depFlags);
otransFlags = rpmtsSetFlags(ts, transFlags);
@@ .
______________________________________________________________________
RPM Package Manager http://rpm5.org
CVS Sources Repository rpm-cvs@rpm5.org
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic