From patchwork Tue Nov 22 19:18:16 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Carter X-Patchwork-Id: 9441971 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 9967F60235 for ; Tue, 22 Nov 2016 19:22:25 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 8639B284C0 for ; Tue, 22 Nov 2016 19:22:25 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 796D7285CB; Tue, 22 Nov 2016 19:22:25 +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=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from emsm-gh1-uea11.nsa.gov (smtp.nsa.gov [8.44.101.9]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id DF9C4284C0 for ; Tue, 22 Nov 2016 19:22:23 +0000 (UTC) X-IronPort-AV: E=Sophos;i="5.31,682,1473120000"; d="scan'208";a="994645" IronPort-PHdr: =?us-ascii?q?9a23=3ARuxkzxyAPZjvzq7XCy+O+j09IxM/srCxBDY+r6Qd?= =?us-ascii?q?1ekeI/ad9pjvdHbS+e9qxAeQG96KsLQe1qGP6fiocFdDyK7JiGoFfp1IWk1Nou?= =?us-ascii?q?QttCtkPvS4D1bmJuXhdS0wEZcKflZk+3amLRodQ56mNBXdrXKo8DEdBAj0OxZr?= =?us-ascii?q?KeTpAI7SiNm82/yv95HJbQhFgDSwbalsIBi2ogndq9cajZd/Iast1xXFpWdFdf?= =?us-ascii?q?5Lzm1yP1KTmBj85sa0/JF99ilbpuws+c1dX6jkZqo0VbNXAigoPGAz/83rqALM?= =?us-ascii?q?TRCT6XsGU2UZiQRHDg7Y5xznRJjxsy/6tu1g2CmGOMD9UL45VSi+46ptVRTnhj?= =?us-ascii?q?0HNzok+2/JjMJ+gr9QrBa4qxF+xoLZZpyeOvhjcaPHZd4URXRPUNtfWSJCBY2z?= =?us-ascii?q?bYUPD/IDMOpFoYTyqEcBoxSgCgm3H+7v1j1Fi2Xq0aAgz+gtDwfL1xEgEdIUt3?= =?us-ascii?q?TUqc34OqMIXuCw0qbI1ijIYu1M1jfn9IjHbAohquyLULJyf8ve1VMgFxnZjlmO?= =?us-ascii?q?soHlIzOU2fgNs2ic9eZgU/mvhHQ9pwF+pTiv2N4hh4/UjYwbzVDE8D92wIczJd?= =?us-ascii?q?CgT050e8WkEJpLty2DMIt2Wt0tQ2dytCY90L0Gtoa3fCcLyJQ7xx7fdueIf5KU?= =?us-ascii?q?7RLkUeacJypzinF9eL+nmhq//ketxvf8W8WpylpGsCVInsfWunwQ0RHY99KJRe?= =?us-ascii?q?Fn/ki73DaCzwXT6uZZLk8qjafbMJshwqIolpoUrETDAjf6mEXog6+ScUUp4vSo?= =?us-ascii?q?5P79YrXnu5+cLJV4ih3+M6symsy/Bv40Mg4SUGiA5euwzrjj/Uz9QLlSj/02lL?= =?us-ascii?q?fWsIzCKMgGqaO0DBVZ34Y+5xqlETur38oUkWMaIF5dfRKIlYnpO1XAIPDiCve/?= =?us-ascii?q?hkyhkCx1yPDCP73hBIjNL3fanLj6erZ99khcxxYtwtBE/J9UFrEAL+7zWk/2rt?= =?us-ascii?q?DYCAQ5PBauz+boD9V9yJsSWXiTDa+BLKPSrViI6/ohI+mWfoAVviryK/k+5/P1?= =?us-ascii?q?iH85gV4dcbCy3ZoZc3C0BPNmI1+WYXD0mNcODX8KvhYiTOztkFCCUiRcZ3W1X6?= =?us-ascii?q?Ih/Tw7C5ipDYTERoCwmrCB2z27HpJObGBcFl+MCWvod5mDW/oUci2dP9Vhkj0a?= =?us-ascii?q?Wri7UIIuzw2htArgx7pgNOrU9TUStYj/29ht++3TiRYy+CR0D8uD12GNS2Z0k3?= =?us-ascii?q?gMRz8rwKB/pkl9xU2Z3ah/mfxYGsRZ5+lVXQciKZ7c0+t6BsjpWgLPZNeJT02m?= =?us-ascii?q?Qsm9DDEqSNIxxNEPY0NnFNWklBzD2TSlA6MNnbyRGJM06r7c32T2J8tlxXfJzq?= =?us-ascii?q?0hj0U4TctVLm2rnbB/+BbJB4HSjkWZkrymdaMG3C7C7G2D13aBvFlEUA5sVqXI?= =?us-ascii?q?RWwfaVbLotT4/EzCS6SjBqggMgtE1cGNMLBKasHzgVVAWvjjJMzUY3itlGeoGR?= =?us-ascii?q?aI2rSMYZLse2Uc2CXdDFYLkxsI8HmcKwc+HCChr3jZDDx0GlLle1ns/vVmqHOn?= =?us-ascii?q?Uk80yBmHYFB72Lqp4BEam/KcSvwI070YuCcusS90HEqj0NLMEdaAoRRufLlEa9?= =?us-ascii?q?Mn/FhHzX7ZtxB6PpG4MaBih0IRcxhwv0P0zRl4FoVAkc8srHMl1wdyLaOY0FVb?= =?us-ascii?q?eDOC2pD8ILrXKnP9/Bq3ca7Zxkne0MqK+qcI8Pk4r1TjvBq1FkY76HVozd1V03?= =?us-ascii?q?qa5pXXAwsfSonxUl429xh8prHVfjI965nS1XJyLam+qiXC1M4xBOs51hageM9S?= =?us-ascii?q?MLmDFA/2F80VGdKuJ/Atm1mndR8EJ/1S+7IvP8+8cPuGwqGrNv56nD26lWRH/J?= =?us-ascii?q?x90kWU+ipkUOHIwpIFz+uC0QedTDj8i1OhstzwmYBCfjwSG3azyS7jBIFNfKFy?= =?us-ascii?q?e5gECXu2Kc2t2tp+n4LtW2Jf9FO7AlMG3NaldgSUb1Hmww1fy0AXoXi5liui1T?= =?us-ascii?q?B0lS8mrraH1izU3+vibAYHOnJMRGR6jlfjP460j8sBUUircQcpkgCl5UDkyKhH?= =?us-ascii?q?vqh/KHPTQUhQdSjsM25iSrewtqaFY8NX9pMotzhYXf+iYVCcV7H9owEW0yX9EG?= =?us-ascii?q?tC3Do7bS2luo3lnxxmj2KQNG5zo2DEecF03hrQ+N3cReJR3zYfSil3kz/XCkK7?= =?us-ascii?q?P9mz8tWej43DvfymV2K9Sp1TdjHmzZmduySm/mBqDhi/nv+plt3hDwc6zTfx18?= =?us-ascii?q?N2WiXQsBb8fo7r2ryiMe19Y0loAEHz69JgFYF4jos/mosQ1GMHhpWO43UHi3zz?= =?us-ascii?q?Pc9A2aL5cXoNXyIEzMDb4Ajiwk1jIWyGy5j/VnqD3strf8O6bX8O2iIh88BKD7?= =?us-ascii?q?+Z7LJekitzvlq4qgfRbONznjgD1PQu72QajPsRuAo3ySWdAK4dElVEPSD2kBSI?= =?us-ascii?q?9d++pr1NZGmzabiwyFZ+nde5AbGNogFTRGz5e5c6HS9s6cVyK1TM32Pv6oH/ZN?= =?us-ascii?q?bfd8oTuQOOnxfGkedVNIo7luAWiip/JWL9oXolxvY+jRN02ZG6uJaIK3lx/K2j?= =?us-ascii?q?GBFVLTv1aN0P+jH2kalRhN6W0J61EpVnBDoLQIPiTei0HzIKqfTnKwGOHSUmqn?= =?us-ascii?q?uBF7vTBwqf511ir3LIE5GmLGuYK2Uczdl4QxmdPkNfihgOXDomhp45ChyqxMv5?= =?us-ascii?q?fUd//DAe/Eb4qgNXx+JmNhn/SHzfpBumajc1TpiQNhxW4R1D50jPNcyS9OVzHz?= =?us-ascii?q?tX/pe5tgyCNnSbZxhUDWEOQkGEH07sMaKw6tnG8uiYGu2+IuDPYbqQt+NRSe2E?= =?us-ascii?q?xZW10otp5zyMLNmAPmF+D/0n3UpORW12G9/HlDoVRCwXjTjCb9CAqRen4CJ3rd?= =?us-ascii?q?2/8O7xVw714YuPFr1SPs91+xyvnaeDMO2QhSZ+KTpC0JMD22PIwqAF3FEOkyFu?= =?us-ascii?q?ayWtEbMYuC7WVq3QhLVYDxEFZCNoL8ZI9Lgz3hdXNs7UlNz1zaR0jvgrBFdZTV?= =?us-ascii?q?bhgN2mZdQWI2GhM1PKHF2ENLWJJT3MxcH6er6zRqNLg+VVrRKwvyyXE0j5PjSM?= =?us-ascii?q?jzPpTQygMflQjCGHOxxToJuychl3Bmj9Ut3rcRq7MMdpgj0wxL07nHLKNWoHPj?= =?us-ascii?q?h7fEJBtLqQ7TlXgv9nAWxO8mJlLfWYmyae9+TYNpEWsf5xDiRukOJb4Wo1y71O?= =?us-ascii?q?4yFeQ/x6hijSo8VyrFGhl+mA1iBoUAFSqjpRgoKEo1liM73D9pZcQXbE4A4N7W?= =?us-ascii?q?KIBhQJp9plDsPgtrtVytjImqLzJilN887I/cscAMjULdyIPGAnMRX3BD7eFBEF?= =?us-ascii?q?QiKzNWHDm0xdl+mf9nyTrpgmtJfsnIQBSrpFW1wpDPMbCl9oHNsaIJhpWDMklK?= =?us-ascii?q?SUjM8M5XWlqxnQS99WvpfdVvKdGf/vMiqWjaFYZxsUxrP1NYITOZPh1ExmcVR6?= =?us-ascii?q?n4PKG1HMXd9XpC1hdQw0oERX/Hh4UGIzx1rvahmx738LCf60ghk2hxNkYesz7z?= =?us-ascii?q?fj/U04JkDWqyswi0Q+gtTlgSqMfz72IqewRZtWBDT0tkQrNJP0XRp1ZxWonUN4?= =?us-ascii?q?LDfEW65Rj7x4eG92jw/cv51PFuNCQq1AYR8d3uuYaOsy0VRbsCmnwlVH5eTdA5?= =?us-ascii?q?t4iAQqaYKsr25H2w97cdE6P7LQJKtUwVhLna+BpDWo1vo2wA4QPEYC7n+deDMS?= =?us-ascii?q?uEwJKrknJzCk/upy5gyegzFDYnQDV+I2ovJ28UMwI+qAzzj+3LFeMUC+LeqfL7?= =?us-ascii?q?+eu2jbjsOHWE8/1kYSm0lC57h23t8pc1CIWEA30LuRCxMJONLGKQFSdcpd6n7T?= =?us-ascii?q?fCeJsejWzpJ1OZi9GvrvTe+Uu6YemlikExoxH4QQ8sQBGYGh0FrGIsfjLb4Fzw?= =?us-ascii?q?gt5QvwKVqZC/RJfQ6Eny0co8Gj1pN325dSJi0FC2VnLSq3/qrXphMtgPebX9c2?= =?us-ascii?q?eHcbUZECNnIqWM23gCFZv3NYDDaryO4ZzhaN7yPkrCTKEDb8d8ZjZOuTZR50FN?= =?us-ascii?q?G2+DA/86+qiV7X8pTTPHz1NdViu9DV8uwWvZCHBO1ITbNlqUfTh5FYR2C2U27I?= =?us-ascii?q?CdO1J5/wZJcibdPqEHa3SV2/hCwrQMjvJtqtKbKIgQ7wT4ZOrIabxCwjNdO6Fj?= =?us-ascii?q?wGARhwo+AD675iagIbZpo6YRjotwM4N6OlOwqXydSuTHyrKTdPQflf0P+2Z7pJ?= =?us-ascii?q?wCowduW60mcvTokmz+mr9k4AXIoFgQ/Yxfu4fYZRTDbzFWJHewXUvyU5jWhgOv?= =?us-ascii?q?w1wuclzxPCqUMcPCyTdOx1dGxEuMkxBVyPIXV3Dmo4Q0GTjY/Y7wGxwb8d5Cpd?= =?us-ascii?q?kMxS0eFft3j+pJDfaiq2WKO3sZXVrzYgbd8+rq1rN4zjI9eJtJPZnjzbV5neqh?= =?us-ascii?q?SLXjOgGfdGndZdOz5XQP5NmW45I8MGopZB5VA3VsggO7xFELMsqayyaTp4ES4S?= =?us-ascii?q?yjcUWJ+C3DMYnuixwKfVlhCUcJQmMRwLro9CgscDXCFqYiMSvqijV5/Zl2WcUG?= =?us-ascii?q?gEPB8T7RhQ5AIHjoJwZPrq4JDPTJBX0DNWv+h0XTHVFpZ281v7S2eWgVf8SPWg?= =?us-ascii?q?nOyp3R5SzPz23dkBXR5zE05dyPhKlkEwMrF4N7EQvpLWsj+PbU77vHjiyPC8K1?= =?us-ascii?q?lUyM3UcUb1DIvZtWXmSS0T5WcbSZVJyH7BCZQYixB5Z7ozpFVQPICmfV7z5jI+?= =?us-ascii?q?y4t1H7m4VMWrx1c/onYFXCqqEsROBP94v17NXz1leZ+roo3/O5pOWm9Q5IGdq1?= =?us-ascii?q?BBnUp3KS651JxcJ9tO4jMXXThPoDSdvMepR8FZ3895EYMMKM9lu3jhAKNEJISR?= =?us-ascii?q?o3out7zg0H/W4TY8sEuhyTWyHK+5QeRZ/3EeGgo3JmSerFUvAPU28mvI9FDCrE?= =?us-ascii?q?x09f9BBreTlUVxvCp9HpdWCzZV0nClKk9+TGVav+VfM6vZacpcTOcuZRW3IRwx?= =?us-ascii?q?CeYm31CV/UFzhXr5YzZ9thFA9CDZQgY5TjQajan1mT0GtM6nPSEVS4hSYTUmdS?= =?us-ascii?q?fFJBqRmTpLsxZHd0FqR5cZD85H+7Ecw4RZ5dfNRli3KS4bRhxiKhw33udFmU5F?= =?us-ascii?q?rkqYZTjXDRC0evbXrh13YcCRodayI/T34AhLloHqvP02+qgYW3KmngitTszEoI?= =?us-ascii?q?/nqt2GrE2Oe7nkM+eke3/OUCDMjQyshbcjF5TK5TbcPxdbK5Zg1XopepzhCWnV?= =?us-ascii?q?PRtYOa4UO01bWr1kZtlcpOBVedNkcr4T+aBxHhKHWg/vGIu3ofleNVbTWS7RID?= =?us-ascii?q?id8uGkuoLT6qHdSfL8acOSwXbHX7h3MY1+6TXhHLfqy4Be8FLs2vhx7kN6VUTG?= =?us-ascii?q?MyeZodT9PAME+teteVb5s500GTPWHI1wn2DzxkFBcMoXRzOl8IgCxJNe8nbwRv?= =?us-ascii?q?py0lLvv+1K67lk9Y437qh0xseyP6jfMulVsUl9DRSOAQVq7JotCnBlR29Neu8R?= =?us-ascii?q?NOvRfaMBgMDsse/3DasX6AaR++NDd9vKPETBmtS7CjGASBxLgAYBpiQcLguHzf?= =?us-ascii?q?KFnLV0Scm9r+jjxk0t+0S+LgIBzL1154eL4KyIpOHNbxvW0LcLRLPnRt/pobQq?= =?us-ascii?q?oEOS4ucolLgQdWxpewenCvQSVtYBxmf8yqAn1SQsE8fYErLh/v5DUmg1njPmm5?= =?us-ascii?q?BzBVUZAOgUHaaR/YRDgmg4h/HZNscIfaxYnWaPDxGkGKcYyXG38yuXPHVlghbW?= =?us-ascii?q?3hH2QGO88Fj2rStiTivX1dvjk01VVr6sBUdJRCepPEB1sTyVMArvrtr3trw/7F?= =?us-ascii?q?sqPWz8qNKNiGyhNatLEMLlINyTPzI0pE4XjZ02XdGvwpwUGdujL9cX7HF+b+HR?= =?us-ascii?q?53mtkyBfv6dNn5De7d2N+vXLAXmgiLWXq7GWxDBdynU1pl8/5c69OfHJ/d2FWe?= =?us-ascii?q?yo13wWTyd9pQTOQwK1pqbcr1AONkyByF3Ll5ASPtFFwXk40Vnr5O0nQN0t8QVe?= =?us-ascii?q?EZjPZ/cZqDD8JjT0xk2fY8otWSmC0jtYBFb1EVh+GKggxm3wuMbJlXbf+1I2QI?= =?us-ascii?q?l/a1LoiQZxD4omNUIn8EIXzTYbEQgRdRCbC6mlBUbkLYsBTkUDbAqI3bikdact?= =?us-ascii?q?3E1zxLyv6PXVbeNiG6oHLuxdgRKWnFhHBpIWtrUTQLN9elBH7qHYuhPvC5P5UP?= =?us-ascii?q?j6i3U/Kee5QsdA8cAWr3Ei+BqwRwK86Zdf6LYWkIuHdq9fYZnCps987UZn5SIX?= =?us-ascii?q?diNXnRh/iwi0XvwbpO/+/NfUqoeo6vypVKY3Xeob7R80B35xj5HomlAsvcnX1/?= =?us-ascii?q?tASo3SkYn/6BpCI2KWt4ba3Rh8LvAOK4GycLZ76XoHIykeJ3QTPduZcPQ8+zVi?= =?us-ascii?q?MCnP6FxCDMIMYskYPMnXlQBXlELpQrdT+dTfGlOCDIdzbc8o5XLtyD8p6Zs8Tv?= =?us-ascii?q?rg6DiuKJDD9VFCIfdDgz9qlN3cv+Ua3PvSCCcW4XmFcRd12TmNy4OQC/rq++WD?= =?us-ascii?q?1s3UXUscHiEqS4ddOCaC+Qu/S+q6jprpSB2b6tPzgJ8lcEKQR2Cxk7oFsqlWDO?= =?us-ascii?q?5AkT/33j5AGYDpn/iVqcaj6HNLtl1bF4Z+9RLFF7tZPpVnPhT4kc6nRlNiCSv7?= =?us-ascii?q?ecHUcAcuueWNy+cI/ep+LUv/apUBLhIC1b369WJfThFyR77uolaZQeURacNjSP?= =?us-ascii?q?PDqHBV9Y1gJLEUMViYpZzltDFIp04qAA4nb78wtD9adlLUkA1TRan0pKYKihEA?= =?us-ascii?q?Xt5hpU9MBWWwNXox5zXbTqRVl7CdBuEa/DuVT6wOVVhoMyxlThO63ZVhYb2pku?= =?us-ascii?q?5dvmNBhCN9r+Ag0yZ6SxukpS3su6UN1Coi+LG/tDUBv2ZJQfmekyfMFFVM0fUL?= =?us-ascii?q?jaYaC3b56ly8YWIObJXz4Ll5P8vg8ZQu43UlbRUlYSIGQfyqCzvsgKOQHoyPrN?= =?us-ascii?q?VciQaMuMXQd7CzKzMfNrAgyR3+Rnh91RPekAxv8GsRTTWq9MUkK5mlOcY52iqo?= =?us-ascii?q?HnDWdFQS7aNHvsvxsUUGTeUsZlNn3mpjztKLRisTS8zTA2w1lBQraX1YcJJf7h?= =?us-ascii?q?8XD6YogjKPvqhI4A4UZDPUH5+++onXm8fI2GUyQc1sxm3Iuq2Pnokq32F9m9No?= =?us-ascii?q?8i6Ov2wfd+7YU85sGnjz0YNfye3iZ/qzqe0HTYpmyKi7UPAcKMWj/nG22JpyUE?= =?us-ascii?q?+/2rseB0a5MPMExrrDTyelSGiYVP+Xc2iNgzk5MVD95R2yIl0xdshKs1c3MvHe?= =?us-ascii?q?iZ5Eiw3hTbR0Sz2VpV/az2wjMuQaehk0uIi9eAwKS+gRaPaaJeQ0xv0xFkcMZW?= =?us-ascii?q?fTHSRqE++2rUKtnI9jNnp7/0r6Z/jt/xv9MNuWHRkEDZLaroBv9vOnXG6BPmVg?= =?us-ascii?q?zBJqNklu6+jfD0gxtvNbc5uJhdjQgNB73vQfd/ZjNi09vtATl5lm6YmT18eKag?= =?us-ascii?q?/ewYroJdHSufiYGPzfz0Ilem1AVboZewz17Z0gPtElQ73TAadZvRMECKg0XpMh?= =?us-ascii?q?M2bx9LlqIw5ocw/RZbG0gsz0qeKRYptbuWXa7lUqLCfToxcD0OC7TRRnb5C2gH?= =?us-ascii?q?X/OJAwRi5Br91qDxtpBpBPFtgFrwqmH56Ugr+0h8W2+0NgtO8AqbDwBezS1NSl?= =?us-ascii?q?w4VxWIBX5EKTPDbLBalknlpqg/+3gvfBzpnxE93tdckDVOhhTW7PcqXGEZmnKj?= =?us-ascii?q?KSJsL8fFZL87mY0L1nSRiRfCT5ULCdtC24NfVr/Vk7ypZmc+XN1jAt6a/U2Mfq?= =?us-ascii?q?bWFBuiijtWKJNIdY7FHSAezeXhRUSeeK8Wp8Ga0XbJD09PsVMdE5wdiT+Q9z7D?= =?us-ascii?q?NY3MuCOaihoVfG2lhnepLDMEvpxyE5VJERIBuhNUssgGnZqmnSAHhbIcakNclt?= =?us-ascii?q?j8iPDhPz/0l+g3ogZm1fFWryQ9eeJ2wb1NmjZA2F7g5LCMwDn+Gvc04iqqKyUf?= =?us-ascii?q?VoOolCmeiysLUHkM1pKz3USclbJiHQKqV5MiBXDurRuFgiegQEvKQtWocpeZiO?= =?us-ascii?q?J1sKMEKaxizuzQvC0Ev0d9u32aaXISYW9GtIz7bE0ThKugm4tuyVgsr5ULDWdJ?= =?us-ascii?q?v2RuLdMDI5VjGGQjQ/CUSp9k2nu/oDp/WVOnofolYIYiKSDw4Tu69vrdjMDmPJ?= =?us-ascii?q?n+1sYoEKjuiAWy/sUC14iLYyBiFTuE+XWPUPEg3Wb376gGpAowyuPORM8mz5YL?= =?us-ascii?q?GC3apaRegWAopKcv2ETNrVYuxRJjcyljUEI+awZdPdoKwl0lLTSmsZFbPE9FqE?= =?us-ascii?q?TE6ZWvac3S7kXZ0Jv4govSol4t3QkTVsHKTSPraQuTqu/5WmjCaco+LeTWgtY1?= =?us-ascii?q?EvjOIEHmaB3AFKKHsYBNENpEHtXqmAal5O1HIsjuJuwQUMeAVoUnB11H1ZhvO9?= =?us-ascii?q?FdNYSVIOi2OuWvIGZkhtDDws5U+K/hHyYdsYtM/NRW9e8bsMSYwGLPkv7onaI6?= =?us-ascii?q?QQwOw03DJ4viM6qT+RD1VDgQKZ66DQBr5zxqVe5Wkk+PF7RlqPQz3acmfby4er?= =?us-ascii?q?CNlCxTlwrnD+1srVv+dtNL1Aq4F/HlgKHTp8JsrB8jBZTWH0xAyysg65HDSZJj?= =?us-ascii?q?IZ5C0GJSkbeelowe97twzIecrf5k+KsaIutlerWk63De+v1ZhKDNz5/RmpYilM?= =?us-ascii?q?NzOwHtZ5regeuswVZPYFbI2zGBjqJxLiAxjQ7yIT/xHwvu6DEdtBwmJYlL4lbt?= =?us-ascii?q?7uQd9ZXpHiwDhkziMQl9I0xmqLD4aaOJA=3D?= X-IPAS-Result: =?us-ascii?q?A2HrAwCamTRY/wHyM5BdHAEBBAEBCgEBFwEBBAEBCgEBgw0?= =?us-ascii?q?BAQEBAR9YcRC7Cj4hC4JDhVJTAQEBAQEBAQECAQJfKEISAYFeGgkEPQoyAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBGgIIBUMBARkCBAECNxQgDgMJAQEXKQgIAwEtFREOCwUYBIh?= =?us-ascii?q?MDrI9KgKLVo18gTcKBwGCaAuDCgWBJQGHKoYcfEWKHwKGR4YdhBkCggY4gTSGK?= =?us-ascii?q?IYQjWaEDFVeFQIwCy+CNUYcGIFjVAEBhHBdDxeCFwEBAQ?= Received: from unknown (HELO tarius.tycho.ncsc.mil) ([144.51.242.1]) by emsm-gh1-uea11.nsa.gov with ESMTP; 22 Nov 2016 19:22:19 +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 uAMJMIrg010184; Tue, 22 Nov 2016 14:22:18 -0500 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 uAMJIdRW031405 for ; Tue, 22 Nov 2016 14:18:39 -0500 Received: from moss-lions.infosec.tycho.ncsc.mil (moss-lions [192.168.25.4]) by tarius.tycho.ncsc.mil (8.14.4/8.14.4) with ESMTP id uAMJIcuk008417 for ; Tue, 22 Nov 2016 14:18:38 -0500 From: James Carter To: selinux@tycho.nsa.gov Subject: [PATCH 2/2 v2] secilc: Add secil2conf which creates a policy.conf from CIL policy Date: Tue, 22 Nov 2016 14:18:16 -0500 Message-Id: <1479842296-21906-3-git-send-email-jwcart2@tycho.nsa.gov> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1479842296-21906-1-git-send-email-jwcart2@tycho.nsa.gov> References: <1479842296-21906-1-git-send-email-jwcart2@tycho.nsa.gov> 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: MIME-Version: 1.0 Errors-To: selinux-bounces@tycho.nsa.gov Sender: "Selinux" X-Virus-Scanned: ClamAV using ClamSMTP The program secil2conf uses the libsepol function cil_write_policy_conf() to create a policy.conf file from CIL policy. By default a file called "policy.conf" will be created, but the "-o" option can be used to write to a different file. The "-M" option can be used to override the mls statement in CIL. The "-P" option will cause tunables to be treated as booleans. Signed-off-by: James Carter --- secilc/.gitignore | 2 + secilc/Makefile | 32 ++++++-- secilc/secil2conf.8.xml | 82 +++++++++++++++++++++ secilc/secil2conf.c | 192 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 300 insertions(+), 8 deletions(-) create mode 100644 secilc/secil2conf.8.xml create mode 100644 secilc/secil2conf.c diff --git a/secilc/.gitignore b/secilc/.gitignore index f659d80..2d3ff40 100644 --- a/secilc/.gitignore +++ b/secilc/.gitignore @@ -1,5 +1,7 @@ secilc secilc.8 +secil2conf +secil2conf.8 policy.* file_contexts docs/html diff --git a/secilc/Makefile b/secilc/Makefile index 40254ce..e714a84 100644 --- a/secilc/Makefile +++ b/secilc/Makefile @@ -5,19 +5,24 @@ LIBDIR ?= $(PREFIX)/lib INCLUDEDIR ?= $(PREFIX)/include LDLIBS = -lsepol -L$(LIBDIR) + SECILC = secilc SECILC_SRCS := secilc.c SECILC_OBJS := $(patsubst %.c,%.o,$(SECILC_SRCS)) -# The secilc man page: -MANPAGE = secilc.8 +SECIL2CONF = secil2conf +SECIL2CONF_SRCS := secil2conf.c +SECIL2CONF_OBJS := $(patsubst %.c,%.o,$(SECIL2CONF_SRCS)) + +SECILC_MANPAGE = secilc.8 +SECIL2CONF_MANPAGE = secil2conf.8 XMLTO = xmlto CFLAGS ?= -Wall -Wshadow -Wextra -Wundef -Wmissing-format-attribute -Wcast-align -Wstrict-prototypes -Wpointer-arith -Wunused override CFLAGS += -I$(INCLUDEDIR) -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -all: $(SECILC) man +all: $(SECILC) $(SECIL2CONF) man $(SECILC): $(SECILC_OBJS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) $(LDLIBS) @@ -25,16 +30,24 @@ $(SECILC): $(SECILC_OBJS) test: $(SECILC) ./$(SECILC) test/policy.cil -man: $(MANPAGE) +$(SECIL2CONF): $(SECIL2CONF_OBJS) + $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) $(LDLIBS) + +man: $(SECILC_MANPAGE) $(SECIL2CONF_MANPAGE) + +$(SECILC_MANPAGE): $(SECILC_MANPAGE).xml + $(XMLTO) man $(SECILC_MANPAGE).xml -$(MANPAGE): $(MANPAGE).xml - $(XMLTO) man $(MANPAGE).xml +$(SECIL2CONF_MANPAGE): $(SECIL2CONF_MANPAGE).xml + $(XMLTO) man $(SECIL2CONF_MANPAGE).xml install: all man -mkdir -p $(BINDIR) -mkdir -p $(MANDIR)/man8 install -m 755 $(SECILC) $(BINDIR) - install -m 644 $(MANPAGE) $(MANDIR)/man8 + install -m 755 $(SECIL2CONF) $(BINDIR) + install -m 644 $(SECILC_MANPAGE) $(MANDIR)/man8 + install -m 644 $(SECIL2CONF_MANPAGE) $(MANDIR)/man8 doc: $(MAKE) -C docs @@ -42,9 +55,12 @@ doc: clean: rm -f $(SECILC) rm -f $(SECILC_OBJS) + rm -f $(SECIL2CONF) + rm -f $(SECIL2CONF_OBJS) rm -f policy.* rm -f file_contexts - rm -f $(MANPAGE) + rm -f $(SECILC_MANPAGE) + rm -f $(SECIL2CONF_MANPAGE) relabel: diff --git a/secilc/secil2conf.8.xml b/secilc/secil2conf.8.xml new file mode 100644 index 0000000..59d87a5 --- /dev/null +++ b/secilc/secil2conf.8.xml @@ -0,0 +1,82 @@ + + + + + + + JamesCarter + + + + + SECIL2CONF + 8 + 21 November 2016 + secil2conf + SELinux CIL to policy.conf Converter + + + secil2conf + invoke the SELinux Common Intermediate Language (CIL) to policy.conf converter + + + + + secil2conf + OPTION + file + + + + DESCRIPTION + secil2conf invokes the CIL to policy.conf converter with the specified arguments. + + + OPTIONS + + + + Write policy.conf to file (default: policy.conf) + + + + + Build an mls policy.conf. Must be true or false. This will override the (mls boolean) statement if present in the policy. + + + + + Treat tunables as booleans. + + + + + Increment verbosity level. + + + + + Display usage information. + + + + + SEE ALSO + + + + secilc + 8 + + + sestatus + 8 + + + + HTML documentation describing the CIL language statements is available starting with docs/html/index.html. + PDF documentation describing the CIL language statements is available at: docs/pdf/CIL_Reference_Guide.pdf. + There is a CIL Design Wiki at: that describes the goals and features of the CIL language. + + diff --git a/secilc/secil2conf.c b/secilc/secil2conf.c new file mode 100644 index 0000000..ff564f0 --- /dev/null +++ b/secilc/secil2conf.c @@ -0,0 +1,192 @@ +/* + * Copyright 2011 Tresys Technology, LLC. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of Tresys Technology, LLC. + */ + +#include +#include +#include +#include +#include +#include + +#ifdef ANDROID +#include +#else +#include +#endif +#include + +void usage(char *prog) +{ + printf("Usage: %s [OPTION]... FILE...\n", prog); + printf("\n"); + printf("Options:\n"); + printf(" -o, --output= write policy.conf to \n"); + printf(" (default: policy.conf)\n"); + printf(" -M, --mls true|false write an mls policy. Must be true or false.\n"); + printf(" This will override the (mls boolean) statement\n"); + printf(" if present in the policy\n"); + printf(" -P, --preserve-tunables treat tunables as booleans\n"); + printf(" -v, --verbose increment verbosity level\n"); + printf(" -h, --help display usage information\n"); + exit(1); +} + +int main(int argc, char *argv[]) +{ + int rc = SEPOL_ERR; + FILE *file = NULL; + char *buffer = NULL; + struct stat filedata; + uint32_t file_size; + char *output = NULL; + struct cil_db *db = NULL; + int mls = -1; + int preserve_tunables = 0; + int opt_char; + int opt_index = 0; + enum cil_log_level log_level = CIL_ERR; + static struct option long_opts[] = { + {"help", no_argument, 0, 'h'}, + {"verbose", no_argument, 0, 'v'}, + {"mls", required_argument, 0, 'M'}, + {"preserve-tunables", no_argument, 0, 'P'}, + {"output", required_argument, 0, 'o'}, + {0, 0, 0, 0} + }; + int i; + + while (1) { + opt_char = getopt_long(argc, argv, "o:hvM:P", long_opts, &opt_index); + if (opt_char == -1) { + break; + } + switch (opt_char) { + case 'v': + log_level++; + break; + case 'M': + if (!strcasecmp(optarg, "true") || !strcasecmp(optarg, "1")) { + mls = 1; + } else if (!strcasecmp(optarg, "false") || !strcasecmp(optarg, "0")) { + mls = 0; + } else { + usage(argv[0]); + } + break; + case 'P': + preserve_tunables = 1; + break; + case 'o': + output = strdup(optarg); + break; + case 'h': + usage(argv[0]); + case '?': + break; + default: + fprintf(stderr, "Unsupported option: %s\n", optarg); + usage(argv[0]); + } + } + if (optind >= argc) { + fprintf(stderr, "No cil files specified\n"); + usage(argv[0]); + } + + cil_set_log_level(log_level); + + cil_db_init(&db); + cil_set_preserve_tunables(db, preserve_tunables); + cil_set_mls(db, mls); + + for (i = optind; i < argc; i++) { + file = fopen(argv[i], "r"); + if (!file) { + fprintf(stderr, "Could not open file: %s\n", argv[i]); + rc = SEPOL_ERR; + goto exit; + } + rc = stat(argv[i], &filedata); + if (rc == -1) { + fprintf(stderr, "Could not stat file: %s\n", argv[i]); + goto exit; + } + file_size = filedata.st_size; + + buffer = malloc(file_size); + rc = fread(buffer, file_size, 1, file); + if (rc != 1) { + fprintf(stderr, "Failure reading file: %s\n", argv[i]); + goto exit; + } + fclose(file); + file = NULL; + + rc = cil_add_file(db, argv[i], buffer, file_size); + if (rc != SEPOL_OK) { + fprintf(stderr, "Failure adding %s\n", argv[i]); + goto exit; + } + + free(buffer); + buffer = NULL; + } + + rc = cil_compile(db); + if (rc != SEPOL_OK) { + fprintf(stderr, "Failed to compile cildb: %d\n", rc); + goto exit; + } + + if (output == NULL) { + file = fopen("policy.conf", "w"); + } else { + file = fopen(output, "w"); + } + if (file == NULL) { + fprintf(stderr, "Failure opening policy.conf file for writing\n"); + rc = SEPOL_ERR; + goto exit; + } + + cil_write_policy_conf(file, db); + + fclose(file); + file = NULL; + rc = SEPOL_OK; + +exit: + if (file != NULL) { + fclose(file); + } + free(buffer); + free(output); + cil_db_destroy(&db); + return rc; +}