From b13e7f2fa6a24ae7ad03fc4a6376b2fc2b3c819d Mon Sep 17 00:00:00 2001 From: Ondrej Oprala Date: Mon, 17 Dec 2012 16:35:29 +0100 Subject: [PATCH] cp: cache security context *NEWS: Mention the change. *src/copy.c (copy_internal): Add a condition to only call setfscreatecon if the security context has changed. --- NEWS | 4 ++++ src/copy.c | 10 +++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 5eb8ef3..51e136e 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,10 @@ GNU coreutils NEWS -*- outline -*- * Noteworthy changes in release ?.? (????-??-??) [?] +** Improved performance + + cp is now optimized to cache the SELinux context when copying multiple files, + resulting in an approximately 27% instruction count decrease. ** New features diff --git a/src/copy.c b/src/copy.c index 60322b7..8460076 100644 --- a/src/copy.c +++ b/src/copy.c @@ -2201,11 +2201,19 @@ copy_internal (char const *src_name, char const *dst_name, { bool all_errors = !x->data_copy_required || x->require_preserve_context; bool some_errors = !all_errors && !x->reduce_diagnostics; + bool context_change = 0; security_context_t con; + static security_context_t old_con; if (0 <= lgetfilecon (src_name, &con)) { - if (setfscreatecon (con) < 0) + context_change = !old_con || !STREQ (con, old_con); + if (context_change) + { + free (old_con); + old_con = xstrdup (con); + } + if (context_change && setfscreatecon (con) < 0) { if (all_errors || (some_errors && !errno_unsupported (errno))) error (0, errno, -- 1.7.11.7