commit
6483eba451
File diff suppressed because it is too large
Load Diff
90
backport-chmod-fix-exit-status-when-ignoring-symlinks.patch
Normal file
90
backport-chmod-fix-exit-status-when-ignoring-symlinks.patch
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
From e8b56ebd536e82b15542a00c888109471936bfda Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?P=C3=A1draig=20Brady?= <P@draigBrady.com>
|
||||||
|
Date: Fri, 24 Sep 2021 20:57:41 +0100
|
||||||
|
Subject: [PATCH] chmod: fix exit status when ignoring symlinks
|
||||||
|
|
||||||
|
* src/chmod.c: Reorder enum so CH_NOT_APPLIED
|
||||||
|
can be treated as a non error.
|
||||||
|
* tests/chmod/ignore-symlink.sh: A new test.
|
||||||
|
* tests/local.mk: Reference the new test.
|
||||||
|
* NEWS: Mention the bug fix.
|
||||||
|
Fixes https://bugs.gnu.org/50784
|
||||||
|
---
|
||||||
|
src/chmod.c | 4 ++--
|
||||||
|
tests/chmod/ignore-symlink.sh | 31 +++++++++++++++++++++++++++++++
|
||||||
|
tests/local.mk | 1 +
|
||||||
|
4 files changed, 40 insertions(+), 2 deletions(-)
|
||||||
|
create mode 100755 tests/chmod/ignore-symlink.sh
|
||||||
|
|
||||||
|
diff --git a/src/chmod.c b/src/chmod.c
|
||||||
|
index 37b04f5006..57ac47f33a 100644
|
||||||
|
--- a/src/chmod.c
|
||||||
|
+++ b/src/chmod.c
|
||||||
|
@@ -44,8 +44,8 @@ struct change_status
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
CH_NO_STAT,
|
||||||
|
- CH_NOT_APPLIED,
|
||||||
|
CH_FAILED,
|
||||||
|
+ CH_NOT_APPLIED,
|
||||||
|
CH_NO_CHANGE_REQUESTED,
|
||||||
|
CH_SUCCEEDED
|
||||||
|
}
|
||||||
|
@@ -322,7 +322,7 @@ process_file (FTS *fts, FTSENT *ent)
|
||||||
|
if ( ! recurse)
|
||||||
|
fts_set (fts, ent, FTS_SKIP);
|
||||||
|
|
||||||
|
- return CH_NO_CHANGE_REQUESTED <= ch.status;
|
||||||
|
+ return CH_NOT_APPLIED <= ch.status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Recursively change the modes of the specified FILES (the last entry
|
||||||
|
diff --git a/tests/chmod/ignore-symlink.sh b/tests/chmod/ignore-symlink.sh
|
||||||
|
new file mode 100755
|
||||||
|
index 0000000000..5ce3de8163
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/tests/chmod/ignore-symlink.sh
|
||||||
|
@@ -0,0 +1,31 @@
|
||||||
|
+#!/bin/sh
|
||||||
|
+# Test for proper exit code of chmod on a processed symlink.
|
||||||
|
+
|
||||||
|
+# Copyright (C) 2021 Free Software Foundation, Inc.
|
||||||
|
+
|
||||||
|
+# This program is free software: you can redistribute it and/or modify
|
||||||
|
+# it under the terms of the GNU General Public License as published by
|
||||||
|
+# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
+# (at your option) any later version.
|
||||||
|
+
|
||||||
|
+# This program is distributed in the hope that it will be useful,
|
||||||
|
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
+# GNU General Public License for more details.
|
||||||
|
+
|
||||||
|
+# You should have received a copy of the GNU General Public License
|
||||||
|
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
+
|
||||||
|
+. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
|
||||||
|
+print_ver_ chmod
|
||||||
|
+
|
||||||
|
+mkdir dir || framework_failure_
|
||||||
|
+touch dir/f || framework_failure_
|
||||||
|
+ln -s f dir/l || framework_failure_
|
||||||
|
+
|
||||||
|
+# This operation ignores symlinks but should succeed.
|
||||||
|
+chmod u+w -R dir 2> out || fail=1
|
||||||
|
+
|
||||||
|
+compare /dev/null out || fail=1
|
||||||
|
+
|
||||||
|
+Exit $fail
|
||||||
|
diff --git a/tests/local.mk b/tests/local.mk
|
||||||
|
index 228d0e3688..b5b893fb77 100644
|
||||||
|
--- a/tests/local.mk
|
||||||
|
+++ b/tests/local.mk
|
||||||
|
@@ -456,6 +456,7 @@ all_tests = \
|
||||||
|
tests/chmod/c-option.sh \
|
||||||
|
tests/chmod/equal-x.sh \
|
||||||
|
tests/chmod/equals.sh \
|
||||||
|
+ tests/chmod/ignore-symlink.sh \
|
||||||
|
tests/chmod/inaccessible.sh \
|
||||||
|
tests/chmod/octal.sh \
|
||||||
|
tests/chmod/setgid.sh \
|
||||||
@ -1,126 +0,0 @@
|
|||||||
From 6fc695cb4a26f09dfeef8b1c24895a707055334e Mon Sep 17 00:00:00 2001
|
|
||||||
From: =?UTF-8?q?P=C3=A1draig=20Brady?= <P@draigBrady.com>
|
|
||||||
Date: Wed, 11 Nov 2020 17:22:33 +0000
|
|
||||||
Subject: [PATCH] ls: fix crash printing SELinux context for unstatable files
|
|
||||||
|
|
||||||
This crash was identified by Cyber Independent Testing Lab:
|
|
||||||
https://cyber-itl.org/2020/10/28/citl-7000-defects.html
|
|
||||||
and was introduced with commit v6.9.90-11-g4245876e2
|
|
||||||
|
|
||||||
* src/ls.c (gobble_file): Ensure scontext is initialized
|
|
||||||
in the case where files are not statable.
|
|
||||||
* tests/ls/selinux-segfault.sh: Renamed from proc-selinux-segfault.sh,
|
|
||||||
and added test case for broken symlinks.
|
|
||||||
* tests/local.mk: Adjust for the renamed test.
|
|
||||||
* NEWS: Mention the bug fix.
|
|
||||||
---
|
|
||||||
src/ls.c | 3 +++
|
|
||||||
tests/local.mk | 2 +-
|
|
||||||
tests/ls/proc-selinux-segfault.sh | 27 ---------------------------
|
|
||||||
tests/ls/selinux-segfault.sh | 33 +++++++++++++++++++++++++++++++++
|
|
||||||
4 files changed, 40 insertions(+), 28 deletions(-)
|
|
||||||
delete mode 100755 tests/ls/proc-selinux-segfault.sh
|
|
||||||
create mode 100755 tests/ls/selinux-segfault.sh
|
|
||||||
|
|
||||||
diff --git a/src/ls.c b/src/ls.c
|
|
||||||
index 1f6afbc..1b4834c 100644
|
|
||||||
--- a/src/ls.c
|
|
||||||
+++ b/src/ls.c
|
|
||||||
@@ -3424,6 +3424,9 @@ gobble_file (char const *name, enum filetype type, ino_t inode,
|
|
||||||
provokes an exit status of 1. */
|
|
||||||
file_failure (command_line_arg,
|
|
||||||
_("cannot access %s"), full_name);
|
|
||||||
+
|
|
||||||
+ f->scontext = UNKNOWN_SECURITY_CONTEXT;
|
|
||||||
+
|
|
||||||
if (command_line_arg)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
diff --git a/tests/local.mk b/tests/local.mk
|
|
||||||
index 7992003..e1c4675 100644
|
|
||||||
--- a/tests/local.mk
|
|
||||||
+++ b/tests/local.mk
|
|
||||||
@@ -613,7 +613,7 @@ all_tests = \
|
|
||||||
tests/ls/multihardlink.sh \
|
|
||||||
tests/ls/no-arg.sh \
|
|
||||||
tests/ls/no-cap.sh \
|
|
||||||
- tests/ls/proc-selinux-segfault.sh \
|
|
||||||
+ tests/ls/selinux-segfault.sh \
|
|
||||||
tests/ls/quote-align.sh \
|
|
||||||
tests/ls/readdir-mountpoint-inode.sh \
|
|
||||||
tests/ls/recursive.sh \
|
|
||||||
diff --git a/tests/ls/proc-selinux-segfault.sh b/tests/ls/proc-selinux-segfault.sh
|
|
||||||
deleted file mode 100755
|
|
||||||
index 831a00e..0000000
|
|
||||||
--- a/tests/ls/proc-selinux-segfault.sh
|
|
||||||
+++ /dev/null
|
|
||||||
@@ -1,27 +0,0 @@
|
|
||||||
-#!/bin/sh
|
|
||||||
-# ls -l /proc/sys would segfault when built against libselinux1 2.0.15-2+b1
|
|
||||||
-
|
|
||||||
-# Copyright (C) 2008-2020 Free Software Foundation, Inc.
|
|
||||||
-
|
|
||||||
-# This program is free software: you can redistribute it and/or modify
|
|
||||||
-# it under the terms of the GNU General Public License as published by
|
|
||||||
-# the Free Software Foundation, either version 3 of the License, or
|
|
||||||
-# (at your option) any later version.
|
|
||||||
-
|
|
||||||
-# This program is distributed in the hope that it will be useful,
|
|
||||||
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
-# GNU General Public License for more details.
|
|
||||||
-
|
|
||||||
-# You should have received a copy of the GNU General Public License
|
|
||||||
-# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
-
|
|
||||||
-. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
|
|
||||||
-print_ver_ ls
|
|
||||||
-
|
|
||||||
-f=/proc/sys
|
|
||||||
-test -r $f || f=.
|
|
||||||
-
|
|
||||||
-ls -l $f > out || fail=1
|
|
||||||
-
|
|
||||||
-Exit $fail
|
|
||||||
diff --git a/tests/ls/selinux-segfault.sh b/tests/ls/selinux-segfault.sh
|
|
||||||
new file mode 100755
|
|
||||||
index 0000000..e2b7ef6
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/tests/ls/selinux-segfault.sh
|
|
||||||
@@ -0,0 +1,33 @@
|
|
||||||
+#!/bin/sh
|
|
||||||
+# Ensure we don't segfault in selinux handling
|
|
||||||
+
|
|
||||||
+# Copyright (C) 2008-2020 Free Software Foundation, Inc.
|
|
||||||
+
|
|
||||||
+# This program is free software: you can redistribute it and/or modify
|
|
||||||
+# it under the terms of the GNU General Public License as published by
|
|
||||||
+# the Free Software Foundation, either version 3 of the License, or
|
|
||||||
+# (at your option) any later version.
|
|
||||||
+
|
|
||||||
+# This program is distributed in the hope that it will be useful,
|
|
||||||
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
+# GNU General Public License for more details.
|
|
||||||
+
|
|
||||||
+# You should have received a copy of the GNU General Public License
|
|
||||||
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
+
|
|
||||||
+. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
|
|
||||||
+print_ver_ ls
|
|
||||||
+
|
|
||||||
+# ls -l /proc/sys would segfault when built against libselinux1 2.0.15-2+b1
|
|
||||||
+f=/proc/sys
|
|
||||||
+test -r $f || f=.
|
|
||||||
+ls -l $f > out || fail=1
|
|
||||||
+
|
|
||||||
+# ls <= 8.32 would segfault when printing
|
|
||||||
+# the security context of broken symlink targets
|
|
||||||
+mkdir sedir || framework_failure_
|
|
||||||
+ln -sf missing sedir/broken || framework_failure_
|
|
||||||
+returns_ 1 ls -L -R -Z -m sedir > out || fail=1
|
|
||||||
+
|
|
||||||
+Exit $fail
|
|
||||||
--
|
|
||||||
1.8.3.1
|
|
||||||
|
|
||||||
@ -1,49 +0,0 @@
|
|||||||
From 2bc66c5ea7e507786a45c1b6b15fe74a338240f4 Mon Sep 17 00:00:00 2001
|
|
||||||
From: =?UTF-8?q?P=C3=A1draig=20Brady?= <P@draigBrady.com>
|
|
||||||
Date: Sat, 14 Nov 2020 16:47:05 +0000
|
|
||||||
Subject: [PATCH] tr: fix crash validating -c with some case char classes
|
|
||||||
|
|
||||||
This crash was identified by Cyber Independent Testing Lab:
|
|
||||||
https://cyber-itl.org/2020/10/28/citl-7000-defects.html
|
|
||||||
and was introduced with commit v8.5-163-g3f48829c2
|
|
||||||
|
|
||||||
* src/tr.c (validate_case_classes): Don't apply these
|
|
||||||
extra case alignment checks in the --complement case,
|
|
||||||
which is even more restrictive as to the contents of SET2.
|
|
||||||
* tests/misc/tr-case-class.sh: Add a test case,
|
|
||||||
for a large SET1, which caused the length adjustment
|
|
||||||
in validate_case_classes to underflow and trigger the assert.
|
|
||||||
* NEWS: Mention the bug fix.
|
|
||||||
---
|
|
||||||
src/tr.c | 2 +-
|
|
||||||
tests/misc/tr-case-class.sh | 3 +++
|
|
||||||
2 files changed, 4 insertions(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/src/tr.c b/src/tr.c
|
|
||||||
index 6f76507..94794a2 100644
|
|
||||||
--- a/src/tr.c
|
|
||||||
+++ b/src/tr.c
|
|
||||||
@@ -1176,7 +1176,7 @@ validate_case_classes (struct Spec_list *s1, struct Spec_list *s2)
|
|
||||||
bool s1_new_element = true;
|
|
||||||
bool s2_new_element = true;
|
|
||||||
|
|
||||||
- if (!s2->has_char_class)
|
|
||||||
+ if (complement || !s2->has_char_class)
|
|
||||||
return;
|
|
||||||
|
|
||||||
for (int i = 0; i < N_CHARS; i++)
|
|
||||||
diff --git a/tests/misc/tr-case-class.sh b/tests/misc/tr-case-class.sh
|
|
||||||
index 470197e..9f442c0 100755
|
|
||||||
--- a/tests/misc/tr-case-class.sh
|
|
||||||
+++ b/tests/misc/tr-case-class.sh
|
|
||||||
@@ -110,4 +110,7 @@ the latter string must not end with a character class' > exp
|
|
||||||
compare exp out || fail=1
|
|
||||||
fi
|
|
||||||
|
|
||||||
+# coreutils 8.6 - 8.32 inclusive, would abort trying to validate the following
|
|
||||||
+returns_ 1 tr -c '[:upper:]\000-\370' '[:lower:]' < /dev/null || fail=1
|
|
||||||
+
|
|
||||||
Exit $fail
|
|
||||||
--
|
|
||||||
1.8.3.1
|
|
||||||
|
|
||||||
@ -11,13 +11,14 @@ diff --git a/m4/gnulib-comp.m4 b/m4/gnulib-comp.m4
|
|||||||
index dead90e..0abf0bd 100644
|
index dead90e..0abf0bd 100644
|
||||||
--- a/m4/gnulib-comp.m4
|
--- a/m4/gnulib-comp.m4
|
||||||
+++ b/m4/gnulib-comp.m4
|
+++ b/m4/gnulib-comp.m4
|
||||||
@@ -1860,10 +1860,10 @@ AC_DEFUN([gl_INIT],
|
@@ -1860,11 +1860,11 @@ AC_DEFUN([gl_INIT],
|
||||||
AC_LIBOBJ([select])
|
AC_LIBOBJ([select])
|
||||||
fi
|
fi
|
||||||
gl_SYS_SELECT_MODULE_INDICATOR([select])
|
gl_SYS_SELECT_MODULE_INDICATOR([select])
|
||||||
- AC_CHECK_HEADERS([selinux/flask.h])
|
- AC_CHECK_HEADERS([selinux/flask.h])
|
||||||
gl_HEADERS_SELINUX_SELINUX_H
|
gl_HEADERS_SELINUX_SELINUX_H
|
||||||
gl_HEADERS_SELINUX_CONTEXT_H
|
gl_HEADERS_SELINUX_CONTEXT_H
|
||||||
|
gl_HEADERS_SELINUX_LABEL_H
|
||||||
if test "$with_selinux" != no && test "$ac_cv_header_selinux_selinux_h" = yes; then
|
if test "$with_selinux" != no && test "$ac_cv_header_selinux_selinux_h" = yes; then
|
||||||
+ AC_CHECK_HEADERS([selinux/flask.h])
|
+ AC_CHECK_HEADERS([selinux/flask.h])
|
||||||
AC_LIBOBJ([getfilecon])
|
AC_LIBOBJ([getfilecon])
|
||||||
|
|||||||
@ -1,164 +0,0 @@
|
|||||||
From b9f9ed14bda93ecb407129b69e6476813c250046 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Paul Eggert <eggert@cs.ucla.edu>
|
|
||||||
Date: Wed, 15 Apr 2020 20:50:32 -0700
|
|
||||||
Subject: [PATCH] fts: remove NOSTAT_LEAF_OPTIMIZATION
|
|
||||||
MIME-Version: 1.0
|
|
||||||
Content-Type: text/plain; charset=UTF-8
|
|
||||||
Content-Transfer-Encoding: 8bit
|
|
||||||
|
|
||||||
It caused ‘find’ and ‘du’ to dump core, and it was useful
|
|
||||||
only for obsolescent Linux filesystems anyway. Problem reported in:
|
|
||||||
https://lists.gnu.org/r/bug-gnulib/2020-04/msg00068.html
|
|
||||||
Quite possibly there is still a serious underlying fts bug with
|
|
||||||
tight-loop-check and mutating file systems, but if so this patch
|
|
||||||
should cause the bug to be triggered less often.
|
|
||||||
* lib/fts.c (enum leaf_optimization): Remove
|
|
||||||
NOSTAT_LEAF_OPTIMIZATION, as it’s problematic.
|
|
||||||
(S_MAGIC_REISERFS, S_MAGIC_XFS): Remove; no longer needed.
|
|
||||||
(leaf_optimization): Remove special cases for ReiserFS and XFS.
|
|
||||||
(fts_read): Remove NOSTAT_LEAF_OPTIMIZATION code.
|
|
||||||
* lib/fts_.h (struct _ftsent.fts_n_dirs_remaining):
|
|
||||||
Remove. All uses removed.
|
|
||||||
|
|
||||||
Upstream-commit: 47bf2cf3184027c1eb9c1dfeea5c5b8b2d69710d
|
|
||||||
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
|
||||||
---
|
|
||||||
lib/fts.c | 56 ++++++++-------------------------------------------
|
|
||||||
lib/fts_.h | 5 -----
|
|
||||||
2 files changed, 8 insertions(+), 53 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/lib/fts.c b/lib/fts.c
|
|
||||||
index 1093ce5..dfe3fef 100644
|
|
||||||
--- a/lib/fts.c
|
|
||||||
+++ b/lib/fts.c
|
|
||||||
@@ -445,7 +445,6 @@ fts_open (char * const *argv,
|
|
||||||
if ((parent = fts_alloc(sp, "", 0)) == NULL)
|
|
||||||
goto mem2;
|
|
||||||
parent->fts_level = FTS_ROOTPARENTLEVEL;
|
|
||||||
- parent->fts_n_dirs_remaining = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The classic fts implementation would call fts_stat with
|
|
||||||
@@ -634,9 +633,8 @@ fts_close (FTS *sp)
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Minimum link count of a traditional Unix directory. When leaf
|
|
||||||
- optimization is OK and MIN_DIR_NLINK <= st_nlink, then st_nlink is
|
|
||||||
- an upper bound on the number of subdirectories (counting "." and
|
|
||||||
- ".."). */
|
|
||||||
+ optimization is OK and a directory's st_nlink == MIN_DIR_NLINK,
|
|
||||||
+ then the directory has no subdirectories. */
|
|
||||||
enum { MIN_DIR_NLINK = 2 };
|
|
||||||
|
|
||||||
/* Whether leaf optimization is OK for a directory. */
|
|
||||||
@@ -645,12 +643,8 @@ enum leaf_optimization
|
|
||||||
/* st_nlink is not reliable for this directory's subdirectories. */
|
|
||||||
NO_LEAF_OPTIMIZATION,
|
|
||||||
|
|
||||||
- /* Leaf optimization is OK, but is not useful for avoiding stat calls. */
|
|
||||||
- OK_LEAF_OPTIMIZATION,
|
|
||||||
-
|
|
||||||
- /* Leaf optimization is not only OK: it is useful for avoiding
|
|
||||||
- stat calls, because dirent.d_type does not work. */
|
|
||||||
- NOSTAT_LEAF_OPTIMIZATION
|
|
||||||
+ /* st_nlink == 2 means the directory lacks subdirectories. */
|
|
||||||
+ OK_LEAF_OPTIMIZATION
|
|
||||||
};
|
|
||||||
|
|
||||||
#if (defined __linux__ || defined __ANDROID__) \
|
|
||||||
@@ -663,9 +657,7 @@ enum leaf_optimization
|
|
||||||
# define S_MAGIC_CIFS 0xFF534D42
|
|
||||||
# define S_MAGIC_NFS 0x6969
|
|
||||||
# define S_MAGIC_PROC 0x9FA0
|
|
||||||
-# define S_MAGIC_REISERFS 0x52654973
|
|
||||||
# define S_MAGIC_TMPFS 0x1021994
|
|
||||||
-# define S_MAGIC_XFS 0x58465342
|
|
||||||
|
|
||||||
# ifdef HAVE___FSWORD_T
|
|
||||||
typedef __fsword_t fsword;
|
|
||||||
@@ -786,23 +778,15 @@ dirent_inode_sort_may_be_useful (FTSENT const *p, int dir_fd)
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Given an FTS entry P for a directory with descriptor DIR_FD,
|
|
||||||
- return true if it is both useful and valid to apply leaf optimization.
|
|
||||||
- The optimization is useful only for file systems that lack usable
|
|
||||||
- dirent.d_type info. The optimization is valid if an st_nlink value
|
|
||||||
- of at least MIN_DIR_NLINK is an upper bound on the number of
|
|
||||||
- subdirectories of D, counting "." and ".." as subdirectories.
|
|
||||||
+ return whether it is valid to apply leaf optimization.
|
|
||||||
+ The optimization is valid if a directory's st_nlink value equal
|
|
||||||
+ to MIN_DIR_NLINK means the directory has no subdirectories.
|
|
||||||
DIR_FD is negative if unavailable. */
|
|
||||||
static enum leaf_optimization
|
|
||||||
leaf_optimization (FTSENT const *p, int dir_fd)
|
|
||||||
{
|
|
||||||
switch (filesystem_type (p, dir_fd))
|
|
||||||
{
|
|
||||||
- /* List here the file system types that may lack usable dirent.d_type
|
|
||||||
- info, yet for which the optimization does apply. */
|
|
||||||
- case S_MAGIC_REISERFS:
|
|
||||||
- case S_MAGIC_XFS: /* XFS lacked it until 2013-08-22 commit. */
|
|
||||||
- return NOSTAT_LEAF_OPTIMIZATION;
|
|
||||||
-
|
|
||||||
case 0:
|
|
||||||
/* Leaf optimization is unsafe if the file system type is unknown. */
|
|
||||||
FALLTHROUGH;
|
|
||||||
@@ -1027,26 +1011,7 @@ check_for_dir:
|
|
||||||
if (p->fts_info == FTS_NSOK)
|
|
||||||
{
|
|
||||||
if (p->fts_statp->st_size == FTS_STAT_REQUIRED)
|
|
||||||
- {
|
|
||||||
- FTSENT *parent = p->fts_parent;
|
|
||||||
- if (parent->fts_n_dirs_remaining == 0
|
|
||||||
- && ISSET(FTS_NOSTAT)
|
|
||||||
- && ISSET(FTS_PHYSICAL)
|
|
||||||
- && (leaf_optimization (parent, sp->fts_cwd_fd)
|
|
||||||
- == NOSTAT_LEAF_OPTIMIZATION))
|
|
||||||
- {
|
|
||||||
- /* nothing more needed */
|
|
||||||
- }
|
|
||||||
- else
|
|
||||||
- {
|
|
||||||
- p->fts_info = fts_stat(sp, p, false);
|
|
||||||
- if (S_ISDIR(p->fts_statp->st_mode)
|
|
||||||
- && p->fts_level != FTS_ROOTLEVEL
|
|
||||||
- && 0 < parent->fts_n_dirs_remaining
|
|
||||||
- && parent->fts_n_dirs_remaining != (nlink_t) -1)
|
|
||||||
- parent->fts_n_dirs_remaining--;
|
|
||||||
- }
|
|
||||||
- }
|
|
||||||
+ p->fts_info = fts_stat(sp, p, false);
|
|
||||||
else
|
|
||||||
fts_assert (p->fts_statp->st_size == FTS_NO_STAT_REQUIRED);
|
|
||||||
}
|
|
||||||
@@ -1830,11 +1795,6 @@ err: memset(sbp, 0, sizeof(struct stat));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (S_ISDIR(sbp->st_mode)) {
|
|
||||||
- p->fts_n_dirs_remaining
|
|
||||||
- = ((sbp->st_nlink < MIN_DIR_NLINK
|
|
||||||
- || p->fts_level <= FTS_ROOTLEVEL)
|
|
||||||
- ? -1
|
|
||||||
- : sbp->st_nlink - (ISSET (FTS_SEEDOT) ? 0 : MIN_DIR_NLINK));
|
|
||||||
if (ISDOT(p->fts_name)) {
|
|
||||||
/* Command-line "." and ".." are real directories. */
|
|
||||||
return (p->fts_level == FTS_ROOTLEVEL ? FTS_D : FTS_DOT);
|
|
||||||
diff --git a/lib/fts_.h b/lib/fts_.h
|
|
||||||
index d40a116..2e76cc4 100644
|
|
||||||
--- a/lib/fts_.h
|
|
||||||
+++ b/lib/fts_.h
|
|
||||||
@@ -227,11 +227,6 @@ typedef struct _ftsent {
|
|
||||||
|
|
||||||
size_t fts_namelen; /* strlen(fts_name) */
|
|
||||||
|
|
||||||
- /* If not (nlink_t) -1, an upper bound on the number of
|
|
||||||
- remaining subdirectories of interest. If this becomes
|
|
||||||
- zero, some work can be avoided. */
|
|
||||||
- nlink_t fts_n_dirs_remaining;
|
|
||||||
-
|
|
||||||
# define FTS_D 1 /* preorder directory */
|
|
||||||
# define FTS_DC 2 /* directory that causes cycles */
|
|
||||||
# define FTS_DEFAULT 3 /* none of the above */
|
|
||||||
--
|
|
||||||
2.21.1
|
|
||||||
|
|
||||||
@ -1,153 +0,0 @@
|
|||||||
From 8c022656320592dbad146f5d3a3ae1875f419446 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Paul Eggert <eggert@cs.ucla.edu>
|
|
||||||
Date: Thu, 5 Mar 2020 17:25:29 -0800
|
|
||||||
Subject: [PATCH 1/2] ls: restore 8.31 behavior on removed directories
|
|
||||||
|
|
||||||
* NEWS: Mention this.
|
|
||||||
* src/ls.c: Do not include <sys/sycall.h>
|
|
||||||
(print_dir): Don't worry about whether the directory is removed.
|
|
||||||
* tests/ls/removed-directory.sh: Adjust to match new (i.e., old)
|
|
||||||
behavior.
|
|
||||||
|
|
||||||
Upstream-commit: 10fcb97bd728f09d4a027eddf8ad2900f0819b0a
|
|
||||||
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
|
||||||
---
|
|
||||||
src/ls.c | 22 ----------------------
|
|
||||||
tests/ls/removed-directory.sh | 10 ++--------
|
|
||||||
2 files changed, 2 insertions(+), 30 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/ls.c b/src/ls.c
|
|
||||||
index 9d25f62..850ecc2 100644
|
|
||||||
--- a/src/ls.c
|
|
||||||
+++ b/src/ls.c
|
|
||||||
@@ -49,10 +49,6 @@
|
|
||||||
# include <sys/ptem.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
-#ifdef __linux__
|
|
||||||
-# include <sys/syscall.h>
|
|
||||||
-#endif
|
|
||||||
-
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <assert.h>
|
|
||||||
#include <setjmp.h>
|
|
||||||
@@ -2896,7 +2892,6 @@ print_dir (char const *name, char const *realname, bool command_line_arg)
|
|
||||||
struct dirent *next;
|
|
||||||
uintmax_t total_blocks = 0;
|
|
||||||
static bool first = true;
|
|
||||||
- bool found_any_entries = false;
|
|
||||||
|
|
||||||
errno = 0;
|
|
||||||
dirp = opendir (name);
|
|
||||||
@@ -2972,7 +2967,6 @@ print_dir (char const *name, char const *realname, bool command_line_arg)
|
|
||||||
next = readdir (dirp);
|
|
||||||
if (next)
|
|
||||||
{
|
|
||||||
- found_any_entries = true;
|
|
||||||
if (! file_ignored (next->d_name))
|
|
||||||
{
|
|
||||||
enum filetype type = unknown;
|
|
||||||
@@ -3018,22 +3012,6 @@ print_dir (char const *name, char const *realname, bool command_line_arg)
|
|
||||||
if (errno != EOVERFLOW)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
-#ifdef __linux__
|
|
||||||
- else if (! found_any_entries)
|
|
||||||
- {
|
|
||||||
- /* If readdir finds no directory entries at all, not even "." or
|
|
||||||
- "..", then double check that the directory exists. */
|
|
||||||
- if (syscall (SYS_getdents, dirfd (dirp), NULL, 0) == -1
|
|
||||||
- && errno != EINVAL)
|
|
||||||
- {
|
|
||||||
- /* We exclude EINVAL as that pertains to buffer handling,
|
|
||||||
- and we've passed NULL as the buffer for simplicity.
|
|
||||||
- ENOENT is returned if appropriate before buffer handling. */
|
|
||||||
- file_failure (command_line_arg, _("reading directory %s"), name);
|
|
||||||
- }
|
|
||||||
- break;
|
|
||||||
- }
|
|
||||||
-#endif
|
|
||||||
else
|
|
||||||
break;
|
|
||||||
|
|
||||||
diff --git a/tests/ls/removed-directory.sh b/tests/ls/removed-directory.sh
|
|
||||||
index e8c835d..fe8f929 100755
|
|
||||||
--- a/tests/ls/removed-directory.sh
|
|
||||||
+++ b/tests/ls/removed-directory.sh
|
|
||||||
@@ -26,20 +26,14 @@ case $host_triplet in
|
|
||||||
*) skip_ 'non linux kernel' ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
-LS_FAILURE=2
|
|
||||||
-
|
|
||||||
-cat <<\EOF >exp-err || framework_failure_
|
|
||||||
-ls: reading directory '.': No such file or directory
|
|
||||||
-EOF
|
|
||||||
-
|
|
||||||
cwd=$(pwd)
|
|
||||||
mkdir d || framework_failure_
|
|
||||||
cd d || framework_failure_
|
|
||||||
rmdir ../d || framework_failure_
|
|
||||||
|
|
||||||
-returns_ $LS_FAILURE ls >../out 2>../err || fail=1
|
|
||||||
+ls >../out 2>../err || fail=1
|
|
||||||
cd "$cwd" || framework_failure_
|
|
||||||
compare /dev/null out || fail=1
|
|
||||||
-compare exp-err err || fail=1
|
|
||||||
+compare /dev/null err || fail=1
|
|
||||||
|
|
||||||
Exit $fail
|
|
||||||
--
|
|
||||||
2.21.1
|
|
||||||
|
|
||||||
|
|
||||||
From 847324a0debd9d12062c79e7a7a9d3d8ce76390d Mon Sep 17 00:00:00 2001
|
|
||||||
From: Paul Eggert <eggert@cs.ucla.edu>
|
|
||||||
Date: Sat, 7 Mar 2020 10:29:51 -0800
|
|
||||||
Subject: [PATCH 2/2] ls: improve removed-directory test
|
|
||||||
|
|
||||||
* tests/ls/removed-directory.sh: Remove host_triplet test.
|
|
||||||
Skip this test if one cannot remove the working directory.
|
|
||||||
From a suggestion by Bernhard Voelker (Bug#39929).
|
|
||||||
|
|
||||||
Upstream-commit: 672819c73f2e94e61386dc0584bddf9da860cc26
|
|
||||||
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
|
||||||
---
|
|
||||||
tests/ls/removed-directory.sh | 13 ++++---------
|
|
||||||
1 file changed, 4 insertions(+), 9 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/tests/ls/removed-directory.sh b/tests/ls/removed-directory.sh
|
|
||||||
index fe8f929..63b209d 100755
|
|
||||||
--- a/tests/ls/removed-directory.sh
|
|
||||||
+++ b/tests/ls/removed-directory.sh
|
|
||||||
@@ -1,7 +1,7 @@
|
|
||||||
#!/bin/sh
|
|
||||||
-# If ls is asked to list a removed directory (e.g. the parent process's
|
|
||||||
-# current working directory that has been removed by another process), it
|
|
||||||
-# emits an error message.
|
|
||||||
+# If ls is asked to list a removed directory (e.g., the parent process's
|
|
||||||
+# current working directory has been removed by another process), it
|
|
||||||
+# should not emit an error message merely because the directory is removed.
|
|
||||||
|
|
||||||
# Copyright (C) 2020 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
@@ -21,15 +21,10 @@
|
|
||||||
. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
|
|
||||||
print_ver_ ls
|
|
||||||
|
|
||||||
-case $host_triplet in
|
|
||||||
- *linux*) ;;
|
|
||||||
- *) skip_ 'non linux kernel' ;;
|
|
||||||
-esac
|
|
||||||
-
|
|
||||||
cwd=$(pwd)
|
|
||||||
mkdir d || framework_failure_
|
|
||||||
cd d || framework_failure_
|
|
||||||
-rmdir ../d || framework_failure_
|
|
||||||
+rmdir ../d || skip_ "can't remove working directory on this platform"
|
|
||||||
|
|
||||||
ls >../out 2>../err || fail=1
|
|
||||||
cd "$cwd" || framework_failure_
|
|
||||||
--
|
|
||||||
2.21.1
|
|
||||||
|
|
||||||
Binary file not shown.
BIN
coreutils-9.0.tar.xz
Normal file
BIN
coreutils-9.0.tar.xz
Normal file
Binary file not shown.
@ -1,174 +0,0 @@
|
|||||||
diff --git a/doc/coreutils.texi b/doc/coreutils.texi
|
|
||||||
index a507280..400e135 100644
|
|
||||||
--- a/doc/coreutils.texi
|
|
||||||
+++ b/doc/coreutils.texi
|
|
||||||
@@ -11303,6 +11303,13 @@ some systems (notably SunOS), doing this yields more up to date results,
|
|
||||||
but in general this option makes @command{df} much slower, especially when
|
|
||||||
there are many or very busy file systems.
|
|
||||||
|
|
||||||
+@item --direct
|
|
||||||
+@opindex --direct
|
|
||||||
+@cindex direct statfs for a file
|
|
||||||
+Do not resolve mount point and show statistics directly for a file. It can be
|
|
||||||
+especially useful for NFS mount points if there is a boundary between two
|
|
||||||
+storage policies behind the mount point.
|
|
||||||
+
|
|
||||||
@item --total
|
|
||||||
@opindex --total
|
|
||||||
@cindex grand total of disk size, usage and available space
|
|
||||||
diff --git a/src/df.c b/src/df.c
|
|
||||||
index 8f760db..a7385fd 100644
|
|
||||||
--- a/src/df.c
|
|
||||||
+++ b/src/df.c
|
|
||||||
@@ -120,6 +120,9 @@ static bool print_type;
|
|
||||||
/* If true, print a grand total at the end. */
|
|
||||||
static bool print_grand_total;
|
|
||||||
|
|
||||||
+/* If true, show statistics for a file instead of mount point. */
|
|
||||||
+static bool direct_statfs;
|
|
||||||
+
|
|
||||||
/* Grand total data. */
|
|
||||||
static struct fs_usage grand_fsu;
|
|
||||||
|
|
||||||
@@ -247,13 +250,15 @@ enum
|
|
||||||
NO_SYNC_OPTION = CHAR_MAX + 1,
|
|
||||||
SYNC_OPTION,
|
|
||||||
TOTAL_OPTION,
|
|
||||||
- OUTPUT_OPTION
|
|
||||||
+ OUTPUT_OPTION,
|
|
||||||
+ DIRECT_OPTION
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct option const long_options[] =
|
|
||||||
{
|
|
||||||
{"all", no_argument, NULL, 'a'},
|
|
||||||
{"block-size", required_argument, NULL, 'B'},
|
|
||||||
+ {"direct", no_argument, NULL, DIRECT_OPTION},
|
|
||||||
{"inodes", no_argument, NULL, 'i'},
|
|
||||||
{"human-readable", no_argument, NULL, 'h'},
|
|
||||||
{"si", no_argument, NULL, 'H'},
|
|
||||||
@@ -509,7 +514,10 @@ get_header (void)
|
|
||||||
for (col = 0; col < ncolumns; col++)
|
|
||||||
{
|
|
||||||
char *cell = NULL;
|
|
||||||
- char const *header = _(columns[col]->caption);
|
|
||||||
+ char const *header = (columns[col]->field == TARGET_FIELD
|
|
||||||
+ && direct_statfs)?
|
|
||||||
+ _("File") :
|
|
||||||
+ _(columns[col]->caption);
|
|
||||||
|
|
||||||
if (columns[col]->field == SIZE_FIELD
|
|
||||||
&& (header_mode == DEFAULT_MODE
|
|
||||||
@@ -1397,6 +1405,19 @@ get_point (const char *point, const struct stat *statp)
|
|
||||||
static void
|
|
||||||
get_entry (char const *name, struct stat const *statp)
|
|
||||||
{
|
|
||||||
+ if (direct_statfs)
|
|
||||||
+ {
|
|
||||||
+ char *resolved = canonicalize_file_name (name);
|
|
||||||
+ if (resolved)
|
|
||||||
+ {
|
|
||||||
+ char *mp = find_mount_point (name, statp);
|
|
||||||
+ get_dev (NULL, mp, resolved, NULL, NULL, false, false, NULL, false);
|
|
||||||
+ free(mp);
|
|
||||||
+ free (resolved);
|
|
||||||
+ return;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
if ((S_ISBLK (statp->st_mode) || S_ISCHR (statp->st_mode))
|
|
||||||
&& get_disk (name))
|
|
||||||
return;
|
|
||||||
@@ -1467,6 +1488,7 @@ or all file systems by default.\n\
|
|
||||||
-B, --block-size=SIZE scale sizes by SIZE before printing them; e.g.,\n\
|
|
||||||
'-BM' prints sizes in units of 1,048,576 bytes;\n\
|
|
||||||
see SIZE format below\n\
|
|
||||||
+ --direct show statistics for a file instead of mount point\n\
|
|
||||||
-h, --human-readable print sizes in powers of 1024 (e.g., 1023M)\n\
|
|
||||||
-H, --si print sizes in powers of 1000 (e.g., 1.1G)\n\
|
|
||||||
"), stdout);
|
|
||||||
@@ -1557,6 +1579,9 @@ main (int argc, char **argv)
|
|
||||||
xstrtol_fatal (e, oi, c, long_options, optarg);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
+ case DIRECT_OPTION:
|
|
||||||
+ direct_statfs = true;
|
|
||||||
+ break;
|
|
||||||
case 'i':
|
|
||||||
if (header_mode == OUTPUT_MODE)
|
|
||||||
{
|
|
||||||
@@ -1653,6 +1678,13 @@ main (int argc, char **argv)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
+ if (direct_statfs && show_local_fs)
|
|
||||||
+ {
|
|
||||||
+ error (0, 0, _("options --direct and --local (-l) are mutually "
|
|
||||||
+ "exclusive"));
|
|
||||||
+ usage (EXIT_FAILURE);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
if (human_output_opts == -1)
|
|
||||||
{
|
|
||||||
if (posix_format)
|
|
||||||
diff --git a/tests/df/direct.sh b/tests/df/direct.sh
|
|
||||||
new file mode 100755
|
|
||||||
index 0000000..8e4cfb8
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/tests/df/direct.sh
|
|
||||||
@@ -0,0 +1,55 @@
|
|
||||||
+#!/bin/sh
|
|
||||||
+# Ensure "df --direct" works as documented
|
|
||||||
+
|
|
||||||
+# Copyright (C) 2010 Free Software Foundation, Inc.
|
|
||||||
+
|
|
||||||
+# This program is free software: you can redistribute it and/or modify
|
|
||||||
+# it under the terms of the GNU General Public License as published by
|
|
||||||
+# the Free Software Foundation, either version 3 of the License, or
|
|
||||||
+# (at your option) any later version.
|
|
||||||
+
|
|
||||||
+# This program is distributed in the hope that it will be useful,
|
|
||||||
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
+# GNU General Public License for more details.
|
|
||||||
+
|
|
||||||
+# You should have received a copy of the GNU General Public License
|
|
||||||
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
+
|
|
||||||
+. "${srcdir=.}/init.sh"; path_prepend_ ../src
|
|
||||||
+print_ver_ df
|
|
||||||
+
|
|
||||||
+df || skip_ "df fails"
|
|
||||||
+
|
|
||||||
+DIR=`pwd` || framework_failure
|
|
||||||
+FILE="$DIR/file"
|
|
||||||
+touch "$FILE" || framework_failure
|
|
||||||
+echo "$FILE" > file_exp || framework_failure
|
|
||||||
+echo "Mounted on" > header_mounted_exp || framework_failure
|
|
||||||
+echo "File" > header_file_exp || framework_failure
|
|
||||||
+
|
|
||||||
+fail=0
|
|
||||||
+
|
|
||||||
+df --portability "$FILE" > df_out || fail=1
|
|
||||||
+df --portability --direct "$FILE" > df_direct_out || fail=1
|
|
||||||
+df --portability --direct --local "$FILE" > /dev/null 2>&1 && fail=1
|
|
||||||
+
|
|
||||||
+# check df header
|
|
||||||
+$AWK '{ if (NR==1) print $6 " " $7; }' df_out > header_mounted_out \
|
|
||||||
+ || framework_failure
|
|
||||||
+$AWK '{ if (NR==1) print $6; }' df_direct_out > header_file_out \
|
|
||||||
+ || framework_failure
|
|
||||||
+compare header_mounted_out header_mounted_exp || fail=1
|
|
||||||
+compare header_file_out header_file_exp || fail=1
|
|
||||||
+
|
|
||||||
+# check df output (without --direct)
|
|
||||||
+$AWK '{ if (NR==2) print $6; }' df_out > file_out \
|
|
||||||
+ || framework_failure
|
|
||||||
+compare file_out file_exp && fail=1
|
|
||||||
+
|
|
||||||
+# check df output (with --direct)
|
|
||||||
+$AWK '{ if (NR==2) print $6; }' df_direct_out > file_out \
|
|
||||||
+ || framework_failure
|
|
||||||
+compare file_out file_exp || fail=1
|
|
||||||
+
|
|
||||||
+Exit $fail
|
|
||||||
@ -1,6 +1,6 @@
|
|||||||
Name: coreutils
|
Name: coreutils
|
||||||
Version: 8.32
|
Version: 9.0
|
||||||
Release: 7
|
Release: 1
|
||||||
License: GPLv3+
|
License: GPLv3+
|
||||||
Summary: A set of basic GNU tools commonly used in shell scripts
|
Summary: A set of basic GNU tools commonly used in shell scripts
|
||||||
Url: https://www.gnu.org/software/coreutils/
|
Url: https://www.gnu.org/software/coreutils/
|
||||||
@ -10,23 +10,16 @@ Source0: https://ftp.gnu.org/gnu/%{name}/%{name}-%{version}.tar.xz
|
|||||||
%global __requires_exclude ^%{_bindir}/coreutils$
|
%global __requires_exclude ^%{_bindir}/coreutils$
|
||||||
%global user `ls -ld $USR_SCONF|awk '{print $3}'`
|
%global user `ls -ld $USR_SCONF|awk '{print $3}'`
|
||||||
|
|
||||||
Patch0: 0001-coreutils-8.31-i18n.patch
|
Patch0: 0001-disable-test-of-rwlock.patch
|
||||||
Patch1: 0001-disable-test-of-rwlock.patch
|
|
||||||
# uname -p/-i to display processor type
|
# uname -p/-i to display processor type
|
||||||
Patch2: coreutils-8.2-uname-processortype.patch
|
Patch1: coreutils-8.2-uname-processortype.patch
|
||||||
# df --direct
|
|
||||||
Patch3: coreutils-df-direct.patch
|
|
||||||
|
|
||||||
Patch4: coreutils-getgrouplist.patch
|
Patch2: coreutils-getgrouplist.patch
|
||||||
Patch5: bugfix-remove-usr-local-lib-from-m4.patch
|
Patch3: bugfix-remove-usr-local-lib-from-m4.patch
|
||||||
Patch6: bugfix-dummy_help2man.patch
|
Patch4: bugfix-dummy_help2man.patch
|
||||||
Patch7: bugfix-selinux-flask.patch
|
Patch5: bugfix-selinux-flask.patch
|
||||||
Patch8: skip-the-tests-that-require-selinux-if-selinux-is-di.patch
|
Patch6: skip-the-tests-that-require-selinux-if-selinux-is-di.patch
|
||||||
|
Patch7: backport-chmod-fix-exit-status-when-ignoring-symlinks.patch
|
||||||
Patch9: coreutils-8.32-ls-removed-dir.patch
|
|
||||||
Patch10: coreutils-8.32-leaf-opt-xfs.patch
|
|
||||||
Patch11: backport-ls-fix-crash-printing-SELinux-context-for-unstatable.patch
|
|
||||||
Patch12: backport-tr-fix-crash-validating-c-with-some-case-char-classe.patch
|
|
||||||
|
|
||||||
Conflicts: filesystem < 3
|
Conflicts: filesystem < 3
|
||||||
# To avoid clobbering installs
|
# To avoid clobbering installs
|
||||||
@ -141,6 +134,9 @@ fi
|
|||||||
%{_mandir}/man*/*
|
%{_mandir}/man*/*
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Tue Jan 18 2022 wangchen <wangchen137@huawei.com> - 9.0-1
|
||||||
|
- Update to 9.0
|
||||||
|
|
||||||
* Tue Jul 20 2021 wangchen <wangchen137@huawei.com> - 8.32-7
|
* Tue Jul 20 2021 wangchen <wangchen137@huawei.com> - 8.32-7
|
||||||
- Delete unnecessary gdb from BuildRequires
|
- Delete unnecessary gdb from BuildRequires
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user