From patchwork Sat Apr 29 19:02:57 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Micka=C3=ABl_Sala=C3=BCn?= X-Patchwork-Id: 9705877 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id C4A5060245 for ; Sat, 29 Apr 2017 19:03:38 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id B24A226E46 for ; Sat, 29 Apr 2017 19:03:38 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id A6FC828334; Sat, 29 Apr 2017 19:03:38 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=unavailable version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id E9E8826E46 for ; Sat, 29 Apr 2017 19:03:36 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S376865AbdD2TDZ (ORCPT ); Sat, 29 Apr 2017 15:03:25 -0400 Received: from smtp-sh2.infomaniak.ch ([128.65.195.6]:34010 "EHLO smtp-sh2.infomaniak.ch" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S376863AbdD2TDY (ORCPT ); Sat, 29 Apr 2017 15:03:24 -0400 Received: from smtp5.infomaniak.ch (smtp5.infomaniak.ch [83.166.132.18]) by smtp-sh.infomaniak.ch (8.14.5/8.14.5) with ESMTP id v3TJ36NJ026617 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Sat, 29 Apr 2017 21:03:06 +0200 Received: from localhost (ns3096276.ip-94-23-54.eu [94.23.54.103]) (authenticated bits=0) by smtp5.infomaniak.ch (8.14.5/8.14.5) with ESMTP id v3TJ35oQ026030; Sat, 29 Apr 2017 21:03:05 +0200 From: =?UTF-8?q?Micka=C3=ABl=20Sala=C3=BCn?= To: linux-kernel@vger.kernel.org Cc: =?UTF-8?q?Micka=C3=ABl=20Sala=C3=BCn?= , Casey Schaufler , James Morris , Kees Cook , "Serge E . Hallyn" , linux-security-module@vger.kernel.org Subject: [PATCH v1] LSM: Enable multiple calls to security_add_hooks() for the same LSM Date: Sat, 29 Apr 2017 21:02:57 +0200 Message-Id: <20170429190257.27137-1-mic@digikod.net> X-Mailer: git-send-email 2.11.0 MIME-Version: 1.0 X-Antivirus: Dr.Web (R) for Unix mail servers drweb plugin ver.6.0.2.8 X-Antivirus-Code: 0x100000 Sender: owner-linux-security-module@vger.kernel.org Precedence: bulk List-ID: X-Virus-Scanned: ClamAV using ClamSMTP 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"). 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;