[PATCH] fix rpm on rhel5(should work on rhel6, not tested)
by Nikola Pajkovsky
Signed-off-by: Nikola Pajkovsky <npajkovs(a)redhat.com>
---
src/Daemon/MiddleWare.cpp | 42 +++++++---
src/Daemon/RPM.cpp | 199 +++++++++++++++++++++++---------------------
src/Daemon/RPM.h | 9 +-
src/Daemon/gpg_keys | 2 +-
4 files changed, 138 insertions(+), 114 deletions(-)
diff --git a/src/Daemon/MiddleWare.cpp b/src/Daemon/MiddleWare.cpp
index c393561..522e636 100644
--- a/src/Daemon/MiddleWare.cpp
+++ b/src/Daemon/MiddleWare.cpp
@@ -670,14 +670,15 @@ static mw_result_t SavePackageDescriptionToDebugDump(
bool remote,
const char *pDebugDumpDir)
{
- std::string package;
+ char* rpm_pkg = NULL;
char* packageName = NULL;
- std::string component;
+ char* component = NULL;
std::string scriptName; /* only if "interpreter /path/to/script" */
if (strcmp(pExecutable, "kernel") == 0)
{
- component = package = "kernel";
+ component = xstrdup("kenel");
+ rpm_pkg = xstrdup("kernel");
packageName = xstrdup("kernel");
}
else
@@ -688,7 +689,7 @@ static mw_result_t SavePackageDescriptionToDebugDump(
return MW_BLACKLISTED;
}
- char *rpm_pkg = GetPackage(pExecutable);
+ rpm_pkg = rpm_get_package_nvr(pExecutable);
if (rpm_pkg == NULL)
{
if (g_settings_bProcessUnpackaged || remote)
@@ -737,7 +738,7 @@ static mw_result_t SavePackageDescriptionToDebugDump(
char *script_name = get_argv1_if_full_path(cmdline);
if (script_name)
{
- char *script_pkg = GetPackage(script_name);
+ char *script_pkg = rpm_get_package_nvr(script_name);
if (script_pkg)
{
/* There is a well-formed script name in argv[1],
@@ -767,10 +768,8 @@ static mw_result_t SavePackageDescriptionToDebugDump(
}
}
- package = rpm_pkg;
- packageName = get_package_name_from_NVR_or_NULL(package.c_str());
+ packageName = get_package_name_from_NVR_or_NULL(rpm_pkg);
VERB2 log("Package:'%s' short:'%s'", rpm_pkg, packageName);
- free(rpm_pkg);
if (g_settings_setBlackListedPkgs.find(packageName) != g_settings_setBlackListedPkgs.end())
{
@@ -801,10 +800,10 @@ static mw_result_t SavePackageDescriptionToDebugDump(
}
*/
}
- component = GetComponent(pExecutable);
+ component = rpm_get_component(pExecutable);
}
- std::string description = GetDescription(packageName);
+ char *dsc = rpm_get_description(packageName);
free(packageName);
char host[HOST_NAME_MAX + 1];
@@ -824,9 +823,24 @@ static mw_result_t SavePackageDescriptionToDebugDump(
{
CDebugDump dd;
dd.Open(pDebugDumpDir);
- dd.SaveText(FILENAME_PACKAGE, package.c_str());
- dd.SaveText(FILENAME_DESCRIPTION, description.c_str());
- dd.SaveText(FILENAME_COMPONENT, component.c_str());
+ if (rpm_pkg)
+ {
+ dd.SaveText(FILENAME_PACKAGE, rpm_pkg);
+ free(rpm_pkg);
+ }
+
+ if (dsc)
+ {
+ dd.SaveText(FILENAME_DESCRIPTION, dsc);
+ free(dsc);
+ }
+
+ if (component)
+ {
+ dd.SaveText(FILENAME_COMPONENT, component);
+ free(component);
+ }
+
if (!remote)
dd.SaveText(FILENAME_HOSTNAME, host);
}
@@ -1008,7 +1022,7 @@ mw_result_t SaveDebugDump(const char *pDebugDumpDir,
dd.LoadText(FILENAME_CMDLINE, cmdline);
if (dd.Exist(FILENAME_REMOTE))
{
- std:string remote_str;
+ std::string remote_str;
dd.LoadText(FILENAME_REMOTE, remote_str);
remote = (remote_str.find('1') != std::string::npos);
}
diff --git a/src/Daemon/RPM.cpp b/src/Daemon/RPM.cpp
index fd25b49..0ba0bdf 100644
--- a/src/Daemon/RPM.cpp
+++ b/src/Daemon/RPM.cpp
@@ -18,180 +18,189 @@
*/
#include "abrtlib.h"
#include "RPM.h"
+#include <rpm/header.h>
+#include <rpm/rpmts.h>
#include "comm_layer_inner.h"
CRPM::CRPM()
{
- static const char *const argv[] = { "", NULL };
- m_poptContext = rpmcliInit(1, (char**)argv, NULL);
+ int status = rpmReadConfigFiles((const char*)NULL, (const char*)NULL);
+ if (status != 0)
+ error_msg("error reading rc files");
}
CRPM::~CRPM()
{
- rpmFreeCrypto();
rpmFreeRpmrc();
- rpmcliFini(m_poptContext);
}
void CRPM::LoadOpenGPGPublicKey(const char* pFileName)
{
- uint8_t* pkt = NULL;
+ const uint8_t* pkt = NULL;
size_t pklen;
- pgpKeyID_t keyID;
if (pgpReadPkts(pFileName, &pkt, &pklen) != PGPARMOR_PUBKEY)
{
- free(pkt);
+ free((void*)pkt);
error_msg("Can't load public GPG key %s", pFileName);
return;
}
+
+ uint8_t keyID[8];
if (pgpPubkeyFingerprint(pkt, pklen, keyID) == 0)
{
char* fedoraFingerprint = pgpHexStr(keyID, sizeof(keyID));
if (fedoraFingerprint != NULL)
- {
m_setFingerprints.insert(fedoraFingerprint);
- free(fedoraFingerprint);
- }
}
- free(pkt);
+ free((void*)pkt);
}
bool CRPM::CheckFingerprint(const char* pPackage)
{
bool ret = false;
+ char *pgpsig = NULL;
+ const char *errmsg = NULL;
+
rpmts ts = rpmtsCreate();
rpmdbMatchIterator iter = rpmtsInitIterator(ts, RPMTAG_NAME, pPackage, 0);
Header header = rpmdbNextIterator(iter);
- if (header != NULL)
+ if (!header)
+ goto error;
+
+ pgpsig = headerSprintf(header, "%{SIGGPG:pgpsig}", rpmTagTable, rpmHeaderFormats, &errmsg);
+ if (!pgpsig && errmsg)
{
- rpmTag rpmTags[] = { RPMTAG_DSAHEADER, RPMTAG_RSAHEADER, RPMTAG_SHA1HEADER };
- int ii;
- for (ii = 0; ii < 3; ii++)
+ VERB1 log("cannot get siggpg:pgpsig. reason: %s", errmsg);
+ goto error;
+ }
+
+ {
+ char *pgpsig_tmp = strstr(pgpsig, " Key ID ");
+ if (pgpsig_tmp)
{
- if (headerIsEntry(header, rpmTags[ii]))
- {
- rpmtd td = rpmtdNew();
- headerGet(header, rpmTags[ii] , td, HEADERGET_DEFAULT);
- char* pgpsig = rpmtdFormat(td, RPMTD_FORMAT_PGPSIG , NULL);
- rpmtdFree(td);
- if (pgpsig)
- {
- std::string PGPSignatureText = pgpsig;
- free(pgpsig);
-
- size_t Key_ID_pos = PGPSignatureText.find(" Key ID ");
- if (Key_ID_pos != std::string::npos)
- {
- std::string headerFingerprint = PGPSignatureText.substr(Key_ID_pos + sizeof (" Key ID ") - 1);
-
- if (headerFingerprint != "")
- {
- if (m_setFingerprints.find(headerFingerprint) != m_setFingerprints.end())
- {
- ret = true;
- break;
- }
- }
- }
- }
- }
+ pgpsig_tmp += sizeof(" Key ID ") - 1;
+ if (m_setFingerprints.find(pgpsig_tmp) != m_setFingerprints.end())
+ ret = true;
}
}
+
+error:
+ free(pgpsig);
rpmdbFreeIterator(iter);
rpmtsFree(ts);
return ret;
}
+/*
+ Checking the MD5 sum requires to run prelink to "un-prelink" the
+ binaries - this is considered potential security risk so we don't
+ use it, until we find some non-intrusive way
+*/
+
+/*
+ * Not woking, need to be rewriten
+ *
bool CheckHash(const char* pPackage, const char* pPath)
{
- bool ret = false;
+ bool ret = true;
rpmts ts = rpmtsCreate();
rpmdbMatchIterator iter = rpmtsInitIterator(ts, RPMTAG_NAME, pPackage, 0);
Header header = rpmdbNextIterator(iter);
- if (header != NULL)
- {
- rpmfi fi = rpmfiNew(ts, header, RPMTAG_BASENAMES, RPMFI_NOHEADER);
- pgpHashAlgo hashAlgo;
- std::string headerHash;
- char computedHash[1024] = "";
+ if (header == NULL)
+ goto error;
+
+ rpmfi fi = rpmfiNew(ts, header, RPMTAG_BASENAMES, RPMFI_NOHEADER);
+ pgpHashAlgo hashAlgo;
+ std::string headerHash;
+ char computedHash[1024] = "";
- while (rpmfiNext(fi) != -1)
+ while (rpmfiNext(fi) != -1)
+ {
+ if (strcmp(pPath, rpmfiFN(fi)) == 0)
{
- if (strcmp(pPath, rpmfiFN(fi)) == 0)
- {
- headerHash = rpmfiFDigestHex(fi, &hashAlgo);
- rpmDoDigest(hashAlgo, pPath, 1, (unsigned char*) computedHash, NULL);
- ret = (headerHash != "" && headerHash == computedHash);
- break;
- }
+ headerHash = rpmfiFDigestHex(fi, &hashAlgo);
+ rpmDoDigest(hashAlgo, pPath, 1, (unsigned char*) computedHash, NULL);
+ ret = (headerHash != "" && headerHash == computedHash);
+ break;
}
- rpmfiFree(fi);
}
+ rpmfiFree(fi);
+error:
rpmdbFreeIterator(iter);
rpmtsFree(ts);
return ret;
}
+*/
-std::string GetDescription(const char* pPackage)
+char* rpm_get_description(const char* pkg)
{
- std::string pDescription;
+ char *dsc = NULL;
+ const char *errmsg = NULL;
rpmts ts = rpmtsCreate();
- rpmdbMatchIterator iter = rpmtsInitIterator(ts, RPMTAG_NAME, pPackage, 0);
+
+ rpmdbMatchIterator iter = rpmtsInitIterator(ts, RPMTAG_NAME, pkg, 0);
Header header = rpmdbNextIterator(iter);
- if (header != NULL)
- {
- rpmtd td = rpmtdNew();
- headerGet(header, RPMTAG_SUMMARY, td, HEADERGET_DEFAULT);
- const char* summary = rpmtdGetString(td);
- headerGet(header, RPMTAG_DESCRIPTION, td, HEADERGET_DEFAULT);
- const char* description = rpmtdGetString(td);
- pDescription = summary + std::string("\n\n") + description;
- rpmtdFree(td);
- }
+ if (!header)
+ goto error;
+
+ dsc = headerSprintf(header, "%{SUMMARY}\n\n%{DESCRIPTION}", rpmTagTable, rpmHeaderFormats, &errmsg);
+ if (!dsc && errmsg)
+ error_msg("cannot get summary and description. reason: %s", errmsg);
+
+error:
rpmdbFreeIterator(iter);
rpmtsFree(ts);
- return pDescription;
+ return dsc;
}
-std::string GetComponent(const char* pFileName)
+char* rpm_get_component(const char* filename)
{
- std::string ret;
- char *package_name;
+ char *ret = NULL;
+ char *srpm = NULL;
+ const char *errmsg = NULL;
+
rpmts ts = rpmtsCreate();
- rpmdbMatchIterator iter = rpmtsInitIterator(ts, RPMTAG_BASENAMES, pFileName, 0);
+ rpmdbMatchIterator iter = rpmtsInitIterator(ts, RPMTAG_BASENAMES, filename, 0);
Header header = rpmdbNextIterator(iter);
- if (header != NULL)
+ if (!header)
+ goto error;
+
+ srpm = headerSprintf(header, "%{SOURCERPM}", rpmTagTable, rpmHeaderFormats, &errmsg);
+ if (!srpm && errmsg)
{
- rpmtd td = rpmtdNew();
- headerGet(header, RPMTAG_SOURCERPM, td, HEADERGET_DEFAULT);
- const char * srpm = rpmtdGetString(td);
- if (srpm != NULL)
- {
- package_name = get_package_name_from_NVR_or_NULL(srpm);
- ret = std::string(package_name);
- free(package_name);
- }
- rpmtdFree(td);
+ error_msg("cannot get srpm. reason: %s", errmsg);
+ goto error;
}
+ ret = get_package_name_from_NVR_or_NULL(srpm);
+ free(srpm);
+
+error:
rpmdbFreeIterator(iter);
rpmtsFree(ts);
return ret;
}
-char* GetPackage(const char* pFileName)
+
+// caller is responsible to free returned value
+char* rpm_get_package_nvr(const char* filename)
{
- char* ret = NULL;
+ char* nvr = NULL;
rpmts ts = rpmtsCreate();
- rpmdbMatchIterator iter = rpmtsInitIterator(ts, RPMTAG_BASENAMES, pFileName, 0);
+ rpmdbMatchIterator iter = rpmtsInitIterator(ts, RPMTAG_BASENAMES, filename, 0);
Header header = rpmdbNextIterator(iter);
- if (header != NULL)
- {
- ret = headerGetNEVR(header, NULL);
- }
+ const char *np, *vp, *rp;
+ if (!header)
+ goto error;
+
+ // returns alway 0
+ headerNVR(header, &np, &vp, &rp);
+ nvr = xasprintf("%s-%s-%s", np, vp, rp);
+
+error:
rpmdbFreeIterator(iter);
rpmtsFree(ts);
- return ret;
+ return nvr;
}
diff --git a/src/Daemon/RPM.h b/src/Daemon/RPM.h
index 4df868d..6170f92 100644
--- a/src/Daemon/RPM.h
+++ b/src/Daemon/RPM.h
@@ -25,6 +25,7 @@
#include <rpm/rpmcli.h>
#include <rpm/rpmts.h>
#include <rpm/rpmdb.h>
+#include <rpm/rpmpgp.h>
#include "abrt_types.h"
/**
@@ -75,7 +76,7 @@ bool CheckHash(const char* pPackage, const char* pPath);
* @param pPackage A package name.
* @return A package description.
*/
-std::string GetDescription(const char* pPackage);
+char* rpm_get_description(const char* pkg);
/**
* Gets a package name. This package contains particular
* file. If the file doesn't belong to any package, empty string is
@@ -83,14 +84,14 @@ std::string GetDescription(const char* pPackage);
* @param pFileName A file name.
* @return A package name (malloced string)
*/
-char* GetPackage(const char* pFileName);
+char* rpm_get_package_nvr(const char* filename);
/**
* Finds a main package for given file. This package contains particular
* file. If the file doesn't belong to any package, empty string is
* returned.
* @param pFileName A file name.
- * @return A package name.
+ * @return a malloc'ed package name. Need to be freed.
*/
-std::string GetComponent(const char* pFileName);
+char* rpm_get_component(const char* filename);
#endif
diff --git a/src/Daemon/gpg_keys b/src/Daemon/gpg_keys
index cde50f1..61663ad 100644
--- a/src/Daemon/gpg_keys
+++ b/src/Daemon/gpg_keys
@@ -1 +1 @@
-/etc/pki/rpm-gpg/RPM-GPG-KEY-fedora
+/etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
--
1.5.5.6
13 years, 9 months