From patchwork Tue Nov 29 14:50:57 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Carter X-Patchwork-Id: 9452345 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 653B06071C for ; Tue, 29 Nov 2016 15:04:33 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 5768C2838E for ; Tue, 29 Nov 2016 15:04:33 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 4C5302839A; Tue, 29 Nov 2016 15:04:33 +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 (emsm-gh1-uea11.nsa.gov [8.44.101.9]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 6AF432838E for ; Tue, 29 Nov 2016 15:04:30 +0000 (UTC) X-IronPort-AV: E=Sophos;i="5.31,717,1473120000"; d="scan'208";a="1119233" IronPort-PHdr: =?us-ascii?q?9a23=3AnNyr9hWgkIJ3kGw4CeNuwwo3C8TV8LGtZVwlr6E/?= =?us-ascii?q?grcLSJyIuqrYYhePtKdThVPEFb/W9+hDw7KP9fuxAipbvt3Y4StKWacPfidNsd?= =?us-ascii?q?8RkQ0kDZzNImzAB9muURYHGt9fXkRu5XCxPBsdMs//Y1rPvi/6tmZKSV3wOgVv?= =?us-ascii?q?O+v6BJPZgdip2OCu4Z3TZBhDiCagbb9oIhi7qQvcutMYjIZgJao91x/Er3VVcO?= =?us-ascii?q?lK2G1kIk6ekQzh7cmq5p5j9CpQu/Ml98FeVKjxYro1Q79FAjk4Km45/MLkuwXN?= =?us-ascii?q?QguJ/XscT34ZkgFUDAjf7RH1RYn+vy3nvedgwiaaPMn2TbcpWTS+6qpgVRHlhD?= =?us-ascii?q?sbOzM/7WrYhNZwjKZGqxy/oRJxzZPfbIWMOPd/e6/Qe84RS2hcUcZLTyFPAp2y?= =?us-ascii?q?YZYBAeQCOuhXrYf9p0MMoBejCwSjC//gxDBWiX/txqA6z+YsHBva0AE6A94Crn?= =?us-ascii?q?LZp8j1OqcIVuC1ybHFwzHZYPNTxzj985XDfw47rvGWQbJ/b9DRwlQoGgPHgFSf?= =?us-ascii?q?tZbqPymJ1ugTqGWb8+phWv6vi24gsQ1xpCOvyd02honGgYIV1EnJ+CNky4g7It?= =?us-ascii?q?24TVR0Yd+iEJZIsCGVLZB2QsI5Q21xvyY60qMJuZihcCgN0pQnyAbTa/OGc4iU?= =?us-ascii?q?4hLjSf2eLS1ki3JifbKygQu5/0u4yuDkS8W531lHojBFn9XRrHwByRPe5tadRv?= =?us-ascii?q?dg+EqqxCyB2BrJ6u5eJEA5ja/bK5k8zbEujpcTqkHDHjPumEXxka+Wal0o+ui2?= =?us-ascii?q?5OTjZbXrvoOcOJVuigH/L6QugdazAfg4MwcSX2ib/v6w1Lv/8k3iXLpGlPg2kq?= =?us-ascii?q?jdsJzCJMQboLC2AxNN34o+5BuyAC2q3dQFkXUdMl5IdwyLg5L0N13WJfD3F/a/?= =?us-ascii?q?g1CikDdxwPDGO6XsAo7TIXjHkbfhe6t96kFFxAUoytBf+pRUBa0fL/LoQULxqN?= =?us-ascii?q?zZAQM5Mwyz2ernDs592ZkEVWKABa+ZLrvesUWU6eI3P+mMeIgVtS79Kvkk4P7u?= =?us-ascii?q?i2Q0mVoZfaWw3JsXbmq0HvJ8LEWDYnrsg8kBHnkQsgo4UuPqlEWIUSRPaHaqQ6?= =?us-ascii?q?I8+jY7BZq9AojYQYythL2B3DynHp1NfGxGEU6DHmvye4WfRfgMbCOSIsl8kj0L?= =?us-ascii?q?TrWuV48g1QuztA/h0bZmIPDb+jEDtZLk0th5/erTlQs99TZsFcSSz3mNT31onm?= =?us-ascii?q?MPXzI5wrh/rlZnyleCyqh1mORYGsZJ5/NISQc6LZrcwPZmBN/sQA7Bec2JSFm+?= =?us-ascii?q?SNW8HT4xVs4xw8MJY0tlFdSijxTD3y+0DL8PjLGLCoI7/b/b33jrPcl902zG1K?= =?us-ascii?q?4jj1Y4XsRPKXeqhqll9wjcH4TJiVmWl762daQA2y7A7GmDzXCUs0FeTAFwUL7F?= =?us-ascii?q?UGsaZkvOrNT1/1jCTrG1Cbg9NQtB08GCILNQatL1lVVGWOvjONPGbmKygWiwBh?= =?us-ascii?q?GIxq6XYYrpYWod3yLdCFUenwAU53aGOhA0Bj29rGLGEDxuCVXvblv2/uZjsnO7?= =?us-ascii?q?T1E7zxuRYkJ7y7W1/wQZhfuGS/McxrgEojsuqy1oHFah2NLbE8aPqBBlfKpCet?= =?us-ascii?q?M9/FdG1WXCugxmIpOgLr5thlgCcwR2pUzizRN3BZtckcIytnMl0BJyKb6E0FNG?= =?us-ascii?q?bz6Y3Y7/OrnTKmn15x2vb7PW2k3Z0NaT4KgD8vM4q0/svAuxDEot721n08VJ03?= =?us-ascii?q?ub/pjKFwQSUYj2UkYs6xh3vKraYi8654La0H1jK6+0viXE2903GOsv0gygcMtH?= =?us-ascii?q?MKOYCA/yFNUXBsa0J+wuh1imcAgEPPtJ+a4qIcymbeCJ2LOuPOp6mzKml2tH6p?= =?us-ascii?q?hn0k2Q7yp8VvLI35EdzvGEwwSISjb8g02lss3shY9EYjQSEXalxij/GI5dfKty?= =?us-ascii?q?cpgXCW22Oc242s1+h4LxW35f7FOjAVIG2MuteRWMdFzwxhdf2loNoXyggye4yC?= =?us-ascii?q?Z0kz4xpKqFwCPO2/jidAYAOmNTWWZtl0vsLpKqgNAUU0mldBQmlBu/6kbg26hU?= =?us-ascii?q?ur5/I3PVQUhWYyj8N3tiXbeotrqef85P74slsTtWUOugfVCaTaT9rwEG3CPjGG?= =?us-ascii?q?tewj87eiquupX4mRx1knidLHFpoHreY8Fwyg/V5MbASv5JwjoGWC54hCHTBli9?= =?us-ascii?q?JNmp4cyYl4zdveC6VmKhUIBTcCbwwIObrCu75GtqARyjkPCogNHnFxY10TPj3d?= =?us-ascii?q?lwSSrItAr8YpXs16miK+JneU1oBFvi5MpgBo5+lYUxiYoL2XgHmpqV5mALkWDp?= =?us-ascii?q?MdVUwaj+dmYCRSYXw97J5wjowFVjIWiUx4L9THmS2NFtaMK9YmMSxiI96MZKBb?= =?us-ascii?q?yR7LBYmyt1pUa3oRjXYfdjgjcX0eEu52ICg+EVpAotyT2QArUWHUVBIyPskQ+F?= =?us-ascii?q?786go6VTYGagb6Kw2FB4nd+/ELGIuhtcV2rhepc+AS9w6d1yMFHS33318YHpY9?= =?us-ascii?q?rQYswVth2PlRfPkfRVJIg2lvoQiiptIXj9smE9y+4nkRxu2om3vJCdJGVw+KK2?= =?us-ascii?q?HAZYOSfzZ8MP5D7tl71TntuN34+xBJVhAS8HXIDvTfK1CjIdqeroNwiJED0mpX?= =?us-ascii?q?eUB6DTHQmB50d6t3jPCYykN2mLJHkFytVvXAedJEpCjw0PQjU6mIM2FgCwyMzn?= =?us-ascii?q?bkh5+igb5kTkpRtU1uJoKx7/X3/HpAiydzc0TIOSIwZX7gFe50bZKMKe4fh1Hy?= =?us-ascii?q?1C+Z2htgONIHSBZwtUFWEJRlCEB1f7M7mt5djA9/aXC/G7L/vJb7WOp/JRV+uU?= =?us-ascii?q?xZKv1Ytm+iiDOt+JPnZ8E/0xwlBDUmxhG8TFhzUPTDQalyzXYM6duBe8/Sh3o9?= =?us-ascii?q?ux8Pv1RQ3v4pGPBKFKMdV1/BC2g7mMOPKMhCpjLjZYzJwMz2fSyLcDxF4Slz1u?= =?us-ascii?q?dz61HLQPtS7CULjQm69PDx4HbCN+L81I4Lwg3glWJcHUkMv12aBigv4zFVhFSU?= =?us-ascii?q?Trmtu1aswSP2G9KFTHCV6WO7SAPzLG2Nz4YaWmRrFKi+VUrRKwsy6BE0D/JjSD?= =?us-ascii?q?iyXpVxe3POFWkS6UIQdTuI64chdiE2TjSszpagGjOt9tkTI22aE0hm/NNWMEKz?= =?us-ascii?q?hwaU1MoqeV7SxChvV/HGxA42F/IuaYniaV9e7YKowZsfFzGCR7i/pa4Ggmy7tS?= =?us-ascii?q?9CxEQuZ1lzHKrt52uFymnOiPyiB8UBpSpDZLhYSLsl9kOarF95lPQ3LE8AgK7W?= =?us-ascii?q?WKBBQAv8FlBcH3u6BM1tjPk7r+JypZ893K58QcCNLUJ9iZMHc6KhrmAj3UDBYf?= =?us-ascii?q?TTGxL23fg1FdkPeI+X2Pt5Q6tp/smJkOS79cTlA1EO0VClh9FtwYPJh3Ri8kka?= =?us-ascii?q?KcjMMQ/nW+rRbRRMJcvp3cS/2dH+7gKDeDgrlCfRcIxqn4LYsLPI3hx0NickV6?= =?us-ascii?q?nJjNG0fIR99NrTdubhEqr0hW93h+VnM820Tgagy34X8TEeW7nhk5iwdkZuQt7j?= =?us-ascii?q?js6U8tJlXWvCswjFUxmdL9jDCNdz7xKb28XZtRCyv1qUcxNIj0QxxybQKsnkxp?= =?us-ascii?q?LyvLR7VUj7R8b29rkxPctYFJGfFCUa1OeAUQyu2PZ/U0zVRcrT2qxU9b5evFDp?= =?us-ascii?q?tikRElcYW3onJF2gJjcMQ1KrLKKKpO1FhQibqEvjW02eAp3A8eO0EN/XuUeCEW?= =?us-ascii?q?okMIMqIrJymv/ux39QyNgT1DeHMPV/oruP5q8F0yO/iYxSL6z7FDMlyxN/CYL6?= =?us-ascii?q?6BoWjPi9WITU0q2UMSi0ZF/aN73twic0qOSk8vy7WRFwwTNcXcKQBZdcxS+2bP?= =?us-ascii?q?fSyWq+XC3Yp1P5mhFuDvVeKBqbwbglylHAk0BIQB9d4OHoO20EHfI8bnN6AKxg?= =?us-ascii?q?kw5ATxJVWFEPRIdAiNkDgZv8G11IV30pVFJjEBHWV9Nj265rjNpgA0nfWDR805?= =?us-ascii?q?YnEGXosDLXI7Q9e1lDJcv3haCzm3yO0ZwhCY7zDgviTQECX8b917afeQYhNsEs?= =?us-ascii?q?+5+TM+8qixklPX/ZPeJ3zgOdRloN/P5vsQp4ybBPNMUbl9r0DclpFDR3O0V27P?= =?us-ascii?q?ENi1J4X/aoQ3cdP0DXO6XUClhDIuU8f9JtCtIbaUgQvwX4ZbrJGb3Cw/Nc+6Dj?= =?us-ascii?q?wRBgt/p+QE5KJ6eQ0PfoE2YQD2uAQkNqy+IQCY0tO0T2arNzRWU+FVzf+maLxP?= =?us-ascii?q?0yoscui6xWMjTpEgz+i460gNRI0KjhzFyvajYJFeXjTpFnxbZQrPuTIzl3J9Oe?= =?us-ascii?q?Yq3uc/3BTIvEEAMzCKcexpb3BEv9E8BF6JPHp2C2o5SEWHgobZ5A6jwawS9TNH?= =?us-ascii?q?n9lIye1FrGT+vpjHbTKjQqyks5PVszY7YNgnpK1wP4rjIteGtJzAnzzfSoXQvR?= =?us-ascii?q?OfUCKgEfpVhMRQKjpCQPZUgWElJdAGuY1Z5EUrUsc+JqBAB7c0qbCvaTtkCykS?= =?us-ascii?q?zSkDWI6bxzMCg/2z273DmheebZQuKhoEv4tegtEFSS55fjsepLO/V4XRj2KLUX?= =?us-ascii?q?YEIAEI4AtW+Q0AiJF/fvr+4IXSVp9NyyRao/VuUivEDpNo7Uf0SnmKgVjkT/Ws?= =?us-ascii?q?i/ap3QRTzP3w0tkbXxp/CVNFyehPi0UmMq16Ja4Ls4HWtT+IcF/1s3j2yOu6Pl?= =?us-ascii?q?VRz9Pbd0HgBorfqWX8SjEc+WETRYJX1H7fF44dnBZiZak3o1VMJISmekfg6Dw+?= =?us-ascii?q?24RmAaW3VcCxy1Yit3YGSD+gE8BdBOF+rFLXRDplboixqJr/IZVSRXRf9YaBq1?= =?us-ascii?q?dDikptLTC2yZ5dK8FL7T4MWDlPoTqdvNuuRs1Mw9V2D5oWLtd5pXj9BLtOOIKN?= =?us-ascii?q?rH0uprzv1njZ9ig8sVig3zW8Aaq4T+Nf/2AFGwUpO36RqlIzAOQ26GvS9E7Csk?= =?us-ascii?q?xs9edBGrePlVlxoCp6Hp1WCDdFz2yqL1RyTHlDsuVVMqfVftddQ/YsexCgJQYy?= =?us-ascii?q?Ffk830yG5Ut0h2v2YzRutgtG/CDQRxE0VS4Rgrj3gz0fpManOTsUS59TaDUhaC?= =?us-ascii?q?DFKxmFli9LphZfbFpqW4sYAtZD9LEXx4xU/tDNSUy0MyEKQARiNh4k0fpYjUNM?= =?us-ascii?q?ql+YeT3bDQaydvbCqRx3fcaQrM61N/v15gFHhZ37sOog7aUMW2WmmRGxQdDZt4?= =?us-ascii?q?L8qtqKtk6VeafkL+G8ZGTOQCLKjR+umbcuF4PK8DTLMApHN5l6zmIpYZj7Bm7R?= =?us-ascii?q?JxtGI78UKlFGWq9kcdVGuv5VZ8t6d6YT46NtAQiHRhz3Eoy1sPZGNkrTRSjZLy?= =?us-ascii?q?iZ8uy/ppzc7bLDRuj6fcGMxmjITLxpMZtg7jn7Abjq25dE+kXqwvdt6l96SV/e?= =?us-ascii?q?PiCDq9TuOBgG69S8eUv5oJIpBy/WD4ltn3b3wEFPadYXSTWw8JsE0JNZ9GrwSe?= =?us-ascii?q?Vg30fovu1d66Vo5Isq771n0sq7OaDSKfFGvkB9GRiUGh9m9pMzD2hjX2pRePMe?= =?us-ascii?q?KO/NfaQFisDjs/r3GLIK5x2V4eNZdcDKJ0XGmsmhFD6QVwBLnAAcpjEENAec0e?= =?us-ascii?q?CKm7NsQ8a/uef5wl4t40S5LhMe1LBt/puE9bCVq+/LdBbR1r8EWrXwRszvsLss?= =?us-ascii?q?vV+S5ec+m74KYGB1ZBenEOcFXM4H2mjg1bwqzT4rE87bA7Lg4uBMWGwkkT/7hp?= =?us-ascii?q?B9G0kWGukOErqV/IRemWM4lPLFNtEMdaBCgGmPHwa+ErAe0X6r9zeXIG59jxHL?= =?us-ascii?q?yR7wRWez40HqrS9kWyTD1czukkxLWbmrHkddQzCmOVdmvz+VOgrnqsb3s7wv7E?= =?us-ascii?q?4qKmzkqM6NlGy5NbNVBcL/PtucITIwpF0Nkp08Xdmv2Z0fGdqhIdce7HB+YeHY?= =?us-ascii?q?62OwiSNBpL1Hh4XG6MGP5vrXBWWgj7Gdq7iVxjBX0H44vV8l6tCnK/7B+caHQ+?= =?us-ascii?q?iy2GYXVCd/vBHNXxirpbzHt1oUI1CE0F/XmIwWOdFUxXY41lzn5OgnRNI86gBe?= =?us-ascii?q?G53daPwcvj/zOSH7wVCFb9IwTCme3CNdHkjpHllgBKg8xGXwsdrMlXfX/V0oWo?= =?us-ascii?q?ZweFL8iBxyDoU3M0Qt50YLwisNFggNcxObDKqyCUTjM4QESVAJaQ6b07iiZqc3?= =?us-ascii?q?wUpzz6ur5O/IaOxxB7EANvhDgQGTm1hbAIgZsbUEQLJ7eV9S6rLYphT4B4jgRf?= =?us-ascii?q?jmmmI6NeepTcBC7cAZq3wi7x66Rxqk95hD6rEbh46MdqNfbpjDosd871x/5TEV?= =?us-ascii?q?aixNgQJwjxe4UeAauODs/NzbsJ6p6uahSqktQfkY+AYuC2R4kZTwnEgpocvL2O?= =?us-ascii?q?dEVo3VlYP//RhWI3GQpobVyRZ8JvQVK4+wZ7Zv7WsHKDIRJ30QJtqacf887DFx?= =?us-ascii?q?MD/L/VxNHtsMZc8EPMrKgQ1UiEzpWLRI+8reBFCZC5l8d9op72rxxzA56508Xf?= =?us-ascii?q?j86DWuP5DQ80lNP+9fjCVrjN/CpekUzuDIBycL+nSZcAZ6wj+cxJaREfrw+v+M?= =?us-ascii?q?yN7MXVMcAiE2S5tdJCaF+QG/XeW1lY7pUw2O5c/xgZI+aFqQSWasnKQBqatDDe?= =?us-ascii?q?lAhTjl0TdEC4D1nfWVs8C252dNsV1HColz5wXfGKpDJpV7JQj4ls6zS0hkHCT/?= =?us-ascii?q?ZN3bdhogueqR3OcM4PxyN1Dgao8fIxIEza/66HVOQwt2UrH2okqWXeIfZdthUv?= =?us-ascii?q?PErWpZ6YF+JK8VOliSupjqoi1PqFAsDw8jcKUwoSBCdknSgA1VXL75uKIaigQC?= =?us-ascii?q?Vd52o0lMFnyrNW0j5jrHWqVVjLWLB/wO6DqTVLEOX19uMixgXxO/wI9udKexnf?= =?us-ascii?q?BbrmNGmTtwoPcw3Dx8WhS8pS3sqrkJ2TIh5LG3qjUBtmZYTuWFiSvID0tMzOgS?= =?us-ascii?q?h6cGF3ni8UC8YGUEbIbq77loO8Lg9ZUm43Q4ZhkjZDMJXeChCyH2kqOJDZeCsN?= =?us-ascii?q?ZCix6XuMTBd6W/LS4MObQh0RjjXWRy0hDCnBZ092sGWjOg7N44K4W6PcYq3DGo?= =?us-ascii?q?FXLadFYL5aNJq9DxuEUOTOY5ZlJt2mJj0tKIRicVXszAB341jhQ4aWVDaJ9D5g?= =?us-ascii?q?MVF7IzgjqRo6dI8QcaYDbSEoS49YjdhsjI2XwnQtds2G3avKqFhokl0Hd9gdN7?= =?us-ascii?q?8jaOuGgOd+zfS8JsAH/z1odZyeDke/qtsuQHSJZ7x7WgUf8CNNKj+Wi32JhxRE?= =?us-ascii?q?+lx6oeEEC9MOAex7fXSSGlRnOEWe6TaWiDgy45MlLu5RmvNlA3adlKoFU7MubZ?= =?us-ascii?q?gp5cihDuUbJzRiWLv1Pby3YjMewCfQIspIinYxAKTPIWZ+WEJ+gh3vM+CFUIb3?= =?us-ascii?q?LSEyp5Eem2vkCxnIRhPXVv/1n6a/z38g/6KNuSBgUEEYnCo55+/fy6QWyANmFk?= =?us-ascii?q?zB12J0R07ODfF1IwtuBAaZqRm8bfh8hj2+4fa/htKTE9usIUmo9764mU0MeLcQ?= =?us-ascii?q?nWzpb2JNHVvuaXDubaz0QrZmFaSKQWbRny54UgMd4zQ6fTEqdBvRQAGag6R4Qs?= =?us-ascii?q?N3vw9KFxNw5zbg/Ra6i3gsb0ouKHfJ1UqGHK7lgoNifTpwUDyuCoTQx8d52qgn?= =?us-ascii?q?TyIJMzRjJGtNBtCAFpHIhIG8MGsQWnBYSYmKelhN+t40l6ofMFsbLsCvDW09S0?= =?us-ascii?q?x55+UIZc5UyXJzvRH61rgkN5juSunPfPzIT+BdnledMeW+hxWnTFZaPeHoWjNj?= =?us-ascii?q?KOPdrxe0BY/L6Y0bJ5SgueaTv4XqqHsS2kMetr4V8/yoNmZubTyyYt777D0tvo?= =?us-ascii?q?e25bvjujrWKONJZH4l3KHfbeXxNIRvWb62tlGKwXbZfu9OgQK9Aix8Kc4wZr5j?= =?us-ascii?q?RYzMSFO7ShrlPL2k9jcpLbKFXm1j0hWYkOOhu/KlcsgW7FpXTBG3RTMNarJdNr?= =?us-ascii?q?gNmLEhzn/1Nxln01Zm5dBmroQs+cOWwa28K4eQ2L+xtHD9ICn+6sZU44rba/Se?= =?us-ascii?q?hyNZVDnuWmrrIHkcxmKyvXXshVIznQLKNqPjpWFujPv0YnYhoFs7gzR4c0ap+C?= =?us-ascii?q?LkwbMEeA1yzy1xXN0VXueNG316aGPjwW8nNZwLLByjdMuga5teyegs35X7DTdI?= =?us-ascii?q?v2U+LKMCo5SjGaQiw/EUKo+Ve/p/oJp/uZIX4Zol8OeC6SDhAcprx3p9jKEmDT?= =?us-ascii?q?gfFjfIENhP2CXiD/UjF3lKozBiZNskCBWOQDFQjQb3D/hGpcuQqiJuJD/H7/aL?= =?us-ascii?q?2Y3KVVUfQMAoRQav2ZX8fYefdGKjcqjDoZO+G8cMbHorYk1FLIUWsZE67V9F2R?= =?us-ascii?q?TE6WXuaQxzT1UoUJp4I0oDYn+srMni9rFKTFJ7mfqCS1/Y6ijSaXp+neW3IzY0?= =?us-ascii?q?wxmu0CG2iBwARaJGECFd4VpFnnQrScaEZUyHIpleVu1gcOeAR2VX1uyGdWnPem?= =?us-ascii?q?GsBCT14blmauT+MHbFxtCzMw50CK6BXoYdMcocDTW3Ne9rwURIUDLvko74nXOK?= =?us-ascii?q?0LwPYu2jJruyM6sz+AD1NDkA2F6bDcHKRiyb1e/WM45e15XlmTQzPDdWjK0pGm?= =?us-ascii?q?C8xKxShyoH3p1NHZvv5zO7tApoF4AVAKASRsKtDb4z9BTXn+2BGusBajADSePD?= =?us-ascii?q?UZ7S4JJSwCcOZ1y/R2sBPWednc50OQsLghp1e1BgqRDLq7xoBLWYnV0lCjZC1K?= =?us-ascii?q?dyi7P4xnofZK0tAJaOUoYpbtLUrGK13cBweVoGgn/QL2r67jWchVyWwEjv8ENM?= =?us-ascii?q?DiX45MC8LQmj5/3SAbl9I00WSND4aHNdXC4MtiCCRLaJQ=3D?= X-IPAS-Result: =?us-ascii?q?A2HXAgDelz1Y/wHyM5BdHAEBBAEBCgEBFwEBBAEBCgEBgw0?= =?us-ascii?q?BAQEBAR9YcxC7Hj4iC4JDhSJTAQEBAQEBAQECAQJfKIIzGgkEPQoDLwEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBARoCCAVDAQEZAgQBAjcUIA4DCQEBFykICAMBLRURDgsFGASITA6?= =?us-ascii?q?vCSoCi02NfYE3CgcBgmgLgwoFgSUBhy2GH3xFiiAChkiGH4QfAoIHOIE0himGF?= =?us-ascii?q?I1xhAxVYRcCMQ42gjtGHBiBY1QBAYVODxeCFwEBAQ?= Received: from unknown (HELO tarius.tycho.ncsc.mil) ([144.51.242.1]) by emsm-gh1-uea11.nsa.gov with ESMTP; 29 Nov 2016 15:04:01 +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 uATF1VnS027889; Tue, 29 Nov 2016 10:01:37 -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 uATEpFQL096779 for ; Tue, 29 Nov 2016 09:51:15 -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 uATEpEI2023914 for ; Tue, 29 Nov 2016 09:51:14 -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, 29 Nov 2016 09:50:57 -0500 Message-Id: <1480431057-8768-3-git-send-email-jwcart2@tycho.nsa.gov> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1480431057-8768-1-git-send-email-jwcart2@tycho.nsa.gov> References: <1480431057-8768-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; +}