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