From aabaa6c6587c37b84a1b9cfd98bff31f1b69345e Mon Sep 17 00:00:00 2001 From: chantra Date: Wed, 16 Feb 2022 17:00:09 -0800 Subject: [PATCH 24/30] [rpm2extents] create footer struct and helpers new extents_footer and extents_footer_offset struct with a function to load offsets from an FD. Change existing code to use new struct/functions --- lib/rpmchecksig.c | 16 +++------------- lib/rpmextents.c | 26 +++++++++++++++++--------- lib/rpmextents_internal.h | 31 ++++++++++++++++++++++++++++++- rpm2extents.c | 23 ++++------------------- 4 files changed, 54 insertions(+), 42 deletions(-) diff --git a/lib/rpmchecksig.c b/lib/rpmchecksig.c index dc1726a18..729f79f9f 100644 --- a/lib/rpmchecksig.c +++ b/lib/rpmchecksig.c @@ -223,29 +223,19 @@ exit: static int rpmpkgVerifySigsTranscoded(FD_t fd){ rpm_loff_t current; - uint64_t magic; - rpm_loff_t offset; int32_t rc; size_t len; uint64_t content_len; char *content = NULL; + struct extents_footer_t footer; current = Ftell(fd); - if(Fseek(fd, -(sizeof(magic) + 3 * sizeof(offset) ), SEEK_END) < 0) { - rpmlog(RPMLOG_ERR, _("rpmpkgVerifySigsTranscoded: failed to seek for offset\n")); + if(extentsFooterFromFD(fd, &footer) != RPMRC_OK) { rc = -1; goto exit; } - - len = sizeof(offset); - if (Fread(&offset, len, 1, fd) != len) { - rpmlog(RPMLOG_ERR, _("rpmpkgVerifySigsTranscoded: Failed to read Signature Verification offset\n")); - rc = -1; - goto exit; - } - - if(Fseek(fd, offset, SEEK_SET) < 0) { + if(Fseek(fd, footer.offsets.checksig_offset, SEEK_SET) < 0) { rpmlog(RPMLOG_ERR, _("rpmpkgVerifySigsTranscoded: Failed to seek signature verification offset\n")); rc = -1; goto exit; diff --git a/lib/rpmextents.c b/lib/rpmextents.c index 015277751..46b7aadff 100644 --- a/lib/rpmextents.c +++ b/lib/rpmextents.c @@ -3,13 +3,16 @@ #include #include +#include +#include + #include "lib/rpmextents_internal.h" -rpmRC isTranscodedRpm(FD_t fd) { +rpmRC extentsFooterFromFD(FD_t fd, struct extents_footer_t *footer) { + rpmRC rc = RPMRC_NOTFOUND; rpm_loff_t current; - extents_magic_t magic; size_t len; // If the file is not seekable, we cannot detect whether or not it is transcoded. @@ -18,19 +21,19 @@ rpmRC isTranscodedRpm(FD_t fd) { } current = Ftell(fd); - if(Fseek(fd, -(sizeof(magic)), SEEK_END) < 0) { - rpmlog(RPMLOG_ERR, _("isTranscodedRpm: failed to seek for magic\n")); + len = sizeof(struct extents_footer_t); + if(Fseek(fd, -len, SEEK_END) < 0) { + rpmlog(RPMLOG_ERR, _("isTranscodedRpm: failed to seek for footer: %s\n"), strerror(errno)); rc = RPMRC_FAIL; goto exit; } - len = sizeof(magic); - if (Fread(&magic, len, 1, fd) != len) { - rpmlog(RPMLOG_ERR, _("isTranscodedRpm: unable to read magic\n")); + if (Fread(footer, len, 1, fd) != len) { + rpmlog(RPMLOG_ERR, _("isTranscodedRpm: unable to read footer\n")); rc = RPMRC_FAIL; goto exit; } - if (magic != EXTENTS_MAGIC) { - rpmlog(RPMLOG_DEBUG, _("isTranscodedRpm: not transcoded\n")); + if (footer->magic != EXTENTS_MAGIC) { + rpmlog(RPMLOG_ERR, _("isTranscodedRpm: not transcoded\n")); rc = RPMRC_NOTFOUND; goto exit; } @@ -43,4 +46,9 @@ exit: return rc; } +rpmRC isTranscodedRpm(FD_t fd) { + struct extents_footer_t footer; + return extentsFooterFromFD(fd, &footer); +} + diff --git a/lib/rpmextents_internal.h b/lib/rpmextents_internal.h index 57cecfc31..f0c29c807 100644 --- a/lib/rpmextents_internal.h +++ b/lib/rpmextents_internal.h @@ -7,6 +7,10 @@ extern "C" { #include +/** \ingroup rpmextents + * RPM extents library + */ + /* magic value at end of file (64 bits) that indicates this is a transcoded * rpm. */ @@ -14,9 +18,34 @@ extern "C" { typedef uint64_t extents_magic_t; +struct __attribute__ ((__packed__)) extents_footer_offsets_t { + off64_t checksig_offset; + off64_t table_offset; + off64_t csum_offset; +}; + +struct __attribute__ ((__packed__)) extents_footer_t { + struct extents_footer_offsets_t offsets; + extents_magic_t magic; +}; + + +/** \ingroup rpmextents + * Read the RPM Extents footer from a file descriptor. + * @param fd The FD_t of the transcoded RPM + * @param[out] footer A pointer to an allocated extents_footer_t with a copy of the footer. + * @return RPMRC_OK on success, RPMRC_NOTFOUND if not a transcoded file, RPMRC_FAIL on any failure. + */ +rpmRC extentsFooterFromFD(FD_t fd, struct extents_footer_t *footer); + +/** \ingroup rpmextents + * Check if a RPM is a transcoded RPM + * @param fd The FD_t of the transcoded RPM + * return RPMRC_OK on success, RPMRC_NOTFOUND if not a transcoded file, RPMRC_FAIL on any failure. + */ rpmRC isTranscodedRpm(FD_t fd); #ifdef __cplusplus } #endif -#endif +#endif /* _RPMEXTENTS_INTERNAL_H */ diff --git a/rpm2extents.c b/rpm2extents.c index e1a19fedb..7dd5128de 100644 --- a/rpm2extents.c +++ b/rpm2extents.c @@ -405,25 +405,10 @@ static rpmRC process_package(FD_t fdi, FD_t digestori, FD_t validationi) goto exit; } zeros = _free(zeros); - if (Fwrite(&validation_pos, len, 1, fdo) != len) { - rpmlog(RPMLOG_ERR, _("Unable to write offset of validation output\n")); - rc = RPMRC_FAIL; - goto exit; - } - if (Fwrite(&digest_table_pos, len, 1, fdo) != len) { - rpmlog(RPMLOG_ERR, _("Unable to write offset of digest table\n")); - rc = RPMRC_FAIL; - goto exit; - } - if (Fwrite(&digest_pos, len, 1, fdo) != len) { - rpmlog(RPMLOG_ERR, _("Unable to write offset of validation table\n")); - rc = RPMRC_FAIL; - goto exit; - } - extents_magic_t magic = EXTENTS_MAGIC; - len = sizeof(magic); - if (Fwrite(&magic, len, 1, fdo) != len) { - rpmlog(RPMLOG_ERR, _("Unable to write magic\n")); + struct extents_footer_t footer = {.offsets = {validation_pos, digest_table_pos, digest_pos}, .magic = EXTENTS_MAGIC}; + len = sizeof(footer); + if (Fwrite(&footer, len, 1, fdo) != len) { + rpmlog(RPMLOG_ERR, _("Unable to write footer\n")); rc = RPMRC_FAIL; goto exit; } -- 2.35.1