summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPeter Schiffer <pschiffe@redhat.com>2014-06-20 14:53:23 +0200
committerPeter Schiffer <pschiffe@redhat.com>2014-06-20 14:57:50 +0200
commit56fcc9bb569d30b3ecf5404ede731b49cec0f8c7 (patch)
tree107abd5c461e583885beed91787dad6a45414c33 /src
parent65ccf144d14c31b19fe11d7e6c42da2984210270 (diff)
downloadopenlmi-providers-56fcc9bb569d30b3ecf5404ede731b49cec0f8c7.tar.gz
openlmi-providers-56fcc9bb569d30b3ecf5404ede731b49cec0f8c7.tar.xz
openlmi-providers-56fcc9bb569d30b3ecf5404ede731b49cec0f8c7.zip
software-dbus: bugfixes for LMI_SoftwareIdentityFileCheckProvider
* fixed FileSize - RPM is not using sb.st_size when comparing sizes * don't count checksum for symbolic links
Diffstat (limited to 'src')
-rw-r--r--src/software-dbus/LMI_SoftwareIdentityFileCheckProvider.c84
1 files changed, 50 insertions, 34 deletions
diff --git a/src/software-dbus/LMI_SoftwareIdentityFileCheckProvider.c b/src/software-dbus/LMI_SoftwareIdentityFileCheckProvider.c
index 0f865a3..7044818 100644
--- a/src/software-dbus/LMI_SoftwareIdentityFileCheckProvider.c
+++ b/src/software-dbus/LMI_SoftwareIdentityFileCheckProvider.c
@@ -325,38 +325,59 @@ static CMPIStatus LMI_SoftwareIdentityFileCheckGetInstance(
pthread_mutex_unlock(&ts_mutex);
}
- int algo = PGPHASHALGO_MD5;
- char *header_digest = NULL;
- if ((header_digest = rpmfiFDigestHex(fi, &algo))) {
+ int algo;
+ if ((algo = rpmfiDigestAlgo(fi))) {
LMI_SoftwareIdentityFileCheck_Set_ChecksumType(&w, algo);
- if (rpm_mode && S_ISREG(rpm_mode)) {
- LMI_SoftwareIdentityFileCheck_Set_FileChecksumOriginal(&w,
- header_digest);
- }
+ }
- free(header_digest);
- header_digest = NULL;
+ if (file_exists) {
+ rpm_loff_t fsizep = 0;
- unsigned char fdigest[BUFLEN];
- if (rpmDoDigest(algo, file_name, 1, fdigest, NULL) == 0) {
- if (*fdigest) {
- LMI_SoftwareIdentityFileCheck_Set_FileChecksum(&w,
- (char *)fdigest);
+ if (S_ISLNK(sb.st_mode)) {
+ ssize_t r;
+ char link_name[PATH_MAX];
+ if ((r = readlink(file_name, link_name, PATH_MAX)) > 0) {
+ link_name[r] = '\0';
+ LMI_SoftwareIdentityFileCheck_Set_LinkTarget(&w, link_name);
}
- }
- if (rpmDoDigest(PGPHASHALGO_MD5, file_name, 1, fdigest, NULL) == 0) {
- if (*fdigest) {
- LMI_SoftwareIdentityFileCheck_Set_MD5Checksum(&w, (char *)fdigest);
+ } else {
+ char *header_digest = NULL;
+ if ((header_digest = rpmfiFDigestHex(fi, NULL))) {
+ if (rpm_mode && S_ISREG(rpm_mode)) {
+ LMI_SoftwareIdentityFileCheck_Set_FileChecksumOriginal(&w,
+ header_digest);
+ }
+
+ free(header_digest);
+ header_digest = NULL;
+
+ unsigned char fdigest[BUFLEN];
+ if (algo) {
+ if (rpmDoDigest(algo, file_name, 1, fdigest, &fsizep) == 0) {
+ if (*fdigest) {
+ LMI_SoftwareIdentityFileCheck_Set_FileChecksum(&w,
+ (char *)fdigest);
+ if (fsizep) {
+ LMI_SoftwareIdentityFileCheck_Set_FileSize(&w,
+ fsizep);
+ }
+ }
+ }
+ }
+ if (rpmDoDigest(PGPHASHALGO_MD5, file_name, 1, fdigest, NULL) == 0) {
+ if (*fdigest) {
+ LMI_SoftwareIdentityFileCheck_Set_MD5Checksum(&w,
+ (char *)fdigest);
+ }
+ }
}
}
- }
-
- if (rpmfiFSize(fi)) {
- LMI_SoftwareIdentityFileCheck_Set_FileSizeOriginal(&w, rpmfiFSize(fi));
- }
- if (file_exists) {
- LMI_SoftwareIdentityFileCheck_Set_FileSize(&w, sb.st_size);
+ /* RPM is using different size than sb.st_size, so use this size only
+ * if the RPM size is not available */
+ if (!fsizep) {
+ LMI_SoftwareIdentityFileCheck_Set_FileSize(&w, sb.st_size);
+ }
LMI_SoftwareIdentityFileCheck_Set_FileMode(&w, sb.st_mode);
LMI_SoftwareIdentityFileCheck_Init_FileModeFlags(&w,
@@ -368,15 +389,6 @@ static CMPIStatus LMI_SoftwareIdentityFileCheckGetInstance(
LMI_SoftwareIdentityFileCheck_Set_UserID(&w, sb.st_uid);
LMI_SoftwareIdentityFileCheck_Set_GroupID(&w, sb.st_gid);
LMI_SoftwareIdentityFileCheck_Set_LastModificationTime(&w, sb.st_mtime);
-
- if (S_ISLNK(sb.st_mode)) {
- ssize_t r;
- char link_name[PATH_MAX];
- if ((r = readlink(file_name, link_name, PATH_MAX)) > 0) {
- link_name[r] = '\0';
- LMI_SoftwareIdentityFileCheck_Set_LinkTarget(&w, link_name);
- }
- }
}
if (rpm_mode) {
@@ -389,6 +401,10 @@ static CMPIStatus LMI_SoftwareIdentityFileCheckGetInstance(
rpm_mode);
}
+ if (rpmfiFSize(fi)) {
+ LMI_SoftwareIdentityFileCheck_Set_FileSizeOriginal(&w, rpmfiFSize(fi));
+ }
+
if (rpmfiFUser(fi)) {
struct passwd *pwd = getpwnam(rpmfiFUser(fi));
if (pwd) {