cpio/revert-CVE-2015-1197-Fix-45b0ee2b407913c533f7ded8d6f8cbeec16ff6ca.patch
zhangruifang2020 459ab51a8c update to 2.14
2023-07-17 11:57:02 +08:00

219 lines
5.6 KiB
Diff
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

From a365d052b01a5df1ffe716ee8af3e71ee15836fa Mon Sep 17 00:00:00 2001
From: zhangruifang2020 <zhangruifang1@h-partners.com>
Date: Mon, 17 Jul 2023 11:39:03 +0800
Subject: [PATCH] revert Fix 45b0ee2b407913c533f7ded8d6f8cbeec16ff6ca
---
src/copyin.c | 173 +++++++--------------------------------------------
1 file changed, 22 insertions(+), 151 deletions(-)
diff --git a/src/copyin.c b/src/copyin.c
index f2babb7..2316feb 100644
--- a/src/copyin.c
+++ b/src/copyin.c
@@ -30,7 +30,6 @@
#ifndef FNM_PATHNAME
# include <fnmatch.h>
#endif
-#include <hash.h>
#ifndef HAVE_LCHOWN
# define lchown(f,u,g) 0
@@ -622,136 +621,6 @@ copyin_device (struct cpio_file_stat* file_hdr)
file_hdr->c_mtime);
}
-struct delayed_link
- {
- /* The device and inode number of the placeholder. */
- dev_t dev;
- ino_t ino;
-
- /* The desired link metadata. */
- mode_t mode;
- uid_t uid;
- gid_t gid;
- time_t mtime;
-
- /* Link source and target names. */
- char *source;
- char target[1];
- };
-
-static Hash_table *delayed_link_table;
-
-static size_t
-dl_hash (void const *entry, size_t table_size)
-{
- struct delayed_link const *dl = entry;
- uintmax_t n = dl->dev;
- int nshift = (sizeof (n) - sizeof (dl->dev)) * CHAR_BIT;
- if (0 < nshift)
- n <<= nshift;
- n ^= dl->ino;
- return n % table_size;
-}
-
-static bool
-dl_compare (void const *a, void const *b)
-{
- struct delayed_link const *da = a, *db = b;
- return (da->dev == db->dev) & (da->ino == db->ino);
-}
-
-static int
-symlink_placeholder (char *oldpath, char *newpath, struct cpio_file_stat *file_stat)
-{
- int fd = open (newpath, O_WRONLY | O_CREAT | O_EXCL, 0);
- struct stat st;
- struct delayed_link *p;
- size_t newlen = strlen (newpath);
-
- if (fd < 0)
- {
- open_error (newpath);
- return -1;
- }
-
- if (fstat (fd, &st) != 0)
- {
- stat_error (newpath);
- close (fd);
- return -1;
- }
-
- close (fd);
-
- p = xmalloc (sizeof (*p) + strlen (oldpath) + newlen + 1);
- p->dev = st.st_dev;
- p->ino = st.st_ino;
-
- p->mode = file_stat->c_mode;
- p->uid = file_stat->c_uid;
- p->gid = file_stat->c_gid;
- p->mtime = file_stat->c_mtime;
-
- strcpy (p->target, newpath);
- p->source = p->target + newlen + 1;
- strcpy (p->source, oldpath);
-
- if (!((delayed_link_table
- || (delayed_link_table = hash_initialize (0, 0, dl_hash,
- dl_compare, free)))
- && hash_insert (delayed_link_table, p)))
- xalloc_die ();
-
- return 0;
-}
-
-static void
-replace_symlink_placeholders (void)
-{
- struct delayed_link *dl;
-
- if (!delayed_link_table)
- return;
- for (dl = hash_get_first (delayed_link_table);
- dl;
- dl = hash_get_next (delayed_link_table, dl))
- {
- struct stat st;
-
- /* Make sure the placeholder file is still there. If not,
- don't create a link, as the placeholder was probably
- removed by a later extraction. */
- if (lstat (dl->target, &st) == 0
- && st.st_dev == dl->dev
- && st.st_ino == dl->ino)
- {
- if (unlink (dl->target))
- unlink_error (dl->target);
- else
- {
- int res = UMASKED_SYMLINK (dl->source, dl->target, dl->mode);
- if (res < 0 && create_dir_flag)
- {
- create_all_directories (dl->target);
- res = UMASKED_SYMLINK (dl->source, dl->target, dl->mode);
- }
- if (res < 0)
- symlink_error (dl->source, dl->target);
- else if (!no_chown_flag)
- {
- uid_t uid = set_owner_flag ? set_owner : dl->uid;
- gid_t gid = set_group_flag ? set_group : dl->gid;
- if (lchown (dl->target, uid, gid) < 0 && errno != EPERM)
- chown_error_details (dl->target, uid, gid);
- }
- }
- }
- }
-
- hash_free (delayed_link_table);
- delayed_link_table = NULL;
-}
-
static void
copyin_link (struct cpio_file_stat *file_hdr, int in_file_des)
{
@@ -777,26 +646,29 @@ copyin_link (struct cpio_file_stat *file_hdr, int in_file_des)
link_name = xstrdup (file_hdr->c_tar_linkname);
}
- if (no_abs_paths_flag)
- symlink_placeholder (link_name, file_hdr->c_name, file_hdr);
- else
+ cpio_safer_name_suffix (link_name, true, !no_abs_paths_flag, false);
+
+ res = UMASKED_SYMLINK (link_name, file_hdr->c_name,
+ file_hdr->c_mode);
+ if (res < 0 && create_dir_flag)
{
- res = UMASKED_SYMLINK (link_name, file_hdr->c_name,
- file_hdr->c_mode);
- if (res < 0 && create_dir_flag)
- {
- create_all_directories (file_hdr->c_name);
- res = UMASKED_SYMLINK (link_name, file_hdr->c_name, file_hdr->c_mode);
- }
- if (res < 0)
- symlink_error (link_name, file_hdr->c_name);
- else if (!no_chown_flag)
- {
- uid_t uid = set_owner_flag ? set_owner : file_hdr->c_uid;
- gid_t gid = set_group_flag ? set_group : file_hdr->c_gid;
- if (lchown (file_hdr->c_name, uid, gid) < 0 && errno != EPERM)
- chown_error_details (file_hdr->c_name, uid, gid);
- }
+ create_all_directories (file_hdr->c_name);
+ res = UMASKED_SYMLINK (link_name, file_hdr->c_name, file_hdr->c_mode);
+ }
+ if (res < 0)
+ {
+ error (0, errno, _("%s: Cannot symlink to %s"),
+ quotearg_colon (link_name), quote_n (1, file_hdr->c_name));
+ free (link_name);
+ return;
+ }
+ if (!no_chown_flag)
+ {
+ uid_t uid = set_owner_flag ? set_owner : file_hdr->c_uid;
+ gid_t gid = set_group_flag ? set_group : file_hdr->c_gid;
+ if ((lchown (file_hdr->c_name, uid, gid) < 0)
+ && errno != EPERM)
+ chown_error_details (file_hdr->c_name, uid, gid);
}
free (link_name);
}
@@ -1577,7 +1449,6 @@ process_copy_in (void)
if (dot_flag)
fputc ('\n', stderr);
- replace_symlink_placeholders ();
apply_delayed_set_stat ();
cpio_file_stat_free (&file_hdr);
--
2.27.0