Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S938990AbdD2UBF (ORCPT ); Sat, 29 Apr 2017 16:01:05 -0400 Received: from nm24-vm5.bullet.mail.ne1.yahoo.com ([98.138.91.246]:45882 "EHLO nm24-vm5.bullet.mail.ne1.yahoo.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1163068AbdD2UA6 (ORCPT ); Sat, 29 Apr 2017 16:00:58 -0400 X-Yahoo-Newman-Id: 36682.46556.bm@smtp203.mail.ne1.yahoo.com X-Yahoo-Newman-Property: ymail-3 X-YMail-OSG: dPZhAkUVM1ktu.kVj_P9yW31YF4uOqzK.JCsWE1I8ltzySK iS6uZDm4xWMSSFRfGgZxwoVWbb6DvLgQvz0ghwyHwexB2ki.3ajR5nIVyzz4 rgDwqBL5rVaIm.cWK.28nMx1XXEfj4eS4L69HHZMB75aZFONCckifXb2XEJw skU0S95Z2T5.hMscjV8g49ApDrod427QjJ1l7LyzqEa.dvdTCOsPNewyZK9H 649KCgoj65F38OFkf8e6ao0.7Xk8au_U62H1j7EaxOO7eKWLxOpnF.YYcu11 DH5t1LXwLK7xYtiEPB8eEy_Y8GvcwMFDRLy8D4s8VYtghmLojKVhWFHjpc7h odHyh9eecEezBIkE72SIW4Z7VsgSqN0wItzQwzLADHljs_7S.k8k.AXnwFIV 55__3sh7wDgd2SdRShNiMRdT_i15DSGyENXleNCD3GYu5IYi7RqkeDptSAl. 8YVqDhO0B6jvM0IDfSGcsMiSohIfRJ8Z1zOBrKQXKxTf_oqadNBkF.nLadGE .rZwAfCmPwzyok6E84UcDwKkhwrlTKmy_fAFlM17qfjZJRig- X-Yahoo-SMTP: OIJXglSswBDfgLtXluJ6wiAYv6_cnw-- Subject: Re: [PATCH v1] LSM: Enable multiple calls to security_add_hooks() for the same LSM To: =?UTF-8?Q?Micka=c3=abl_Sala=c3=bcn?= , linux-kernel@vger.kernel.org References: <20170429190257.27137-1-mic@digikod.net> Cc: James Morris , Kees Cook , "Serge E . Hallyn" , linux-security-module@vger.kernel.org From: Casey Schaufler Message-ID: Date: Sat, 29 Apr 2017 13:00:55 -0700 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.8.0 MIME-Version: 1.0 In-Reply-To: <20170429190257.27137-1-mic@digikod.net> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2586 Lines: 84 On 4/29/2017 12:02 PM, Mickaël Salaün wrote: > Check if the registering LSM already registered hooks just before. This > enable to split hook declarations into multiple files without > registering multiple time the same LSM name, starting from commit > d69dece5f5b6 ("LSM: Add /sys/kernel/security/lsm"). What's special about the previous registration? Keep it simple and check it the name is already anywhere on the list and only add it if it's not already there. I don't see advantage to: % cat /sys/kernel/security/lsm capability,yama,spiffy,selinux,spiffy over % cat /sys/kernel/security/lsm capability,yama,spiffy,selinux > > Signed-off-by: Mickaël Salaün > Cc: Casey Schaufler > Cc: James Morris > Cc: Kees Cook > Cc: Serge E. Hallyn > Link: https://lkml.kernel.org/r/ccad825b-7a58-e499-e51b-bd7c98581afe@schaufler-ca.com > --- > security/security.c | 30 ++++++++++++++++++++++++++++++ > 1 file changed, 30 insertions(+) > > diff --git a/security/security.c b/security/security.c > index 549bddcc2116..6be65050b268 100644 > --- a/security/security.c > +++ b/security/security.c > @@ -25,6 +25,7 @@ > #include > #include > #include > +#include > #include > > #define MAX_LSM_EVM_XATTR 2 > @@ -86,6 +87,32 @@ static int __init choose_lsm(char *str) > } > __setup("security=", choose_lsm); > > +static bool match_last_lsm(const char *list, const char *last) > +{ > + size_t list_len, last_len, i; > + > + if (!list || !last) > + return false; > + list_len = strlen(list); > + last_len = strlen(last); > + if (!last_len || !list_len) > + return false; > + if (last_len > list_len) > + return false; > + > + for (i = 0; i < last_len; i++) { > + if (list[list_len - 1 - i] != last[last_len - 1 - i]) > + return false; > + } > + /* Check if last_len == list_len */ > + if (i == list_len) > + return true; > + /* Check if it is a full name */ > + if (list[list_len - 1 - i] == ',') > + return true; > + return false; > +} > + > static int lsm_append(char *new, char **result) > { > char *cp; > @@ -93,6 +120,9 @@ static int lsm_append(char *new, char **result) > if (*result == NULL) { > *result = kstrdup(new, GFP_KERNEL); > } else { > + /* Check if it is the last registered name */ > + if (match_last_lsm(*result, new)) > + return 0; > cp = kasprintf(GFP_KERNEL, "%s,%s", *result, new); > if (cp == NULL) > return -ENOMEM;