diff options
author | Peter Schiffer <pschiffe@redhat.com> | 2014-06-20 14:53:23 +0200 |
---|---|---|
committer | Peter Schiffer <pschiffe@redhat.com> | 2014-06-20 14:57:50 +0200 |
commit | 56fcc9bb569d30b3ecf5404ede731b49cec0f8c7 (patch) | |
tree | 107abd5c461e583885beed91787dad6a45414c33 /src | |
parent | 65ccf144d14c31b19fe11d7e6c42da2984210270 (diff) | |
download | openlmi-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.c | 84 |
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) { |