17 #define _RPMFI_INTERNAL 20 #define _RPMSQ_INTERNAL 25 #define _RPMPS_INTERNAL 26 #define _RPMTS_INTERNAL 34 #define S_ISDEV(m) (S_ISBLK((m)) || S_ISCHR((m))) 53 #if defined(__LCLINT__NOTYET) 61 #define FF_ISSET(_fflags, _FLAG) ((_fflags) & (RPMFILE_##_FLAG)) 63 #define VF_ISSET(_vflags, _FLAG) ((_vflags) & (RPMVERIFY_##_FLAG)) 64 #define VF_SET(_vflags, _FLAG) \ 65 (*((unsigned *)&(_vflags)) |= (RPMVERIFY_##_FLAG)) 66 #define VF_CLR(_vflags, _FLAG) \ 67 (*((unsigned *)&(_vflags)) &= ~(RPMVERIFY_##_FLAG)) 69 #define QVA_ISSET(_qvaflags, _FLAG) ((_qvaflags) & (VERIFY_##_FLAG)) 71 #define VSF_ISSET(_vsflags, _FLAG) ((_vsflags) & (RPMVSF_##_FLAG)) 72 #define VSF_SET(_vsflags, _FLAG) \ 73 (*((unsigned *)&(_vsflags)) |= (RPMVSF_##_FLAG)) 74 #define VSF_CLR(_vsflags, _FLAG) \ 75 (*((unsigned *)&(_vsflags)) &= ~(RPMVSF_##_FLAG)) 81 #define FF_ISSET(_fflags, _FLAG) ((_fflags) & (RPMFILE_##_FLAG)) 83 #define VF_ISSET(_vflags, _FLAG) ((_vflags) & (RPMVERIFY_##_FLAG)) 84 #define VF_SET(_vflags, _FLAG) (_vflags) |= (RPMVERIFY_##_FLAG) 85 #define VF_CLR(_vflags, _FLAG) (_vflags) &= ~(RPMVERIFY_##_FLAG) 87 #define QVA_ISSET(_qvaflags, _FLAG) ((_qvaflags) & (VERIFY_##_FLAG)) 89 #define VSF_ISSET(_vsflags, _FLAG) ((_vsflags) & (RPMVSF_##_FLAG)) 90 #define VSF_SET(_vsflags, _FLAG) (_vsflags) |= (RPMVSF_##_FLAG) 91 #define VSF_CLR(_vsflags, _FLAG) (_vsflags) &= ~(RPMVSF_##_FLAG) 106 yarnTwist(use, TO, 0);
107 use = yarnFreeLock(use);
132 vf->
flink = fi->flinks[i];
133 vf->
fuser = fi->fuser[i];
134 vf->
fgroup = fi->fgroup[i];
136 {
struct stat *st = &vf->
sb;
138 st->st_rdev = fi->frdevs[i];
139 st->st_ino = fi->finodes[i];
140 st->st_mode = fi->fmodes[i];
142 st->st_nlink =
rpmfiFNlink(fi) + (int)S_ISDIR(st->st_mode);
148 st->st_size = fi->fsizes[i];
149 st->st_blksize = 4 * 1024;
150 st->st_blocks = (st->st_size + (st->st_blksize - 1)) / st->st_blksize;
153 st->st_mtime = fi->fmtimes[i];
159 vf->
dalgo = fi->fdigestalgos
160 ? fi->fdigestalgos[i]
162 vf->
dlen = fi->digestlen;
163 vf->
digest = fi->digests + (fi->digestlen * i);
166 {
unsigned * _vflagsp = (
unsigned *)&vf->
vflags;
209 assert(vf->
fn != NULL);
210 if (vf->
fn == NULL ||
Lstat(vf->
fn, &sb) != 0) {
217 if (S_ISDIR(sb.st_mode)) {
223 }
else if (
S_ISLNK(sb.st_mode)) {
229 #if CHOWN_FOLLOWS_SYMLINK 234 else if (S_ISFIFO(sb.st_mode)) {
240 }
else if (S_ISCHR(sb.st_mode)) {
246 }
else if (S_ISBLK(sb.st_mode)) {
261 unsigned char * fdigest = (
unsigned char *)
264 #define _mask (RPMVERIFY_FDIGEST|RPMVERIFY_HMAC) 283 if ((size =
Readlink(vf->
fn, linkto,
sizeof(linkto)-1)) == -1) {
284 VF_SET(res, READLINKFAIL);
288 if (vf->
flink == NULL || strcmp(linkto, vf->
flink))
294 if (sb.st_size != vf->
sb.st_size)
300 unsigned short metamode = (
unsigned short)vf->
sb.st_mode;
301 unsigned short filemode = (
unsigned short)sb.st_mode;
308 if (metamode != filemode)
313 if (S_ISCHR(vf->
sb.st_mode) != S_ISCHR(sb.st_mode)
314 || S_ISBLK(vf->
sb.st_mode) != S_ISBLK(sb.st_mode))
319 if (st_rdev != frdev)
325 if (sb.st_mtime != vf->
sb.st_mtime)
331 if (fuser == NULL || vf->
fuser == NULL || strcmp(fuser, vf->
fuser))
337 if (fgroup == NULL || vf->
fgroup == NULL || strcmp(fgroup, vf->
fgroup))
352 sprintf(te,
_(
"missing %c %s"),
362 sprintf(te,
" (%s)", strerror(
errno));
366 static const char aok[] =
".";
367 static const char unknown[] =
"?";
369 #define _verify(_FLAG, _C) \ 370 (VF_ISSET(res, _FLAG) ? _C : aok) 371 #define _verifylink(_FLAG, _C) \ 372 (VF_ISSET(res, READLINKFAIL) ? unknown : \ 373 VF_ISSET(res, _FLAG) ? _C : aok) 374 #define _verifyfile(_FLAG, _C) \ 375 (VF_ISSET(res, READFAIL) ? unknown : \ 376 VF_ISSET(res, _FLAG) ? _C : aok) 379 const char * size =
_verify(FILESIZE,
"S");
381 const char * mtime =
_verify(MTIME,
"T");
382 const char * rdev =
_verify(RDEV,
"D");
383 const char * user =
_verify(USER,
"U");
384 const char * group =
_verify(GROUP,
"G");
385 const char * mode =
_verify(MODE,
"M");
391 sprintf(te,
"%s%s%s%s%s%s%s%s %c %s",
392 size, mode, digest, rdev, link, user, group, mtime,
430 if (scriptFd != NULL)
445 if (scriptFd != NULL)
483 const char * altNEVR;
484 const char * pkgNEVR = NULL;
497 assert(altNEVR != NULL);
498 if (altNEVR[0] ==
'R' && altNEVR[1] ==
' ')
499 nb +=
sizeof(
"\tRequires: ")-1;
500 if (altNEVR[0] ==
'C' && altNEVR[1] ==
' ')
501 nb +=
sizeof(
"\tConflicts: ")-1;
502 nb += strlen(altNEVR+2) +
sizeof(
"\n") - 1;
507 te = t = (
char *)
alloca(nb);
509 sprintf(te,
_(
"Unsatisfied dependencies for %s:\n"), pkgNEVR);
517 altNEVR =
"? ?altNEVR?";
518 if (altNEVR[0] ==
'R' && altNEVR[1] ==
' ')
519 te =
stpcpy(te,
"\tRequires: ");
520 if (altNEVR[0] ==
'C' && altNEVR[1] ==
' ')
521 te =
stpcpy(te,
"\tConflicts: ");
546 static int scareMem = 0;
560 const char * msg = NULL;
566 (horigin ? horigin :
"verify"), (msg ? msg :
""));
575 #pragma omp parallel for private(i) reduction(+:ec) 577 for (i = 0; i < (int)fc; i++) {
578 int fflags = fi->fflags[i];
665 #if defined(SUPPORT_NOSIGNATURES) 667 VSF_SET(vsflags, NOSHA1HEADER);
const unsigned char * digest
int rpmfiSetHeader(rpmfi fi, Header h)
Link a header to a file info set.
const char * rpmtsRootDir(rpmts ts)
Get transaction rootDir, i.e.
static int verifyDependencies(QVA_t qva, rpmts ts, Header h)
Check installed package dependencies for problems.
rpmuint32_t rpmfiFNlink(rpmfi fi)
Return (calculated) current file nlink count from file info set.
int _rpmds_unspecified_epoch_noise
int rpmtsAddInstallElement(rpmts ts, Header h, fnpyKey key, int upgrade, rpmRelocation relocs)
Add package to be installed to transaction set.
char * rpmGetPath(const char *path,...)
Return (malloc'ed) expanded, canonicalized, file path.
Structure(s) used for file info tag sets.
rpmpsi rpmpsFreeIterator(rpmpsi psi)
Destroy problem set iterator.
int rpmcliArgIter(rpmts ts, QVA_t qva, ARGV_t argv)
char * gidToGname(gid_t gid)
#define DRD_xcalloc(_nmemb, _size)
char * rpmProblemGetPkgNEVR(rpmProblem prob)
Return the package NEVR causing the problem.
#define _verify(_FLAG, _C)
struct rpmpsm_s * rpmpsm
Package state machine data.
static rpmVSFlags vsflags
#define RPMVERIFY_FAILURES
rpmRC headerCheck(pgpDig dig, const void *uh, size_t uc, const char **msg)
Check header consistency, performing headerGet() the hard way.
#define FF_ISSET(_fflags, _FLAG)
enum rpmVerifyAttrs_e rpmVerifyAttrs
Bit(s) for rpmVerifyFile() attributes and result.
rpmfi rpmfiFree(rpmfi fi)
Destroy a file info set.
unsigned short rpmuint16_t
int dodigest(int dalgo, const char *fn, unsigned char *digest, unsigned dflags, size_t *fsizep)
Return digest and size of a file.
static void rpmlog(int code, const char *fmt,...)
struct rpmps_s * rpmps
Transaction problems found while processing a transaction set/.
#define _verifyfile(_FLAG, _C)
rpmfi rpmfiNew(const void *_ts, Header h, rpmTag tagN, int flags)
Create and load a file info set.
Command line option information.
int rpmfiFC(rpmfi fi)
Return file count from file info set.
int rpmpsNumProblems(rpmps ps)
Return number of problems in set.
rpmtransFlags rpmtsSetFlags(rpmts ts, rpmtransFlags transFlags)
Set transaction flags, i.e.
#define VSF_CLR(_vsflags, _FLAG)
void rpmtsCleanDig(rpmts ts)
Free signature verification data.
int gnameToGid(const char *thisGname, gid_t *gid)
int rpmpsNextIterator(rpmpsi psi)
Return next problem set iterator index.
struct rpmfi_s * rpmfi
File info tag sets from a header, so that a header can be discarded early.
char * rpmProblemGetAltNEVR(rpmProblem prob)
Return the second package NEVR causing the problem.
int Lstat(const char *path, struct stat *st)
lstat(2) clone.
enum rpmdepFlags_e rpmdepFlags
Bit(s) to control rpmtsCheck() and rpmtsOrder() operation.
int(* rpmtsCheck)(rpmts ts)
Perform dependency resolution on the transaction set.
const char * tagName(rpmTag tag)
Return tag name from value.
The FD_t File Handle data structure.
rpmpsm rpmpsmNew(rpmts ts, rpmte te, rpmfi fi)
Create and load a package state machine.
rpmpsi rpmpsInitIterator(rpmps ps)
Initialize problem set iterator.
pgpVSFlags rpmVSFlags
Bit(s) to control digest and signature verification.
int Fclose(FD_t fd)
fclose(3) clone.
static int rpmvfVerify(rpmvf vf, int spew)
Verify file attributes (including file digest).
enum rpmfileAttrs_e rpmfileAttrs
File Attributes.
rpmps rpmpsFree(rpmps ps)
Destroy a problem set.
static rpmvf rpmvfNew(rpmts ts, rpmfi fi, int i, rpmVerifyAttrs omitMask)
int Readlink(const char *path, char *buf, size_t bufsiz)
readlink(2) clone.
int rpmcliVerify(rpmts ts, QVA_t qva, const char **argv)
Verify package install.
enum rpmRC_e rpmRC
RPM return codes.
#define VF_ISSET(_vflags, _FLAG)
enum rpmfileState_e rpmfileState
File States (when installed).
Package state machine to handle a package from a transaction set.
rpmdepFlags rpmtsSetDFlags(rpmts ts, rpmdepFlags depFlags)
Set dependency flags, i.e.
rpmProblem rpmpsProblem(rpmpsi psi)
Return current problem from problem set.
Methods to handle package elements.
rpmps rpmtsProblems(rpmts ts)
Return current transaction set problems.
enum rpmtransFlags_e rpmtransFlags
Bit(s) to control rpmtsRun() operation.
rpmVSFlags rpmtsSetVSFlags(rpmts ts, rpmVSFlags vsflags)
Set verify signatures flag(s).
#define VF_SET(_vflags, _FLAG)
char * stpcpy(char *dest, const char *src)
struct rpmts_s * rpmts
The RPM Transaction Set.
static void * _free(const void *p)
Wrapper to free(3), hides const compilation noise, permit NULL, return NULL.
char * uidToUname(uid_t uid)
static int rpmVerifyScript(QVA_t qva, rpmts ts, rpmfi fi, FD_t scriptFd)
Return exit code from running verify script from header.
struct rpmProblem_s * rpmProblem
Raw data for an element of a problem set.
int rpmtsAddEraseElement(rpmts ts, Header h, uint32_t hdrNum)
Add package to be erased to transaction set.
rpmpsm rpmpsmFree(rpmpsm psm, const char *msg)
Destroy a package state machine.
#define QVA_ISSET(_qvaflags, _FLAG)
struct yarnLock_s * yarnLock
#define VF_CLR(_vflags, _FLAG)
static rpmvf rpmvfFree(rpmvf vf)
int unameToUid(const char *thisUname, uid_t *uid)
#define _verifylink(_FLAG, _C)
pgpDig rpmtsDig(rpmts ts)
Get OpenPGP packet parameters, i.e.
rpmRC rpmpsmScriptStage(rpmpsm psm, rpmTag scriptTag, rpmTag progTag)
Run rpmpsmStage(PSM_SCRIPT) for scriptTag and progTag.
#define VSF_SET(_vsflags, _FLAG)
int rpmExpandNumeric(const char *arg)
Return macro expansion as a numeric value.
void rpmtsSetScriptFd(rpmts ts, FD_t scriptFd)
void rpmtsEmpty(rpmts ts)
Re-create an empty transaction set.
int showVerifyPackage(QVA_t qva, rpmts ts, Header h)
Display results of package verify.