From patchwork Wed Apr 26 15:02:15 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sebastien Buisson X-Patchwork-Id: 9701553 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 79B826032C for ; Wed, 26 Apr 2017 15:27:01 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 648B62843B for ; Wed, 26 Apr 2017 15:27:01 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 57C6C2847F; Wed, 26 Apr 2017 15:27:01 +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=-1.3 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED,FREEMAIL_FROM,RCVD_IN_DNSWL_NONE,RCVD_IN_SORBS_SPAM, T_DKIM_INVALID autolearn=no version=3.3.1 Received: from emsm-gh1-uea10.nsa.gov (smtp.nsa.gov [8.44.101.8]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 7889A2843B for ; Wed, 26 Apr 2017 15:27:00 +0000 (UTC) X-IronPort-AV: E=Sophos;i="5.37,255,1488844800"; d="scan'208";a="6363480" IronPort-PHdr: =?us-ascii?q?9a23=3Ab9f08xIGRiQkhLSLb9mcpTZWNBhigK39O0sv0rFi?= =?us-ascii?q?tYgQKPrzrarrMEGX3/hxlliBBdydsKMazbaK+PC7EUU7or+5+EgYd5JNUxJXwe?= =?us-ascii?q?43pCcHRPC/NEvgMfTxZDY7FskRHHVs/nW8LFQHUJ2mPw6arXK99yMdFQviPgRp?= =?us-ascii?q?OOv1BpTSj8Oq3Oyu5pHfeQtFiT68bL9oIxi7ogrdu8oYjIB/Nqs/1xzFr2dSde?= =?us-ascii?q?9L321oP1WTnxj95se04pFu9jlbtuwi+cBdT6j0Zrw0QrNEAjsoNWA1/9DrugLY?= =?us-ascii?q?TQST/HscU34ZnQRODgPY8Rz1RJbxsi/9tupgxCmXOND9QL4oVTi+6apgVRHniD?= =?us-ascii?q?0DNzUk7m/ZjMJ+h79frB64uhBz34vYbYeIP/R8Y6zdZ8sXS2pfUMhMWSJPAYSy?= =?us-ascii?q?YIkBD+oZP+tUsofwqEUVrRalGQWgGPnixiNSi3PqwaE31fkqHwHc3AwnGtIDqG?= =?us-ascii?q?nao8vuO6gISuC10KjIwivFb/hLxDr99YnIcgs6ofGLW7J7bM3cyVI0GAPYj1WQ?= =?us-ascii?q?spflPzST1ugXrmeU8uxgWPmgi24isQ5xozyvyt0whYnOg4IY01bJ/jh6zoYtPd?= =?us-ascii?q?C0VUF2bNG+HJZQqi2WLZV6T8w8T21ypSo20rMLtJqhcCQX1Zgr2wTTZ+Kbf4SU?= =?us-ascii?q?+B7vSemcLDFlj3x/Yr2/nQy98U24x+35Ucm7zUhFozJektnJqnANzxvT6tWbSv?= =?us-ascii?q?dl/keuxzKP1wfL5+FYO080j6vbK4M6wrIqipoSsVjMHi/xmEnsiq+Zal4k9fSy?= =?us-ascii?q?5+TiY7XmooeQN45yig7gLqQjgtGzDOs3PwQUX2WX5P6w2KPs8EHnWrlGk+U6kq?= =?us-ascii?q?zDv5DbIcQbqLS5AwhQ0os78BawETOm0NUenXkaI1NJYQmIj4/0O1HIPP/3E+y/?= =?us-ascii?q?jk+wkDZr2//GPrrhDo/LLnjYirjtZ7l960lCyAYr19BQ+4pUCq0dIPL0QkLxtt?= =?us-ascii?q?vYDhkjPAyow+boEtN925gcWWKIBK+ZNbndsUSU5u0xOemMf5UZuDHnK/gq//Tu?= =?us-ascii?q?l2M2mUcBfam12psacHK4HvZ8LEqFYnrsmdABEWELvgogV+HqhlmCUSNcZnmpQq?= =?us-ascii?q?I84C07CJ+8AYfEXICtj6SL3D2nEZ1OemBGFleMHG/mdoWFX/cMbTydItV6nzwK?= =?us-ascii?q?S7euVogh1Qu0uw/i0bpnKejU9TMEupL/ztR14PfTlR4q/zxuE8udy32NT31znm?= =?us-ascii?q?4QWjA5wKV/oUt7ylefzKR1mOJYGsJJ5/NIUwY6Mpjcw/Z8C9/sRgLLZs2JR0q+?= =?us-ascii?q?QtW6HTExSco8zMISY0lnAdWvlQzM3y2vA7AJjbOLH4A0/rja33fvO8Z302zG27?= =?us-ascii?q?U5j1k6XstPMnWrh65+9gjUAY7EiECZl6KzeaQd2i7B7mGDwnCUvEFbUQ5wT7vK?= =?us-ascii?q?UWoZZkTIsdTz/lnCQKO2CbQ7LgtBztaPJbBRZdHuiVVGRezjOMjFY26rgGe/Gw?= =?us-ascii?q?qHyqmXbIX0f2Ud3SPdCFULkg0I4XmHNRI+Bjq6o27EAj1hD07vY1jr8el4sn+7?= =?us-ascii?q?SVU0zw6SZU17y7W14gIVheCbS/4L0LIEoj0uqzNoE1a8xNLbEN+ApxJgfKlFet?= =?us-ascii?q?M87kxH2XjetwxnMZyqN7piiUIGcwRro0Pu0A16CoZansgpq3Mq0RF/KaGC31NC?= =?us-ascii?q?cDOYwIr8OrrNKmn95BqvcbLZ2knC0NaK/acC8O43pEj5vAGoCEUi6W5q3MNJ3H?= =?us-ascii?q?uZ/JnKCxASUZ3pWEYt6xd6v63aYjU6547Mzn1sP7O0sjjZ29I1H+Yl0RCgf9BR?= =?us-ascii?q?MaOBDgDyFdcWB86wJ+w2g1KpdA4LPPhO9K4oOMOrb/WH17SvPOZ8gj2ml39H7Z?= =?us-ascii?q?tj0k2S7SpzUfPI35Mfz/GfxAuHWC/2jE29vcDvhYBEeTYSE3KjySf5GYFRZ7d9?= =?us-ascii?q?fYIQBGiyJM23w8lxiIT2W35E7lKjAU0J2NOxcxqIc1P9xRFQ1VgQoXG/nyu4zj?= =?us-ascii?q?h0kzU3oaqExyHB2frtdAAAOmJRQ2lil1jsK5Cuj98GREiocxQplBy96EbkxqhU?= =?us-ascii?q?uLh/L27JQUtSYyf2L2ZiUq2/treZZ85P6ZUovj9NUOS7e1yaTaT9oxQC2SP5A2?= =?us-ascii?q?Re3Cw7dy2tupjhmxx6iXmdLGpqoHrCZ85wwRbf5NrBRf9exTcGXzF4iTjRBli9?= =?us-ascii?q?I9ap5s+Yl5HdveCiT2ihTIFccTH3zYOcsyu2/XdqARq7n/C3hNLnCxQ10Sj11t?= =?us-ascii?q?RxTiXIsQrzYpLx26S9K+JncVFiBEXg5MpiBoF+jowwiYkI2XcAm5WV+WALnn3p?= =?us-ascii?q?PdpA3qL+aGYNRTkNw9PO5QjpxEtjLnWVyI7jUHWS3NdhbcGgYmwKwiI989xKCK?= =?us-ascii?q?CM4bxHgyR1pEG4oBnSYfdjmDcd0v0u52AGg+0Tvwot1CqdCKgIHUZEJSzsiwiI?= =?us-ascii?q?79emoaVJYmagbKO91FR4nd+8DLGOuAdcV2jlep06By9/8t1/ME7Q0H308ozkYM?= =?us-ascii?q?Pfbc8XthCPjxjAjvRVKZIomvoEnyVnP3jxvXo/y+40lRZux421vJCbK2Vx+6K0?= =?us-ascii?q?GgZYOSfoZ8MX5D7tlbxRnsCK34+xBJVsASgLXID2QvKyCzIer+/nNwGTED0mtn?= =?us-ascii?q?iUB7TfHQiF6EdpsX3DCZarOG+LJHMB19VtWAGdJFBDgAATRDg6kIQ2Fga2xMzm?= =?us-ascii?q?dUd0/T4R6UDlpRtL0OJnLQH/Un3YpAeqdDg7VISfIABR7gFY6EffKdae4f5rHy?= =?us-ascii?q?FE4p2hqxSAKmmBaARMCWEGRFCEB0z5Mba0/tTA9faXBvalL/TSe7qOsfJRW+2O?= =?us-ascii?q?xZ2xzots5yyMOdmXPnl+E/073VJOXWpjF8XXgTkPTjYYlybKb8+bvxqz4DF4rs?= =?us-ascii?q?Wl/PTsQgLv6pOFC6FOPtV35xC2naCDOvaehCZjNzlXy4gMymXOyLgD214SkDpj?= =?us-ascii?q?eCOxHrQFryLNS7jQmqBPBR4BdyxzLNdI77473gRVP87bkMn61qZgjvMuBVdFVE?= =?us-ascii?q?bhmtq1ZcwEImG9MknIBECXO7SHPzLLx9v7YaSmSb1flO9UrQG/uS6HE0//OTSO?= =?us-ascii?q?jyHpWA60Pu5SiiGbPQBeuIamfxZsF2fsUszpZge8MN9tgj082ac0iW/SNW4ALT?= =?us-ascii?q?h8dFtAoaCL7SxGmPp/FHZB4WB7LeSfgCaW9erYKosMsfRxGCh0k/9a4HIgxLtP?= =?us-ascii?q?9S1EWPt1mCjSr95puV2mlPeAyiZ/WhpUtjlLnJ6LvVllOajB7ZlPQ2jE8wgC7W?= =?us-ascii?q?qOEBQHvMBlBcfxu69KxdjAirnzJC1E893K4csWH9LUJ96fMHo9LRrpHybZAxAE?= =?us-ascii?q?TT6kMmHfgVdQn+yM+XKOr5g1sJ7slIAJSr9BW1w/DukaBVh9HNwePJd3WSspnq?= =?us-ascii?q?SUjMES+3qxsgLcRMJCvp/ZUPKSBO/gKDedjbZfYBsJzqn0LYMJNo30w0ZicEV1?= =?us-ascii?q?nJzWG0rMWtBAujFhbggxoElX6nh+SWwy1Fzjagy2+n8TEuC7nh0thwRiZuQt8S?= =?us-ascii?q?vj7E0sJlrWvicwllc+mcn9izCLbDHxNLuwXZ1RCyfstEgwMpf7TBhuYA23mkxk?= =?us-ascii?q?OjnESKxNj7t8dWBrjwrctoVVFf5aU6JEfAcaxeuLaPUwzVRctiKnyFdB5eTbE5?= =?us-ascii?q?RikBAncZ2rr3JbxwJsdtg1JbfTJKpI1FRQgLyBvjOw3OAr3AAeP1oN8H+VeCMQ?= =?us-ascii?q?okwHKKImKDSy8ex29QOCmyBOd3MNV/owv/1q8U09O/yazy3+079PMEaxOPKDL6?= =?us-ascii?q?mBoWjPidaIQk8s1kMPj0RK4L920cElc0WJSU8vyLqRGg8TOsXcMwFVaNBe9H/J?= =?us-ascii?q?fSaBqe/N2456P52hFuD0Su+DrLsbjVi6HAYoAosM9d8MEYO20EHCKsfmIqUFxg?= =?us-ascii?q?sx6wT2PlWFDehJeRKRnDcBvc6/0Id93ZNBKTEFHWV9LSK3667Tpg8tmvqMQtE2?= =?us-ascii?q?Y3YdXoYfOXI2XtC6lzRev3RaAzm9yvgZxxSa7z/guiTQCyHxb8F9a/eQZBNsDs?= =?us-ascii?q?y2+Dok/qeqjl7X94nRKHvhNdR+oNPP7/0Vp4qfAfNOUbZ9q1vcm5VfR3GyUG7P?= =?us-ascii?q?C960KIL2a4kwbdz5EXm6Uluniz0pVcvxOsiiLrSQiwHyWYlUqJWb3CwkNcKlCj?= =?us-ascii?q?EeGhJwp+Yf5KJ8ZQwOeIc0YR/otgskLKOzOgGY3cuyQ2y1MztZU+FfzfmmZ7xQ?= =?us-ascii?q?1ycjdOu6yHo8QZ4k1+a39E4MRJcNjhHY3/mufJJRUSnpFXxbYgnPqzc5m3JnNu?= =?us-ascii?q?ks3uc12AnIvkUEMzCXaOxpb3RJsMoiClOUOnh5EHc3R0GCgorZ+Q6jxaoS/itH?= =?us-ascii?q?k9ZTy+1Fv2D0voXDbzK0RKyrtZLVvjIvbdg7oq1xNYjjLdWDtJ7FgzPQUoLfsg?= =?us-ascii?q?yfXy68DfZancJQIC1ASvlShW4lIdAGuZZG6UcpTMc+Ib1PB7UsprCtbTpkFjYc?= =?us-ascii?q?wzYEWY2awDEMhfyx1KfdlheVbJstKgcEsIlYjtsbTSF2fjsUpLW/WIXOi2+EVm?= =?us-ascii?q?8LLR8J7QtR+Q0NjYBwfuXq4YbSSp9D1SJWqepuUiTXDplo60f7SmaOjFjiUvqh?= =?us-ascii?q?ieup0hlJwfLwyNkUQgB/BlZZx+ZXkEsoJ7V3K6gfvo7Krj+Ie1n1vHjoyOe8Il?= =?us-ascii?q?le19HUfUXiDIXZrWr8TjEc+XoMSI5B0n3QCZQSkwt8aKYqvlpMI5urekfg6DM6?= =?us-ascii?q?2YtlBb64Vdqkx1w9t3YJWz+qE8ZdC+FhqF/YQidlY42tqJn/OJVfWW5Q+Jycq1?= =?us-ascii?q?dFi0phKSi5xoRAK8tV+D4DQCBPoSmBvNu1UMBD2Ml2D4MSLdd7pXj9Hb1LOISL?= =?us-ascii?q?o3w2obHvzWfZ9C46sFe/3jqzGqu4QPle/2wRAAkpIH6eqkY3Bes27mjS6kzNsk?= =?us-ascii?q?xz/+pDCbiPl19+oDBhHp1VBzZJ0n6kL1JvTHlGrepaKaLVc9BCTPkofxOvPQIx?= =?us-ascii?q?FeI+1UyT4U50hWv5YzB1tgZC5yDdWAw0WDIJgrvxnD0RsdurOTkERJJUdT8hdT?= =?us-ascii?q?vKKxqHmSBLuxZSc0FqVIoDAtlf/7EUwJBZ8dfcRka0MSEKQhhiORwi0fZFkk5D?= =?us-ascii?q?qkqYczjHDQW0bfbPrgF3fcCJoc6rK/T24hxKhZ75v+Aj6aoDXWGmlhOwTtzEqY?= =?us-ascii?q?/zqMGKvFOUdKjkK+28fWPBTD/UgB+ri7crE4XG8irOPAdVMJR11X0kYZ39BmHR?= =?us-ascii?q?JhRGO7gXJ0xFWqBmcd9GuPxVZ9d4eKYV/q9gHgiHSQ3yF4yvtvZGMk3eRTDZLy?= =?us-ascii?q?Wf7OOzv57c7bvARuf+fMCMwWjIQ75vNJdg9Tb7A6vq0ZNZ+kfuwvdt7V96RkLb?= =?us-ascii?q?PCCdt9nhPQQL5NS4dkT+oJIpGy/WAI1qn3rp3E1AcNAXQyKy+pQC1JxZ8GrwSf?= =?us-ascii?q?5/0kXrrO1S7adr5pcq7L1y1Me0IbvSKe5Avk95AxiUAQFq+YsxAGRlQGBReOAR?= =?us-ascii?q?Iu/LfasFlcDut/z3F6sP5R2X4eNZc9zHJ1rFmsalFDGRUhlEnBoFqT4GLwuTy/?= =?us-ascii?q?+FlLVySca+v+T53Vgt41emJB4c0L9t/ZuE+raPpOLPbRve174EWqbwRsP0s7sj?= =?us-ascii?q?pVif5eE+m74IYWx1ZBerEO4DWc4B3m3g17wlzTowE8PfGLLt4PhDV3YikzLhnZ?= =?us-ascii?q?B9Gk8aGvISHbqF54RRhHw4m/DDNt0Lbq9ChnuPFQS6HbMYzn6r8SSXKnF/gh7S?= =?us-ascii?q?yxHwXX+z7FjuoC9+QCvD09Djkk5PWbmsH0tSXi2pOUhjsDOUJwfosdX6uKsv4E?= =?us-ascii?q?ExKGzku8qHlHG9N7NPA83/ONucLDEoq10NiJ0+WMev2ZwbGNq6O9oR621xbvrA?= =?us-ascii?q?5GOtjy9Bor1Ii5DY4s6L5vXdBWOggLGCq7WR2DBYzWA1vVUk6tClNvzD/NOKTO?= =?us-ascii?q?q12GYWVSdwoRPBXwSyqrzZsV8bJVCL3F3MmIwQMdFTxWM42V3+5Og/XNIz8x1T?= =?us-ascii?q?FoTBZ/MHvj3zPSX7wFaBbNItVyme1TRXEkjzEVZmBKg2wHjws97RlXfM510oQZ?= =?us-ascii?q?F9d03mhBNtFYo3NVkg6EMJzSofDwcCdQqXDLayBUTqNYEET1QMaQyb3Limfac6?= =?us-ascii?q?xVZ8wrK05O7dd+N8BasNNupFjgGUgVhbHokbvrEZQL1hZVBS7rPXphLlC4j9Rf?= =?us-ascii?q?fqj30wNee6QspC68AWq2Mi4hqjRxqn8ZpD96wUiIyUea5Eb5nMu9p870R+6T4U?= =?us-ascii?q?aCNNhBl/jxWkUeETv+3j+sLUsIa05eauWqctQP8X9xsuC2R9kZTwmlYjrs/T1+?= =?us-ascii?q?tGTY3Vk4v/+hhXI3GWoIbazwV8Ke0WJoK3ZrZv6XEHKDIYJ30QJteZdvg84yBs?= =?us-ascii?q?MDXP/VNCGdkDZckFPMbXnwBblFHpUqlJ9sXHAl+YF5tzd8cw4mr40j8164UzUv?= =?us-ascii?q?rg6DKtIZDf7k1NMO1DjCp2idLCv/IZwfzMBygL+XOZcQR6wjuey5mRDPb95eqM?= =?us-ascii?q?x8/SV1MaGS42VIBRJCGc9gyjR+q1kojpUwyP58/3np0+bkKRSWarkKQDrKlMDf?= =?us-ascii?q?ZKij/n0ThGCoD1m/WVvsKw52tVrFJIDJ1+4gHCGKVbOpV7OAr3ltO3RkdiGiT/?= =?us-ascii?q?eNvYdh00uOqZ3u0M+flxN1PiZY8HJRIJ07f66X1TTgtyR775oE2UXecQZNR8Tv?= =?us-ascii?q?PLsGxV6IxnK68VP1idv4bmrjFWp1AqGAUpcqM/riRGdknSmw1YQ6n0t6IbigsH?= =?us-ascii?q?SNJ3pEBCF2SxOGI4+jrGWr9YjKaUCPMP9DWcULYCU0JyMiNxWxm1wolhe6O1nf?= =?us-ascii?q?BbtWNLhiF9oP8q0zxgXhezpS3sp6YQ2T09+bC4tTMBuWdGTuWfiCrIF1RDzOoQ?= =?us-ascii?q?gqcYFnni6EawYH8dY4vu+LNnP9jv9ZE943QjZhUuZywGXfq6BCH2lK6IBpGPv8?= =?us-ascii?q?9dhB6Ko8XCd7izLTIdNr4l0xLsW2B90hTCnBZv6GYLQCuv7NEqJIW5IsskyDCn?= =?us-ascii?q?GW7Fe1YQ+K9JttX+tUITRussdVxh2Hlj0tSARiAVS8zPH2E1jwY6ZmVAdJJO8g?= =?us-ascii?q?QaF64ugjaJoqZK5AcUbynIEo694Infgd/I2WUhTddt3m/WpK2Fh5My0H1in9N0?= =?us-ascii?q?7zKOt2oJeuzdUs9sHmLz2ZlFxez5ffWtvfgNSJF6x7S5TP8CLs6j9HO52JV3W0?= =?us-ascii?q?+q27MeEkGlMO8Z2LjbVTulRnecWeuRdWiDgzc5PVTo6RmuMFI3dN9Ar1UhPeva?= =?us-ascii?q?mp5ciwrhXKtoRiWRoF/W13AjMeIGeAI1poinfxYGTOgPaOiAPeIu2uExCEMQb3?= =?us-ascii?q?/VGit7E+q2sV+unIh4PHVt+kf6bv7u8gDhNtudBB8EHZTcrpFv5fywXniBNmN4?= =?us-ascii?q?zB1uIEl08P/SGE8vue9ab5achsPQh9B80e4Za/dtLzMytcMJloJk84mU39+AcQ?= =?us-ascii?q?vNwZbqOdHVvv+YDuXHz0QtfmFVSKAZYA3y54U+MN40QLjTHbxevRQHG6c1XIYh?= =?us-ascii?q?N2Dq9KFvLQNzdAHRaK6zgsnwqeKBfoFUqGPO7lIsMCfcvAUOyvKqQgx/bpCqn2?= =?us-ascii?q?v9LYsxRzJAqt1tDwVpHJFLG8wetQanBISUmK6jgd+r50x6o/MKsbb3Cv3S2tW5?= =?us-ascii?q?x59xX5lG6kOVJzvRAahrglh/juusmPvA1YPxCcz6c9MeSOd7WnLFaqPBHoinLT?= =?us-ascii?q?KOPtzzdlVe876Yyr15SQmRZCHlUKqari2rKutr7V89yoNmYOrZ1CYt4K3D2Nvu?= =?us-ascii?q?e2FboT+urXqINJtZ8VzLCvXSXxZVSfqe7GZlBrYabYru++cINtwu2t+c4xN87D?= =?us-ascii?q?5aysuKP7ChrlPQ2kJ8bZ/bN1Xm2yI4WYkMPRS+Pkwgj2DFqnTdH3tcNNarKdF3?= =?us-ascii?q?j9uODRzi+VNxmWczaW5FAWXoWNiRNXIc28Kkaw2A7BhLAMobn+6rZU44sbW/Se?= =?us-ascii?q?xyNZpZmeWqtbMHkdFyJiHRRchaOT/fLLt3PjpXE+XOq0IkYhkes7g6Qo01f4SB?= =?us-ascii?q?IFsbMEecziP/1QnC3lf3d9yrz6mEOzsW8nNbz7LF1jhMuga5ufaFgsH5VrDWco?= =?us-ascii?q?32VubIMCU5TjGaWSgyEUGx9FerofULp+CYIWYBrVAQeS+SFgoTqbp0rdjRE2/f?= =?us-ascii?q?g+tjc4MWhPqCQSD/VDV4lLYuBiZMrU2MQf8DFQ7Mb3/7gWpcoxevJvlW8nLgcb?= =?us-ascii?q?KYx7BZW+sMAotDaveZWcfXeehCJzc0kTUUIP28f9PZr7kl01/FTnAUE7fW+12E?= =?us-ascii?q?TU6XQ/ucxzTxUYUToYc0pjIi+sjMkS9vD6TII7Gfqias8o6/iiaYvfbTVmwzbE?= =?us-ascii?q?MojuICB3OBzwVeJ20eDdEapl3tEea8YBNI1XQ0mad11hQRYgVvQzhr1XFLmPuV?= =?us-ascii?q?BMJUUxgXgXmoTflAa0p4SHs0/EmX8kjxbMYGtMT7WWBT7P0PRJAbIf1u75PYfO?= =?us-ascii?q?MLzfIo2i92iDAruCWaSVVGh0SK9LSDMrh7w+h56GMx5O13U0fHaS7eaXPAzMLy?= =?us-ascii?q?EMhSxDx1pnai28bSlu9oPbpe4Yp+BQFZUmpNOtnB8GUZAinP0wyoskP+RWyT?= X-IPAS-Result: =?us-ascii?q?A2EQAgBYuwBZ/wHyM5BbGgEBAQECAQEBAQgBAQEBFgEBAQM?= =?us-ascii?q?BAQEJAQEBgyqBbY5xmWeOJzwoiilXAQEBAQEBAQECAQJoKIIzIg1GKS8BAQEBA?= =?us-ascii?q?QEBAQEBHwIrJQEBGQYBAj0BGx0BAgECCQEBBRIxCAMBHxEBBQEcBxIFiX0BAxQ?= =?us-ascii?q?BnX4/jgwFARwmAoJiBYNlChknDVaDCQEpAgYShDKDbodJhhUBBIk1h1xSi2uTD?= =?us-ascii?q?YIAiGknDIZAkl8zgRVYWS4nHSGFNw4BHIFyZoY4gj0BAQE?= Received: from unknown (HELO tarius.tycho.ncsc.mil) ([144.51.242.1]) by emsm-gh1-uea10.nsa.gov with ESMTP; 26 Apr 2017 15:26:57 +0000 Received: from prometheus.infosec.tycho.ncsc.mil (prometheus [192.168.25.40]) by tarius.tycho.ncsc.mil (8.14.4/8.14.4) with ESMTP id v3QFQoas021569; Wed, 26 Apr 2017 11:26:55 -0400 Received: from tarius.tycho.ncsc.mil (tarius.infosec.tycho.ncsc.mil [144.51.242.1]) by prometheus.infosec.tycho.ncsc.mil (8.15.2/8.15.2) with ESMTP id v3QF3Hil160396 for ; Wed, 26 Apr 2017 11:03:17 -0400 Received: from goalie.tycho.ncsc.mil (goalie [144.51.242.250]) by tarius.tycho.ncsc.mil (8.14.4/8.14.4) with ESMTP id v3QF3Gbc013990; Wed, 26 Apr 2017 11:03:16 -0400 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A1DtAwDqtQBZesHAVdFbHAEBBAEBCgEBhUKOcZlnjmqGJAKEJFcBAgEBAQEBAhMBAQkLDAcohUUDA0ABGx0BAwwGSyMRAQUBHAcSigIBAxQBnXE/jgwFARyDCgWDZwoZJw1WgwkBAQEBAQEEAgEdAgYJAQiEMoNuh0mGFQWJNYdcUotrkw2CAIhpM4ZAkl8zgRWBMC4nHSGFNw4BHIFyZoY4gj0BAQE X-IPAS-Result: A1DtAwDqtQBZesHAVdFbHAEBBAEBCgEBhUKOcZlnjmqGJAKEJFcBAgEBAQEBAhMBAQkLDAcohUUDA0ABGx0BAwwGSyMRAQUBHAcSigIBAxQBnXE/jgwFARyDCgWDZwoZJw1WgwkBAQEBAQEEAgEdAgYJAQiEMoNuh0mGFQWJNYdcUotrkw2CAIhpM4ZAkl8zgRWBMC4nHSGFNw4BHIFyZoY4gj0BAQE X-IronPort-AV: E=Sophos;i="5.37,254,1488862800"; d="scan'208";a="6030965" Received: from emsm-gh1-uea11.corp.nsa.gov (HELO emsm-gh1-uea11.nsa.gov) ([10.208.41.37]) by goalie.tycho.ncsc.mil with ESMTP; 26 Apr 2017 11:03:15 -0400 IronPort-PHdr: =?us-ascii?q?9a23=3AYDmkDB81wDdKsP9uRHKM819IXTAuvvDOBiVQ1KB3?= =?us-ascii?q?1OIcTK2v8tzYMVDF4r011RmSDNudt64P1LuempujcFRI2YyGvnEGfc4EfD4+ou?= =?us-ascii?q?JSoTYdBtWYA1bwNv/gYn9yNs1DUFh44yPzahANS47xaFLIv3K98yMZFAnhOgpp?= =?us-ascii?q?POT1HZPZg9iq2+yo9ZDeZwRFiCCybL59Ixm7rwHcvdQKjIV/Lao81gHHqWZSde?= =?us-ascii?q?RMwmNoK1OTnxLi6cq14ZVu7Sdete8/+sBZSan1cLg2QrJeDDQ9LmA6/9brugXZ?= =?us-ascii?q?TQuO/XQTTGMbmQdVDgff7RH6WpDxsjbmtud4xSKXM9H6QawyVD+/6apgVR3mhz?= =?us-ascii?q?odNzMh8G/ZlNF+gqxYrhympRN/zZXZbJ2JOPdkYq/QZ88WSXZHU81MVyJBGIS8?= =?us-ascii?q?b44XAuQcI+lXtJPyp0ASrRu/GwasAv7kxyJVhn/3xq06yOMhEQfb1wEnBNIBq2?= =?us-ascii?q?nUrNTuNKcJVuC1yrPEwijeYPNQwjr9543IfQogofGIR75/bc3RyUw2Gg7Dk16e?= =?us-ascii?q?qpTlMiuL2ugRt2WX9eltWOK1h2I6rwx9vCKjytooh4THno4YxFTJ+T9kzIooOd?= =?us-ascii?q?G0UlB3bcK4HJdKqi2XOI17Sd44TW5yoiY10LgGtIa7fCcUzJQnwAbSa/mdfIiJ?= =?us-ascii?q?5hLvTf6RITlkiH58drKzmhK//Ea6xu3zUcm011lKri5bndXWqn8N0BnT5tCGSv?= =?us-ascii?q?t74EihxS6C2x7P5uxAO0w5lqrWJ4Q8zrM0iJYfq1nPEyv4lUnuia+ZbEQk+uym?= =?us-ascii?q?6+T9ZbXmo4eRN5RvhQHjM6Qugde/AeM+MgQUQmeU5OK82abs/U38WrpKj/k2nr?= =?us-ascii?q?PFv5DdIMQXvrS5DBNN0oY/9xa/CC+r0M8GknkDLVJFfg+HjofyNlHSIPH3Efe/?= =?us-ascii?q?g1O2nDdt3PDJJKftAprKLnjdiL3hZ6py61ZAyAovytBS/4lUBawaIP/oRk/wtM?= =?us-ascii?q?DXDh8+MwCuxebnE89y2pkRWWKIHK/KeJ/V5FuJ4P8/ZvKBb5IPuSrsbv0i6+Pq?= =?us-ascii?q?gFcnllIHO6qkx50abDa/BPsia0GYZ2f8x9QMC2EHuiIgQ+Hwzl6PSzheYzC1Ra?= =?us-ascii?q?14rio2DIOgEJfrWpGmgLvH2jyyWJJReDNoEFeJREzlfYyfR/YBbmq4P856iTsC?= =?us-ascii?q?Hey6QZIgzgqpskn2x7xPIe/d+ylevpXmgosmr9bPnA0/oGQnR/+W1HuAGjl5?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0FYAgBztQBZesHAVdFbHAEBBAEBCgEBF?= =?us-ascii?q?wEBBAEBCgEBhReOcZlnjidDhiQChCRXAQEBAQEBAQECAQIQAQEJCwwHKC+CMyA?= =?us-ascii?q?PRikvAQEBAQEBAQEBAR8CKyUBARkDA0ABGx0BAwwGSyMRAQUBHAcSigIBAxQBn?= =?us-ascii?q?XU/jgwFARyDCgWDZwoZJw1WgwkBAQEBAQEEAgEdAgYJAQiEMoNuh0mGFQWJNYd?= =?us-ascii?q?cUotrkw2CAIhpM4ZAkl8zgRWBMS4nHSGFNw4BHIFyZoY4gj0BAQE?= X-IPAS-Result: =?us-ascii?q?A0FYAgBztQBZesHAVdFbHAEBBAEBCgEBFwEBBAEBCgEBhRe?= =?us-ascii?q?OcZlnjidDhiQChCRXAQEBAQEBAQECAQIQAQEJCwwHKC+CMyAPRikvAQEBAQEBA?= =?us-ascii?q?QEBAR8CKyUBARkDA0ABGx0BAwwGSyMRAQUBHAcSigIBAxQBnXU/jgwFARyDCgW?= =?us-ascii?q?DZwoZJw1WgwkBAQEBAQEEAgEdAgYJAQiEMoNuh0mGFQWJNYdcUotrkw2CAIhpM?= =?us-ascii?q?4ZAkl8zgRWBMS4nHSGFNw4BHIFyZoY4gj0BAQE?= X-IronPort-AV: E=Sophos;i="5.37,254,1488844800"; d="scan'208";a="5231680" X-IronPort-Outbreak-Status: No, level 0, Unknown - Unknown Received: from mail-pf0-f193.google.com ([209.85.192.193]) by emsm-gh1-uea11.nsa.gov with ESMTP/TLS/AES128-GCM-SHA256; 26 Apr 2017 15:03:15 +0000 Received: by mail-pf0-f193.google.com with SMTP id c198so656330pfc.0; Wed, 26 Apr 2017 08:03:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=pF2vK83w61PdA+AYgluzpSPKuqAJKamz9Z03Fd6xFwI=; b=YGo2a4F+Pkn3h98ROhET1wJdJws4xUqGy4OSlBbiA6MYV9NDvk4P3otCDe71/pweRG kbM6LLXcoRuMRXhUE0mb1Zad3Zr8X7nrTrKfy/QFLRudmgI5dpigF20JzVrVN+F7j0Xk ANRYeJn3nv4U9laUe7saY51G6T00FxrXsytZ/VVgKm8lepTall9e37kHdmhm8AJMRKwb IUh1BKnLgsgXbuG0p+k2OKxEwP/B7LCdc04iI5v0WEJa8E6/ujmRKE6LTL39WqvSdnuQ 6VY122HgjzQSanAOsJ2YjXdDrDIABnM8FvH/GsrTVCPKcj3J/FyqyqdMLIBYnpKNhixO 4idA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=pF2vK83w61PdA+AYgluzpSPKuqAJKamz9Z03Fd6xFwI=; b=blfrmz9VDlzKJWh5DHPCtgE6GLOAHa2IlF8dAOzrq3SDb0X5n0TbjxqlTGbO1v05pm kesSdS/UP3lYe69vFeynTSgB1BlN1g27aJW6Fp0yY7uaw4ZcOBBFxU7Q09WpE4cMw6AN 5sIvp/t7zwLMKm5fOok8vns4iOqvvnyZbMGrAg2dvuSdDiLx7SllUYXqVxa9suRP7G/V qGXlhYz+ojZtwAKj0ynq9b+d4aht45M1Fl/EHlYQsjoO9AkynMQq2XcS5MfX4X0mnOGx 3sKsFx9OKK5WdRedvfuQ4rcMmOWN/sdz6ymPspOWDGg7gyx1RVjIKtqdfvtjDkX6+IVr Ik6Q== X-Gm-Message-State: AN3rC/4gZn9IxMT4p4JtLi5ZWMwf1RJEHyU4zi9Q8ury9qQV7Vg5qBlq bRveFAEadk6xuQ== X-Received: by 10.84.229.144 with SMTP id c16mr274119plk.27.1493218993995; Wed, 26 Apr 2017 08:03:13 -0700 (PDT) Received: from ltest-vm7.localdomain (fs276ec80e.tkyc203.ap.nuro.jp. [39.110.200.14]) by smtp.gmail.com with ESMTPSA id 17sm756929pgg.48.2017.04.26.08.03.11 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 26 Apr 2017 08:03:13 -0700 (PDT) From: Sebastien Buisson X-Google-Original-From: Sebastien Buisson To: linux-security-module@vger.kernel.org, linux-kernel@vger.kernel.org, selinux@tycho.nsa.gov Subject: [PATCH 2/3] selinux: add checksum to policydb Date: Thu, 27 Apr 2017 00:02:15 +0900 Message-Id: <1493218936-18522-2-git-send-email-sbuisson@ddn.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1493218936-18522-1-git-send-email-sbuisson@ddn.com> References: <1493218936-18522-1-git-send-email-sbuisson@ddn.com> X-Mailman-Approved-At: Wed, 26 Apr 2017 11:23:22 -0400 X-BeenThere: selinux@tycho.nsa.gov X-Mailman-Version: 2.1.20 Precedence: list List-Id: "Security-Enhanced Linux \(SELinux\) mailing list" List-Post: List-Help: Cc: Sebastien Buisson , james.l.morris@oracle.com, sds@tycho.nsa.gov Errors-To: selinux-bounces@tycho.nsa.gov Sender: "Selinux" X-Virus-Scanned: ClamAV using ClamSMTP Add policycksum field to struct policydb. It holds the sha256 checksum computed on the binary policy every time the notifier is called after a policy change. Add security_policy_cksum hook to give access to policy checksum to the rest of the kernel. Lustre client makes use of this information. Signed-off-by: Sebastien Buisson --- include/linux/lsm_hooks.h | 2 + include/linux/security.h | 7 +++ security/security.c | 6 +++ security/selinux/hooks.c | 12 ++++- security/selinux/include/security.h | 2 + security/selinux/ss/policydb.h | 4 ++ security/selinux/ss/services.c | 91 +++++++++++++++++++++++++++++++++++++ 7 files changed, 123 insertions(+), 1 deletion(-) diff --git a/include/linux/lsm_hooks.h b/include/linux/lsm_hooks.h index 080f34e..7aada73 100644 --- a/include/linux/lsm_hooks.h +++ b/include/linux/lsm_hooks.h @@ -1568,6 +1568,7 @@ int (*inode_setsecctx)(struct dentry *dentry, void *ctx, u32 ctxlen); int (*inode_getsecctx)(struct inode *inode, void **ctx, u32 *ctxlen); + ssize_t (*policy_cksum)(char *cksum, size_t len); #ifdef CONFIG_SECURITY_NETWORK int (*unix_stream_connect)(struct sock *sock, struct sock *other, struct sock *newsk); @@ -1813,6 +1814,7 @@ struct security_hook_heads { struct list_head inode_notifysecctx; struct list_head inode_setsecctx; struct list_head inode_getsecctx; + struct list_head policy_cksum; #ifdef CONFIG_SECURITY_NETWORK struct list_head unix_stream_connect; struct list_head unix_may_send; diff --git a/include/linux/security.h b/include/linux/security.h index 73a9c93..8461d31 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -385,6 +385,8 @@ int security_sem_semop(struct sem_array *sma, struct sembuf *sops, int security_inode_notifysecctx(struct inode *inode, void *ctx, u32 ctxlen); int security_inode_setsecctx(struct dentry *dentry, void *ctx, u32 ctxlen); int security_inode_getsecctx(struct inode *inode, void **ctx, u32 *ctxlen); + +ssize_t security_policy_cksum(char *cksum, size_t len); #else /* CONFIG_SECURITY */ struct security_mnt_opts { }; @@ -1189,6 +1191,11 @@ static inline int security_inode_getsecctx(struct inode *inode, void **ctx, u32 { return -EOPNOTSUPP; } + +static inline ssize_t security_policy_cksum(char *cksum, size_t len) +{ + return -EOPNOTSUPP; +} #endif /* CONFIG_SECURITY */ #ifdef CONFIG_SECURITY_NETWORK diff --git a/security/security.c b/security/security.c index ef9d9e1..a82c08c 100644 --- a/security/security.c +++ b/security/security.c @@ -1305,6 +1305,12 @@ int security_inode_getsecctx(struct inode *inode, void **ctx, u32 *ctxlen) } EXPORT_SYMBOL(security_inode_getsecctx); +ssize_t security_policy_cksum(char *cksum, size_t len) +{ + return call_int_hook(policy_cksum, -EOPNOTSUPP, cksum, len); +} +EXPORT_SYMBOL(security_policy_cksum); + #ifdef CONFIG_SECURITY_NETWORK int security_unix_stream_connect(struct sock *sock, struct sock *other, struct sock *newsk) diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index a4d36f8..3759198 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c @@ -173,8 +173,11 @@ static int selinux_netcache_avc_callback(u32 event) static int selinux_lsm_notifier_avc_callback(u32 event) { - if (event == AVC_CALLBACK_RESET) + if (event == AVC_CALLBACK_RESET) { + if (security_policydb_compute_cksum() != 0) + printk(KERN_ERR "Failed to compute policydb cksum\n"); call_lsm_notifier(LSM_POLICY_CHANGE, NULL); + } return 0; } @@ -6071,6 +6074,11 @@ static int selinux_inode_getsecctx(struct inode *inode, void **ctx, u32 *ctxlen) *ctxlen = len; return 0; } + +static ssize_t selinux_policy_cksum(char *cksum, size_t len) +{ + return security_policydb_cksum(cksum, len); +} #ifdef CONFIG_KEYS static int selinux_key_alloc(struct key *k, const struct cred *cred, @@ -6285,6 +6293,8 @@ static int selinux_key_getsecurity(struct key *key, char **_buffer) LSM_HOOK_INIT(inode_setsecctx, selinux_inode_setsecctx), LSM_HOOK_INIT(inode_getsecctx, selinux_inode_getsecctx), + LSM_HOOK_INIT(policy_cksum, selinux_policy_cksum), + LSM_HOOK_INIT(unix_stream_connect, selinux_socket_unix_stream_connect), LSM_HOOK_INIT(unix_may_send, selinux_socket_unix_may_send), diff --git a/security/selinux/include/security.h b/security/selinux/include/security.h index f979c35..a329571 100644 --- a/security/selinux/include/security.h +++ b/security/selinux/include/security.h @@ -97,6 +97,8 @@ enum { int security_load_policy(void *data, size_t len); int security_read_policy(void **data, size_t *len); size_t security_policydb_len(void); +ssize_t security_policydb_cksum(char *cksum, size_t len); +int security_policydb_compute_cksum(void); int security_policycap_supported(unsigned int req_cap); diff --git a/security/selinux/ss/policydb.h b/security/selinux/ss/policydb.h index 725d594..dc29492 100644 --- a/security/selinux/ss/policydb.h +++ b/security/selinux/ss/policydb.h @@ -25,6 +25,7 @@ #define _SS_POLICYDB_H_ #include +#include #include "symtab.h" #include "avtab.h" @@ -293,6 +294,9 @@ struct policydb { size_t len; unsigned int policyvers; + /* checksum computed on the policy */ + unsigned char policycksum[SHA256_DIGEST_SIZE*2 + 1]; + size_t policycksum_len; unsigned int reject_unknown : 1; unsigned int allow_unknown : 1; diff --git a/security/selinux/ss/services.c b/security/selinux/ss/services.c index 60d9b02..a35d294 100644 --- a/security/selinux/ss/services.c +++ b/security/selinux/ss/services.c @@ -53,6 +53,8 @@ #include #include #include +#include +#include #include "flask.h" #include "avc.h" @@ -2170,6 +2172,95 @@ size_t security_policydb_len(void) } /** + * security_policydb_cksum - Get policydb checksum. + * @cksum: string to store checksum to + * @len: length of checksum + */ +ssize_t security_policydb_cksum(char *cksum, size_t len) +{ + int rc; + + read_lock(&policy_rwlock); + if (strlcpy(cksum, policydb.policycksum, len) >= len) + rc = -ENAMETOOLONG; + rc = policydb.policycksum_len; + read_unlock(&policy_rwlock); + + return rc; +} + +/** + * security_policydb_compute_cksum - Compute checksum of a policy database. + */ +int security_policydb_compute_cksum(void) +{ + struct crypto_ahash *tfm; + struct ahash_request *req; + struct scatterlist sl; + char hashval[SHA256_DIGEST_SIZE]; + int idx; + unsigned char *p; + size_t len; + void *data; + int rc; + + rc = security_read_policy(&data, &len); + if (rc) { + printk(KERN_ERR "Failed to read security policy\n"); + return rc; + } + + tfm = crypto_alloc_ahash("sha256", 0, CRYPTO_ALG_ASYNC); + if (IS_ERR(tfm)) { + printk(KERN_ERR "Failed to alloc crypto hash sha256\n"); + vfree(data); + rc = PTR_ERR(tfm); + return rc; + } + + req = ahash_request_alloc(tfm, GFP_KERNEL); + if (!req) { + printk(KERN_ERR "Failed to alloc ahash_request for sha256\n"); + crypto_free_ahash(tfm); + vfree(data); + rc = -ENOMEM; + return rc; + } + + ahash_request_set_callback(req, 0, NULL, NULL); + + rc = crypto_ahash_init(req); + if (rc) { + printk(KERN_ERR "Failed to init ahash\n"); + ahash_request_free(req); + crypto_free_ahash(tfm); + vfree(data); + return rc; + } + + sg_init_one(&sl, (void *)data, len); + ahash_request_set_crypt(req, &sl, hashval, sl.length); + rc = crypto_ahash_digest(req); + + crypto_free_ahash(tfm); + ahash_request_free(req); + vfree(data); + if (rc) { + printk(KERN_ERR "Failed to compute digest\n"); + return rc; + } + + p = policydb.policycksum; + for (idx = 0; idx < SHA256_DIGEST_SIZE; idx++) { + snprintf(p, 3, "%02x", (unsigned char)(hashval[idx])); + p += 2; + } + policydb.policycksum_len = (size_t)(p - policydb.policycksum); + + return 0; +} + +/** * security_port_sid - Obtain the SID for a port. * @protocol: protocol number * @port: port number