From ecab80b80e3917d3acf0f909c9cc84691a207fc0 Mon Sep 17 00:00:00 2001 From: chantra Date: Thu, 3 Feb 2022 21:09:05 -0800 Subject: [PATCH 12/30] [rpmextents] Create an internal library to make rpmextents file manipulation easier and less duplicated --- lib/Makefile.am | 3 ++- lib/rpmchecksig.c | 42 +--------------------------------- lib/rpmextents.c | 46 +++++++++++++++++++++++++++++++++++++ lib/rpmextents_internal.h | 22 ++++++++++++++++++ plugins/reflink.c | 48 +++++++++++++-------------------------- rpm2extents.c | 8 ++----- 6 files changed, 89 insertions(+), 80 deletions(-) create mode 100644 lib/rpmextents.c create mode 100644 lib/rpmextents_internal.h diff --git a/lib/Makefile.am b/lib/Makefile.am index 5a1b6ca9b..2f1b3597f 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -41,7 +41,8 @@ librpm_la_SOURCES = \ rpmscript.h rpmscript.c \ rpmchroot.c rpmchroot.h \ rpmplugins.c rpmplugins.h rpmplugin.h rpmug.c rpmug.h \ - rpmtriggers.h rpmtriggers.c rpmvs.c rpmvs.h + rpmtriggers.h rpmtriggers.c rpmvs.c rpmvs.h \ + rpmextents.c rpmextents_internal.h librpm_la_LDFLAGS = -version-info $(rpm_version_info) diff --git a/lib/rpmchecksig.c b/lib/rpmchecksig.c index 6164d012c..dc1726a18 100644 --- a/lib/rpmchecksig.c +++ b/lib/rpmchecksig.c @@ -20,15 +20,11 @@ #include "rpmio/rpmio_internal.h" /* fdSetBundle() */ #include "lib/rpmlead.h" #include "lib/header_internal.h" +#include "lib/rpmextents_internal.h" #include "lib/rpmvs.h" #include "debug.h" -/* magic value at end of file (64 bits) that indicates this is a transcoded - * rpm. - */ -#define MAGIC 3472329499408095051 - static int doImport(rpmts ts, const char *fn, char *buf, ssize_t blen) { char const * const pgpmark = "-----BEGIN PGP "; @@ -225,42 +221,6 @@ exit: return rc; } -static rpmRC isTranscodedRpm(FD_t fd) { - rpmRC rc = RPMRC_NOTFOUND; - rpm_loff_t current; - uint64_t magic; - size_t len; - - // If the file is not seekable, we cannot detect whether or not it is transcoded. - if(Fseek(fd, 0, SEEK_CUR) < 0) { - return RPMRC_FAIL; - } - current = Ftell(fd); - - if(Fseek(fd, -(sizeof(magic)), SEEK_END) < 0) { - rpmlog(RPMLOG_ERR, _("isTranscodedRpm: failed to seek for magic\n")); - rc = RPMRC_FAIL; - goto exit; - } - len = sizeof(magic); - if (Fread(&magic, len, 1, fd) != len) { - rpmlog(RPMLOG_ERR, _("isTranscodedRpm: unable to read magic\n")); - rc = RPMRC_FAIL; - goto exit; - } - if (magic != MAGIC) { - rpmlog(RPMLOG_DEBUG, _("isTranscodedRpm: not transcoded\n")); - rc = RPMRC_NOTFOUND; - goto exit; - } - rc = RPMRC_OK; -exit: - if (Fseek(fd, current, SEEK_SET) < 0) { - rpmlog(RPMLOG_ERR, _("isTranscodedRpm: unable to seek back to original location\n")); - } - return rc; -} - static int rpmpkgVerifySigsTranscoded(FD_t fd){ rpm_loff_t current; uint64_t magic; diff --git a/lib/rpmextents.c b/lib/rpmextents.c new file mode 100644 index 000000000..015277751 --- /dev/null +++ b/lib/rpmextents.c @@ -0,0 +1,46 @@ + +#include "system.h" + +#include +#include + +#include "lib/rpmextents_internal.h" + +rpmRC isTranscodedRpm(FD_t fd) { + 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. + if(Fseek(fd, 0, SEEK_CUR) < 0) { + return RPMRC_FAIL; + } + current = Ftell(fd); + + if(Fseek(fd, -(sizeof(magic)), SEEK_END) < 0) { + rpmlog(RPMLOG_ERR, _("isTranscodedRpm: failed to seek for magic\n")); + rc = RPMRC_FAIL; + goto exit; + } + len = sizeof(magic); + if (Fread(&magic, len, 1, fd) != len) { + rpmlog(RPMLOG_ERR, _("isTranscodedRpm: unable to read magic\n")); + rc = RPMRC_FAIL; + goto exit; + } + if (magic != EXTENTS_MAGIC) { + rpmlog(RPMLOG_DEBUG, _("isTranscodedRpm: not transcoded\n")); + rc = RPMRC_NOTFOUND; + goto exit; + } + rc = RPMRC_OK; +exit: + if (Fseek(fd, current, SEEK_SET) < 0) { + rpmlog(RPMLOG_ERR, _("isTranscodedRpm: unable to seek back to original location\n")); + rc = RPMRC_FAIL; + } + return rc; +} + + diff --git a/lib/rpmextents_internal.h b/lib/rpmextents_internal.h new file mode 100644 index 000000000..57cecfc31 --- /dev/null +++ b/lib/rpmextents_internal.h @@ -0,0 +1,22 @@ +#ifndef _RPMEXTENTS_INTERNAL_H +#define _RPMEXTENTS_INTERNAL_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/* magic value at end of file (64 bits) that indicates this is a transcoded + * rpm. + */ +#define EXTENTS_MAGIC 3472329499408095051 + +typedef uint64_t extents_magic_t; + +rpmRC isTranscodedRpm(FD_t fd); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/plugins/reflink.c b/plugins/reflink.c index 513887604..ec575f55e 100644 --- a/plugins/reflink.c +++ b/plugins/reflink.c @@ -13,6 +13,7 @@ #include #include "lib/rpmlib.h" #include "lib/rpmplugin.h" +#include "lib/rpmextents_internal.h" #include "lib/rpmte_internal.h" #include #include "rpmio/rpmio_internal.h" @@ -40,11 +41,6 @@ #define BUFFER_SIZE (1024 * 128) -/* magic value at end of file (64 bits) that indicates this is a transcoded - * rpm. - */ -#define MAGIC 3472329499408095051 - struct reflink_state_s { /* Stuff that's used across rpms */ long fundamental_block_size; @@ -96,40 +92,28 @@ static void reflink_cleanup(rpmPlugin plugin) { } static rpmRC reflink_psm_pre(rpmPlugin plugin, rpmte te) { + rpmRC rc; + size_t len; + reflink_state state = rpmPluginGetData(plugin); state->fd = rpmteFd(te); if (state->fd == 0) { rpmlog(RPMLOG_DEBUG, _("reflink: fd = 0, no install\n")); return RPMRC_OK; } + rpm_loff_t current = Ftell(state->fd); - uint64_t magic; - if (Fseek(state->fd, -(sizeof(magic)), SEEK_END) < 0) { - rpmlog(RPMLOG_ERR, _("reflink: failed to seek for magic\n")); - if (Fseek(state->fd, current, SEEK_SET) < 0) { - /* yes this gets a bit repetitive */ - rpmlog(RPMLOG_ERR, - _("reflink: unable to seek back to original location\n")); - } - return RPMRC_FAIL; - } - size_t len = sizeof(magic); - if (Fread(&magic, len, 1, state->fd) != len) { - rpmlog(RPMLOG_ERR, _("reflink: unable to read magic\n")); - if (Fseek(state->fd, current, SEEK_SET) < 0) { - rpmlog(RPMLOG_ERR, - _("reflink: unable to seek back to original location\n")); - } - return RPMRC_FAIL; - } - if (magic != MAGIC) { - rpmlog(RPMLOG_DEBUG, _("reflink: not transcoded\n")); - if (Fseek(state->fd, current, SEEK_SET) < 0) { - rpmlog(RPMLOG_ERR, - _("reflink: unable to seek back to original location\n")); + rc = isTranscodedRpm(state->fd); + + switch(rc){ + // Fail to parse the file, fail the plugin. + case RPMRC_FAIL: return RPMRC_FAIL; - } - return RPMRC_OK; + // This is not a transcoded file, do nothing. + case RPMRC_NOTFOUND: + return RPMRC_OK; + default: + break; } rpmlog(RPMLOG_DEBUG, _("reflink: *is* transcoded\n")); Header h = rpmteHeader(te); @@ -140,7 +124,7 @@ static rpmRC reflink_psm_pre(rpmPlugin plugin, rpmte te) { headerFree(h); state->files = rpmteFiles(te); /* tail of file contains offset_table, offset_checksums then magic */ - if (Fseek(state->fd, -(sizeof(rpm_loff_t) * 2 + sizeof(magic)), SEEK_END) < 0) { + if (Fseek(state->fd, -(sizeof(rpm_loff_t) * 2 + sizeof(extents_magic_t)), SEEK_END) < 0) { rpmlog(RPMLOG_ERR, _("reflink: failed to seek for tail %p\n"), state->fd); return RPMRC_FAIL; diff --git a/rpm2extents.c b/rpm2extents.c index e316a2834..a326e3857 100644 --- a/rpm2extents.c +++ b/rpm2extents.c @@ -15,6 +15,7 @@ #include "lib/rpmts.h" #include "lib/signature.h" #include "lib/header_internal.h" +#include "lib/rpmextents_internal.h" #include "rpmio/rpmio_internal.h" #include @@ -37,11 +38,6 @@ #include "lib/rpmhash.H" #include "lib/rpmhash.C" -/* magic value at end of file (64 bits) that indicates this is a transcoded - * rpm. - */ -#define MAGIC 3472329499408095051 - struct digestoffset { const unsigned char * digest; rpm_loff_t pos; @@ -402,7 +398,7 @@ static rpmRC process_package(FD_t fdi, FD_t digestori, FD_t validationi) rc = RPMRC_FAIL; goto exit; } - uint64_t magic = MAGIC; + extents_magic_t magic = EXTENTS_MAGIC; len = sizeof(magic); if (Fwrite(&magic, len, 1, fdo) != len) { fprintf(stderr, _("Unable to write magic\n")); -- 2.35.1