teknoraver / rpms / rpm

Forked from rpms/rpm 2 months ago
Clone
Blob Blame History Raw
--- a/plugins/reflink.c
+++ b/plugins/reflink.c
@@ -277,13 +277,17 @@ static rpmRC reflink_fsm_file_install(rpmPlugin plugin, rpmfi fi, const char* pa
     fcr.dest_offset = 0;
     if (S_ISREG(file_mode) && !(rpmfiFFlags(fi) & RPMFILE_GHOST)) {
 	rpm_ino_t inode = rpmfiFInode(fi);
+        char fullpath[PATH_MAX];
+
+        snprintf(fullpath, sizeof(fullpath), "%s/%s", rpmfiDN(fi), path);
+
 	/* check for hard link entry in table. GetEntry overwrites hlix with
 	 * the address of the first match.
 	 */
 	if (inodeIndexHashGetEntry(state->inodeIndexes, inode, &hl_target,
 				   NULL, NULL)) {
 	    /* entry is in table, use hard link */
-	    if (link(hl_target[0], path) != 0) {
+	    if (link(hl_target[0], fullpath) != 0) {
 		rpmlog(RPMLOG_ERR,
 		       _("reflink: Unable to hard link %s -> %s due to %s\n"),
 		       hl_target[0], path, strerror(errno));
@@ -296,11 +300,11 @@ static rpmRC reflink_fsm_file_install(rpmPlugin plugin, rpmfi fi, const char* pa
 	 */
 	if (rpmfiFNlink(fi) > 1) {
 	    /* minor optimization: only store files with more than one link */
-	    inodeIndexHashAddEntry(state->inodeIndexes, inode, rstrdup(path));
+	    inodeIndexHashAddEntry(state->inodeIndexes, inode, rstrdup(fullpath));
 	}
 	/* derived from wfd_open in fsm.c */
 	mode_t old_umask = umask(0577);
-	dst = open(path, O_WRONLY | O_CREAT | O_EXCL, S_IRUSR);
+	dst = open(fullpath, O_WRONLY | O_CREAT | O_EXCL, S_IRUSR);
 	umask(old_umask);
 	if (dst == -1) {
 	    rpmlog(RPMLOG_ERR,