diff options
Diffstat (limited to 'recipes-core/coreutils/coreutils-6.9/coreutils-fix-install.patch')
-rw-r--r-- | recipes-core/coreutils/coreutils-6.9/coreutils-fix-install.patch | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/recipes-core/coreutils/coreutils-6.9/coreutils-fix-install.patch b/recipes-core/coreutils/coreutils-6.9/coreutils-fix-install.patch new file mode 100644 index 0000000..88f61fa --- /dev/null +++ b/recipes-core/coreutils/coreutils-6.9/coreutils-fix-install.patch | |||
@@ -0,0 +1,101 @@ | |||
1 | Upstream-Status: Inappropriate [legacy version] | ||
2 | |||
3 | The install command doesn't over write the dangling symlink, for | ||
4 | example: | ||
5 | |||
6 | $ install fileA /tmp/fileA | ||
7 | |||
8 | If /tmp/fileA is a dangling symlink, there would be an error: | ||
9 | |||
10 | install: cannot create regular file '/tmp/fileA': File exists | ||
11 | |||
12 | This is because of the following code in copy.c: | ||
13 | |||
14 | if (!new_dst) | ||
15 | { | ||
16 | if (XSTAT (x, dst_name, &dst_sb) != 0) | ||
17 | { | ||
18 | if (errno != ENOENT) | ||
19 | { | ||
20 | error (0, errno, _("cannot stat %s"), quote (dst_name)); | ||
21 | return false; | ||
22 | } | ||
23 | else | ||
24 | { | ||
25 | new_dst = true; | ||
26 | } | ||
27 | } | ||
28 | |||
29 | XSTAT() use stat() for dst_name(the dangling symlink /tmp/fileA) when | ||
30 | install.c invokes it, and stat will set errno to ENOENT, and then | ||
31 | new_dst will be set to true which means that /tmp/fileA doesn't exist, | ||
32 | then we will create /tmp/fileA without remove it first, so the error | ||
33 | comes. | ||
34 | |||
35 | This is fixed in a way which adds the member cmd_install in | ||
36 | struct cp_options to make sure my change only affected to the install | ||
37 | command and use lstat to fix the problem. | ||
38 | |||
39 | Signed-off-by: Robert Yang <liezhi.yang@windriver.com> | ||
40 | Signed-off-by: Mark Hatle <mark.hatle@windriver.com> | ||
41 | |||
42 | --- | ||
43 | src/copy.c | 10 +++++++++- | ||
44 | src/copy.h | 3 +++ | ||
45 | src/install.c | 1 + | ||
46 | 3 files changed, 13 insertions(+), 1 deletions(-) | ||
47 | |||
48 | diff --git a/src/copy.c b/src/copy.c | ||
49 | --- a/src/copy.c | ||
50 | +++ b/src/copy.c | ||
51 | @@ -1029,6 +1029,7 @@ copy_internal (char const *src_name, char const *dst_name, | ||
52 | bool delayed_ok; | ||
53 | bool copied_as_regular = false; | ||
54 | bool preserve_metadata; | ||
55 | + int dst_stat_result; | ||
56 | |||
57 | if (x->move_mode && rename_succeeded) | ||
58 | *rename_succeeded = false; | ||
59 | @@ -1069,7 +1070,14 @@ copy_internal (char const *src_name, char const *dst_name, | ||
60 | |||
61 | if (!new_dst) | ||
62 | { | ||
63 | - if (XSTAT (x, dst_name, &dst_sb) != 0) | ||
64 | + if ( x->cmd_install && ( x->backup_type == no_backups)) | ||
65 | + dst_stat_result = lstat (dst_name, &dst_sb); | ||
66 | + else | ||
67 | + { | ||
68 | + dst_stat_result = XSTAT (x, dst_name, &dst_sb); | ||
69 | + } | ||
70 | + | ||
71 | + if (dst_stat_result != 0) | ||
72 | { | ||
73 | if (errno != ENOENT) | ||
74 | { | ||
75 | diff --git a/src/copy.h b/src/copy.h | ||
76 | --- a/src/copy.h | ||
77 | +++ b/src/copy.h | ||
78 | @@ -114,6 +114,9 @@ struct cp_options | ||
79 | If that fails, then resort to copying. */ | ||
80 | bool move_mode; | ||
81 | |||
82 | + /* For the install command */ | ||
83 | + bool cmd_install; | ||
84 | + | ||
85 | /* Whether this process has appropriate privileges to chown a file | ||
86 | whose owner is not the effective user ID. */ | ||
87 | bool chown_privileges; | ||
88 | diff --git a/src/install.c b/src/install.c | ||
89 | --- a/src/install.c | ||
90 | +++ b/src/install.c | ||
91 | @@ -149,6 +149,7 @@ cp_option_init (struct cp_options *x) | ||
92 | x->hard_link = false; | ||
93 | x->interactive = I_UNSPECIFIED; | ||
94 | x->move_mode = false; | ||
95 | + x->cmd_install = true; | ||
96 | x->chown_privileges = chown_privileges (); | ||
97 | x->one_file_system = false; | ||
98 | x->preserve_ownership = false; | ||
99 | -- | ||
100 | 1.7.0.1 | ||
101 | |||