From patchwork Fri Nov 18 18:05:28 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Carter X-Patchwork-Id: 9437189 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 5E1FB60237 for ; Fri, 18 Nov 2016 18:08:29 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 54CDC2998F for ; Fri, 18 Nov 2016 18:08:29 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 493F5299C6; Fri, 18 Nov 2016 18:08:29 +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.9 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_NONE autolearn=ham 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 830F92998F for ; Fri, 18 Nov 2016 18:08:27 +0000 (UTC) X-IronPort-AV: E=Sophos;i="5.31,510,1473120000"; d="scan'208";a="1110476" IronPort-PHdr: =?us-ascii?q?9a23=3AtNeV+BfU7p8BZNtrz14TuJ06lGMj4u6mDksu8pMi?= =?us-ascii?q?zoh2WeGdxcq5ZxSN2/xhgRfzUJnB7Loc0qyN4vumADxLuM7a+Fk5M7V0Hycfjs?= =?us-ascii?q?sXmwFySOWkMmbcaMDQUiohAc5ZX0Vk9XzoeWJcGcL5ekGA6ibqtW1aFRrwLxd6?= =?us-ascii?q?KfroEYDOkcu3y/qy+5rOaAlUmTaxe71/IRG4oAnLq8UbgoRuJrstxhbHv3BFZ/?= =?us-ascii?q?lYyWR0KFyJgh3y/N2w/Jlt8yRRv/Iu6ctNWrjkcqo7ULJVEi0oP3g668P3uxbD?= =?us-ascii?q?SxCP5mYHXWUNjhVIGQnF4wrkUZr3ryD3q/By2CiePc3xULA0RTGv5LplRRP0lC?= =?us-ascii?q?sKMSMy/2/Nisx0kalVvhSvqRJiyILQeY2ZKuZycqbbcNgHR2ROQ9xRWjRBDI2i?= =?us-ascii?q?coUBAekPM+FaoInzv1sDrwayCAejC+zzxTFHmGT20LYm0+kjCwzKwBYtE84QvH?= =?us-ascii?q?nSsd77NL0SUeewzKTQyTvMdfZW1inm6IPVbB0uu+uMXa5ufsrL1EIiEAHFj1uM?= =?us-ascii?q?poP/JTOVyvoBvnOH7+tgSe2vi2knpxt3oji03MggkIbJhoULyl3d8yhy3YU7Jc?= =?us-ascii?q?WgRUJmbtOpH4FcuiGHO4dsXM8vTH9ktDwnxrAApJW1ZjIFyI49yB7ac/GHdo+I?= =?us-ascii?q?7Q/9W+uJOjd4gW5leKq4hxav7Uis0u38Wdew0FZNtidFjsPDtmoM1xzO8ciLUO?= =?us-ascii?q?d9/0e91jaP0ADf8OdELlwvlaXHMZIhx78wlp4LvUTCGC/5hln2gbeLekgr9eWk?= =?us-ascii?q?8eTqbqj8qpOCOIJ4lBvyPrk2lsy6G+s4MwwOX2aB+eS70b3u5Vb5T6tOjv03lK?= =?us-ascii?q?nZrZ/bKd0Aqa6+Hg9V1Jos5AikDzq9zNQZnWUILFJCeB6diYjpIEvBLOr3Dfe4?= =?us-ascii?q?nVSgiC1ryOzePr39HpXNKWDOn6z6crp6705cyREzzcxE555OEbEOPu78VlXqtN?= =?us-ascii?q?PGCh85Mgq0w/voCdhmyowfWXiPArKCMK/Iv16H/P4vI/KLZI8Tojr9LOIl5/H2?= =?us-ascii?q?h38jhVAdZbWp3YcQaH2gAPtmO1+WYWDtgtcaCmoKphAxTPbriF2ZST5TY2y9UL?= =?us-ascii?q?4i6T0hD4KmF4jDTJi3gLOdxCe7AoFWZmdeB1GCEHfoc4CEVOkWaC+JLM9ujCEL?= =?us-ascii?q?Vb+7S4A7zRGurgj6y7h5IeXI5i0Ur5Xj1MJ65+fLjxE96SR0D9iB02GKV2x0kH?= =?us-ascii?q?kISCUw3K9joEx90UyO0a1gg/xZDNBT/P1IUhwgOZ7b1ex6BMj4WhjdcdeRVFam?= =?us-ascii?q?XtKmDCkyTt0rwN8OZFt9Fs6hjh/Z3CqqBKIVm6aMBJwu/aLWx2LxKNply3bayK?= =?us-ascii?q?khiEErTdFSOm28h65w6RLTCpXTnEqFkqamb6Mc3DTC9G2b12qBoFlYUBJsUaXC?= =?us-ascii?q?RX0QelHZrdDn6UPZU7+vCbMnPxBaycGeK6tFdNvpjUlHRPj5ItjeZXy+m3uoDx?= =?us-ascii?q?aS2ryMdJbqe3ka3CjFCEgLjQQT/XKBNQUlAiehvn7eDDtrFV31eU/s9vN+qHyj?= =?us-ascii?q?RE8u0w6Kd1Fh16ay+hMNnvycRekT3rUfuCc9sDh0B1C939XYCtqFvQVher9QYd?= =?us-ascii?q?Uj71dbzWjZrRByPoS8L6B+gV4Tawp2sFnq1xVrFIpAi9MqoWg0zAVsM6KXy05B?= =?us-ascii?q?dzaC0ZD3IL3XJXH4/AqzZK7OxlHezNGW978T6PsltlrjvRumFk45/np71NlV1m?= =?us-ascii?q?eT6Y/RDAoOS57xVFg49wRirbHAfiY9/5/U1WFrMaSstD/C2tYpBO87xRa7ZNpQ?= =?us-ascii?q?Kr2LFBX1E8EAAMiuMuMqkUCzbh0YJOBS6LI0P8S+evSbwqGrIPxvkyyojWVI+4?= =?us-ascii?q?1yzkKM+DBmSu7UwZkF2euU3g2ZWDfglF2hqNz4mZhYZTEOGWqy0TbkBI9Naa1u?= =?us-ascii?q?eoYLE32iLNG3xtV5gZ7tVGVV9FqiB1MAwsCpYx2SY0b63Q1K2kQduWanljegzz?= =?us-ascii?q?xojzEpqbKS3CjPw+T5aBoLI3VLS3dmjVftJ4i0kt8bUVOzbwgxlRul40f6yLRA?= =?us-ascii?q?pKhlKWncX1tIdTDsL25+SquwqqaCY8lX5ZMytiVXVOC8bk6ASrHhpBsb3TjuH3?= =?us-ascii?q?BDxD8nbDGmoJL5nwZ1iGiFNnZ8sGLZed1sxRfY/NHcXeRe3icCRCVikzbbHEOz?= =?us-ascii?q?P96t/dWIkJfDtPuzV2e9Wp1Vdink0ZmMtC2l6m12GRe/hey8msX7EQgm1i/2z9?= =?us-ascii?q?xqVSHRoBniZInmzLq6PvxjfklsGlD88dB2GodgnYssnJsQw2QVho2J/Xoblmf+?= =?us-ascii?q?KdZb1rz4bHoWXjMLwMDa4A7+2E1lMH2J25j1VnKHwstuf9O6eH8Z2joh78BWD6?= =?us-ascii?q?eZ9KREkjFoolq8sw3ReeJynjEByfQw8n4XmPwJuBEzwSWHGbAeB1JYPSvxlxSS?= =?us-ascii?q?89+xsqtXZGG1cbi/ykVyh9ahA6+eogtEQnb2Zo8iHTNs7sV4KF/Mznvz5Zz/dd?= =?us-ascii?q?nOa9Icqx2Unw3Gj+dLNJI7juAKijZ/OWLhoX0lzPY2jQR00pGnuIiKMHli/KOl?= =?us-ascii?q?Ah9YLzH1adkc+jf3gaZZhMaW0JilHo99FTUTQJvoUfWoHSoRtfXnMwaBDiYxqn?= =?us-ascii?q?KcGbrREw+Q9ltmr27PE5CsMnGYOmMVzdN8SxmBPEZfmhwbXC0mnp4lEQCn3MLh?= =?us-ascii?q?f11/5jAN4V74rwBByux2OBbiVWffvh2nai8uSJiYLhpZ8B1N51vPPcyZ9OJzED?= =?us-ascii?q?lS/oe9owyVNmybewNIAHkGWkyEG1/jJLmv5cHc8+ifHee+KeXBYamVqeNCTfiI?= =?us-ascii?q?3Yyg3pFg/zmSKsWFJmNiAOEj2kpfQXB5HNzUlCgJSyMNjC/Ccsibqw2m9i1wtM?= =?us-ascii?q?C//+zhWBjz6ouXF7tSLdJv9gisgaieKuGdnyl5KTNX158Ww3/H1qQf1kYIiy5y?= =?us-ascii?q?bzmtDagAtSnVQaLKgKNWAQQXayZpO8tM6KI93hJANtTHhdPwzLJ4ieQ1C1hdX1?= =?us-ascii?q?z7hs6pfdAKI326NF7fAkaLLq6JJSXTw8zsb6O8SKdQjP5Itx2+uDabFVXsPjKf?= =?us-ascii?q?mDnoTR+vNftAjCaBPBxRoIu9aApiCXD/TNL6bR22KMJ4jSYozrIuiXPKL3QTMS?= =?us-ascii?q?ZnfkNWtLKQ7j5Ygu9lFGBb6nplMO+ElDyD7+XBNpYWtvhrAyRzl+5A5nQ11adV?= =?us-ascii?q?5jleRPNpgCvSssJuo1a+n+aUyzpnXx1OqjBQiY2Wo0ptIqTZ+YNGWXre+xIN92?= =?us-ascii?q?qQAQwQp9R5Et3vp7xQyt/Xma3pJzdN6czU8tUHCsjTMMKILnwhMR/zFz7VCAsK?= =?us-ascii?q?VjmrNG7Fi0xaivGS+WWfroImpZj0hJoOVrhbWUQpFvMdD0RpBsYCIJB2Xzw6l7?= =?us-ascii?q?6Ul9QI5X2goxnSX8hVopfHVveODvr1MzaZkaNIZx0WzrPkNY4TLJH021R+allm?= =?us-ascii?q?m4THA0rQXcxNoi1maw87ul5N/WN7Tm0yx0LlcB2i7GUUFf6ukR48khF+bvg19D?= =?us-ascii?q?fw/1c3IULHpC0un0YrndXomjORcDnqLKesR45WDTH0t0swMp/hRQZ6cxGyl1R+?= =?us-ascii?q?NDjYX7JRk6dgdWdzhQ/Gp5RPAuBTQrdeYBAMxfGafO4n0VVGqiq6wk9H6/PFCY?= =?us-ascii?q?F8mwoqa5KsqWxP2x57Zt4vOaPQPLZJzkRXhq+WoyCnzP4xwA4DKEYW626dYjQI?= =?us-ascii?q?uFYPNrgoPCqn4PBj6RGYmztCZGgNV+AmovR0+UMhI+6A1T7v06ZfKkCtMOySN6?= =?us-ascii?q?2Zu3LemsGVWVM/zEUIl1VC/bhtysosaVabV0U1wLuWDRQJOtLIKRtJYMpK6HjT?= =?us-ascii?q?YSGOvP3JwZJyJYWyCOboTO6JtKsPjUKkGhspE54L7sQbEZmmyFvYItv/LL4Z1R?= =?us-ascii?q?Ut4xzmJE6bA/RNeRKLlioHos6kwZBr2oldIy0SDn9mMSWr/LrXoBElgOabVtcs?= =?us-ascii?q?fngaRpcENm4xWMCihiFWo3FADD6x0uIF1QSP9CH8qTrKDDn9bttjY/GUaQlqCN?= =?us-ascii?q?6o5TU167K2hkLP8pXCO2H6MsxvutzV6eIavZmHDe9UTblmvkfTnIlYX2ClX3TJ?= =?us-ascii?q?EdGrO5j6c5MsYsDsCnamTly/jCo4T9vwPNaoKaiInQHoRIZPvYaG3TAiNdWyGS?= =?us-ascii?q?oEFxd2ue4D+Lp2ZRcfbJojfR7oqwM+OrSwIAeCyNquRXqtJCBXT/lYw+S6YaBX?= =?us-ascii?q?zyoyYe+7znsgUo81z/Ot/U4LWp4KkgnUxey/aIlGTSjzBntddh3Vqio9lmhuKv?= =?us-ascii?q?g9zf86wBLIt1kcNDaLe/ZyZWNfvtEzH1WSLWx4CmolXVOci5TM4hK01bAI4yRd?= =?us-ascii?q?h8pU0fFCsHXmpZDQfjSsVbexpprIrSovc8Imo7ZrPoz5IsqKrpTenibQTJPIqA?= =?us-ascii?q?2KTDa6F+ZGmthXOC9YWv9ImWA5NswGvopB7VExWN8nKbJSEqchurekZCF4Ai4V?= =?us-ascii?q?yC8WS5mP3Cceguum3bvViAuQeow4MBMYqJVCnscdUylubywCpq+sTZnZmnSYRW?= =?us-ascii?q?gMJAcT6QVM6xwalo9sYO/q/IrIQIVLyz5MrPJ+SjHLGYVw91vnVmGWhkD1SO+7?= =?us-ascii?q?nOyz2gJd1+nh0sUBWBFlF0hS2eJWlkouKLF4L6kQv4HKsj+UdUP0pm3t0u6mKE?= =?us-ascii?q?NXycLKa13yFJDFunbkUi0A5X0UQpdCyXHFGpQJiQV5bacrpFNXLYCnZkbx/Sck?= =?us-ascii?q?yJhzELWiU8Ck2Uolp24cRyi2C9pBF/1msFXPVTxreZyktJXlO5RXQm9R4pKdqE?= =?us-ascii?q?xUkERzPCGn15VQMcZN4iQDXDJXuzWSoMOySNFf2c9xF5IMOtB/u3PnF6NeNpmR?= =?us-ascii?q?pHk2urL0x3/c/DA8t0y6yyuvFK+iSOJZ5HYeGgQvJ2SRsEUvCPEs8mjK+FDXrl?= =?us-ascii?q?905/tbBqSIjUhpujl9BI1OBjBT2XCmNFlzTXhGs+RGKKvOacBcRec9ZQO3MRwk?= =?us-ascii?q?CfEmx1CJ/V1znXrhfyxysQ5a9jvBXwUoUCkama3hmTsApcG7ITUaUY5HbS09by?= =?us-ascii?q?fZLAKWgSBXswxFa05wX5AWH81I9KwF0otM5srNV0KsJj8fXBB4MQI4y/Vfn1ZZ?= =?us-ascii?q?sEqEYSDdERaodfHXvx13eseessCpI+rj/Apci4Porv43+LsZS32hgw2tTsjUr5?= =?us-ascii?q?Xgud2SqkuOaKD4PvW+YX/GUjfBlg2/iqk/D5bU5SjTLBRUJIRgxXoif5fhFXbB?= =?us-ascii?q?PQ5aKKIDO0pbSad6ZM1dreBUe8BoZKQE9bJjCx+cWhzvH4mvo+VcIVbIWTTSNS?= =?us-ascii?q?OB/fKjoYjL97zSVfDgZtCQx3bAW693JIl15iT7G7jwzY9T4U722vBz9kxkV1TJ?= =?us-ascii?q?LyeBo8n/KQ8R4smtaFfitIUzHTzKGJdwjGbtxkZYesoPWC2q7I4Xx45F6HvrUu?= =?us-ascii?q?J41VXzsPdO+LZ674k3/6ppxt2wJavILvRaq0BnCACOBgp27pUtHHR/R2dJb+8N?= =?us-ascii?q?MvfeY7oWgt31puDqE6wX9AeV9PZHadvGIEHBntewCi2GRRxDhgcBpiYQLhGA2P?= =?us-ascii?q?6dh690VcGlqPD82k0351i+KgAJzKxx5Yie4KWFv+nXYAXNzbgfRqflXNvzoao2?= =?us-ascii?q?t0OU+/IkiKYEenZpbA2/DOgdSskdy3/iza8w1yIsFNjDH7b69/5dTH85my/gm5?= =?us-ascii?q?RhH1UXBvwUHKCE/YJFnmsinOzZLNIWeLhYmmmTDR6kDqMCyXmz5iuVOmZlhB/O?= =?us-ascii?q?0wv3QWyu8lD7tjN4TjHKz9f4lUpZTL+3CllOXyCxI093rCuPPBb0tNrwoak141?= =?us-ascii?q?w2Mm3gtNKJimShPahaENDhK9OHICk7vlQXgIc2Rty11oARAcC9L8sJ8HFicvve?= =?us-ascii?q?7HumkylFo6pchore5MSV9u/WHXmmga2asa+CxCtEyngioFEw9sygNuzU59KUWf?= =?us-ascii?q?io0HwRTyhnsQvbQxG1sqDbr0wTOUGT1UfLn4oKPs1W3XYmzUzm4ekjT8g19ApA?= =?us-ascii?q?CobBafQCpSrwODvv21qfZcw4VjWG2TtNAl31CUV4GLQ72G/ouMLJjnLQ9l0zS4?= =?us-ascii?q?l+aUPomBt3D58iJkI18lgXxSgDHhYRZhCHFr2oAl7lLYQcX0gZdRuHxKS6ersw?= =?us-ascii?q?3UBrx7Ov4PHcbel7B6UTMvZQlQGOk0ZcGpINqa0RWq58e15H+67TpwjiDZTnUO?= =?us-ascii?q?bilXo0NP21Td5V8cYFuHQ8+Aq/QQSv6Ytb5bYBlJ+IbrJEYYTLvM1k9Edo/yAP?= =?us-ascii?q?eTZCgBdhlBO0Svscq/r94tfBv5qn9P2uWLwrR+oJ6xg+H35+gIfogFA/vdHX0P?= =?us-ascii?q?9RSo/UiYT66w1NJmCFuYbE3BlmKOoOLY2rcKxm93oZOygUP2gOMsaOa/kg/y9t?= =?us-ascii?q?Ny3e511DA8wWf9wXINHAmRtKhU31Rr5c6tDXGliCC4d8b8oo9Xb4yCgp8ZsgVe?= =?us-ascii?q?bt8CS5JZHE71BDJfxDjiRslM7apOcP3PrSDDMa7mWeaxdo3CyN0YSNC+z3/eWW?= =?us-ascii?q?0t7YTVQGHjQ5U41FPjqN5RSnRvaplJXuSg6U8tX8gI4ie0KQSH2xm74FsqVVHe?= =?us-ascii?q?5blCr72jleFoboh/OaqNes8HFYtkFbH4Zz4xzFH79fPpZhNRT7iMarXE58CTX7?= =?us-ascii?q?eM3OcRououWWzP8W4+piL0v+eZMbIhUcxrLm83paUA9uR6TwvlmHRu8eedpmSP?= =?us-ascii?q?zFrnBJ841gMLUAPEKApJDwqDdHtkw2ChczaLAstjxaalXOnApNVqb7orEAkBUT?= =?us-ascii?q?UcJ5uUJXHWKwOX4+6CTHVatPkamRE+YZ8jONQawSS09oKD9xQwup2JVyfLukhf?= =?us-ascii?q?9HvX1AniNhp/gq1DtqRACiti3opqIN3y8g+b6juTUFp3NFVOWfnD3SBVVF0vsK?= =?us-ascii?q?kb8WC2z+5lykfHkDcIzy7aFhJcTh6YYh5HA/bg84fyEcXOSgDCbwj7iTAoGUtd?= =?us-ascii?q?JRixGMtN/Jbb+pIigYLq49xg77R3hhzgjemw5l8GQXTTW7998oPZizN8kjyCqp?= =?us-ascii?q?H2jbaVkN77hGsMv0r1ELSvU5ZUlmwGV53ciNXjcNS9DXG2Ypkggkbn1JcJBE6R?= =?us-ascii?q?8aEakkmCqHvqlC/gEJfTjVE4Wl+o/LncfL2HkwVslqxmPIpqKfgpMlzXxll8ly?= =?us-ascii?q?7iGQpHQYb/bYXNN0AnjvyodfzvTzZ/Szsu8dTotr07ChUOIfPcmi/mu2w49mWk?= =?us-ascii?q?i/xrQRB1C5KvMMxq/HUye5Tm2VQeaLfHaCnzY3Nk7//hepIUcxaMhUs08xKO3C?= =?us-ascii?q?iYBAlwf5S7N7Wj2QpUPHzGwkKe4aeAY2uICpegMUSO4RY/ORJfMpwP04CVsDc2?= =?us-ascii?q?XFHS1oBO+qqVSthpR0O2184UXmZuTg6gLmMNuSGxkcFo7aqp9x+eCkSW+aPH9g?= =?us-ascii?q?zQFyPFNq+OvFEFQxrOBceY6LndfMn9R7zfIFd/B1PC0hu94Tn5lu6ZWV0MiWch?= =?us-ascii?q?He0JLyKcvToveGH/3V114qdX1CUroFfQP14J03Pts4W73QHrtZug8RBaogT5wi?= =?us-ascii?q?MGfx8r97LAVpfg7Xeru0ntHgpviXaZtMu3/W8lUwIT/HtBIdzPy0URd2b4uuh3?= =?us-ascii?q?X1PJAwWixBoMNwBRd8G4tPAcwApRK9A5GIgKG7l8Ox+0Ritu8Er6XwDvHK1Myn?= =?us-ascii?q?0IhqXpla5EmLPDPPC6lxhkRqkP6+gvDa0pn+EcniY88LVPBnQm7Zbb/LBou+Ki?= =?us-ascii?q?qUOsL9Z0FJ7aWR0Ld4UhWNfiD2QbCKtCq+NPVr+U870JB3fPLPzDwx6LHWwNzy?= =?us-ascii?q?Z2VFqSq4tX6JMIFQ7EfWBezfQx1UVeCF/3h7EqENa4v76vsOO8Q4wNeA+wlz8C?= =?us-ascii?q?hC0MydLqilr0/M3F97dJ3CIEvt2iY5QpUKIA+kPEstm2DZrHPdDW5bLsi+Jsln?= =?us-ascii?q?mMyVAQD150lthWEtYXZMGnH2SteVOGgb3d++ZQKN+AxEE9YDn/C4eVQmua2qU+?= =?us-ascii?q?ZlIZZFlvuwtLUBj9lpLzrARNVVPy3KK792JDVRBP3VpFc0eh4Er6Q1WoAtaJiK?= =?us-ascii?q?IUMHK1uAxDjzzAvb1037bcag1KCXLyYK6n9H1a7K0SBQpwmlvvaUmsjjX6rFY5?= =?us-ascii?q?H2Xf7SNi0lWyqERTQzF0am51Oku/sCvPqFLmYTuFcUYjidCAQLvKBgscDQDnPP?= =?us-ascii?q?me1kZJAKhuqVWyP3SCJjj6cyGyBLtVyMQ/oECAnWYH/hgHZGtAykOPBM4Wrvb6?= =?us-ascii?q?eEyapNR+wWHoxMf+WWQ9TCYv9ePTYomSsdOOunYd3cq6w20knJTWsECaXI8kOR?= =?us-ascii?q?TFKOSPyG2z3rRZkVv5Qzuicw+NLQmyh3E77SP7aevD6j6Yi4gzydueLAV2kheU?= =?us-ascii?q?s1gPgNAGOZ2hlPNHkEC80JuEHqWqOPeURM1HUpieJowB8MfwJzX2Zh0n1Mgfa9?= =?us-ascii?q?BNNWSUQOgGOoXvIGcEh9DCks8k+S/g3yfdsAtNjIR29Q87sDVYsQIfoz5YnJJq?= =?us-ascii?q?QQ2vcp3TNhoCw8qSmdCU1Sjh6d+arKAK183qFC5XU///xuXEGPRDXfcmzcx4qj?= =?us-ascii?q?Fc1A2CluoXf+18XIoO9hLr1aqJ9lAARCPSUjPd3Z/DZcQUnoyQCyuFC9Bz3YLz?= =?us-ascii?q?UHsxgRIilQVO9wwvQzmx/SatvboReSqKkoslfxIRqaAbqznppQA4fm0hvuOnoD?= =?us-ascii?q?SimiC50j8qUFr90Ve65yINLmDg=3D=3D?= X-IPAS-Result: =?us-ascii?q?A2FwBADgQi9Y/wHyM5BeGwEBAQMBAQEJAQEBFgEBAQMBAQE?= =?us-ascii?q?JAQEBgwwBAQEBAR+BSBC7NCSCToVEUwEBAQEBAQEBAgECXyiCMxqCHAIEAQI3F?= =?us-ascii?q?CAOAwkBARcpCAgDAS0VEQ4LBRgEiEuuJCoCi06PLwIKBwGCaAuDCgWBJQGHKIc?= =?us-ascii?q?XRYofAoxchBYCggWBbIYnhg2RZlVdEQI4L4J5HBiBY1SGBw8XghYBAQE?= Received: from unknown (HELO tarius.tycho.ncsc.mil) ([144.51.242.1]) by emsm-gh1-uea10.nsa.gov with ESMTP; 18 Nov 2016 18:08:24 +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 uAII8M21004249; Fri, 18 Nov 2016 13:08:24 -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 uAII5pwp225056 for ; Fri, 18 Nov 2016 13:05:51 -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 uAII5o83004033 for ; Fri, 18 Nov 2016 13:05:51 -0500 From: James Carter To: selinux@tycho.nsa.gov Subject: [PATCH 2/2] policycoreutils: Add cil2conf which creates a policy.conf from CIL policy Date: Fri, 18 Nov 2016 13:05:28 -0500 Message-Id: <1479492328-12238-3-git-send-email-jwcart2@tycho.nsa.gov> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1479492328-12238-1-git-send-email-jwcart2@tycho.nsa.gov> References: <1479492328-12238-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 cil2conf 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 --- policycoreutils/Makefile | 2 +- policycoreutils/cil2conf/Makefile | 33 +++++++ policycoreutils/cil2conf/cil2conf.c | 192 ++++++++++++++++++++++++++++++++++++ 3 files changed, 226 insertions(+), 1 deletion(-) create mode 100644 policycoreutils/cil2conf/Makefile create mode 100644 policycoreutils/cil2conf/cil2conf.c diff --git a/policycoreutils/Makefile b/policycoreutils/Makefile index b930b29..b246e35 100644 --- a/policycoreutils/Makefile +++ b/policycoreutils/Makefile @@ -1,4 +1,4 @@ -SUBDIRS = setfiles load_policy newrole run_init secon sestatus semodule setsebool scripts po man hll +SUBDIRS = setfiles load_policy newrole run_init secon sestatus semodule setsebool scripts po man hll cil2conf all install relabel clean indent: @for subdir in $(SUBDIRS); do \ diff --git a/policycoreutils/cil2conf/Makefile b/policycoreutils/cil2conf/Makefile new file mode 100644 index 0000000..4098679 --- /dev/null +++ b/policycoreutils/cil2conf/Makefile @@ -0,0 +1,33 @@ +PREFIX ?= $(DESTDIR)/usr +BINDIR ?= $(PREFIX)/bin +MANDIR = $(PREFIX)/share/man +LIBDIR ?= $(PREFIX)/lib +INCLUDEDIR ?= $(PREFIX)/include + +LDLIBS = -lsepol -L$(LIBDIR) +CIL2CONF_SRCS = $(wildcard *.c) +CIL2CONF_OBJS = $(patsubst %.c,%.o,$(CIL2CONF_SRCS)) + +CFLAGS ?= -Wall -Wshadow -Wextra -Wundef -Wmissing-format-attribute -Wcast-align -Wstrict-prototypes -Wpointer-arith -Wunused + +override CFLAGS += -I$(INCLUDEDIR) + +all: cil2conf + +cil2conf: $(CIL2CONF_OBJS) + $(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS) + +%.o: %.c + $(CC) $(CFLAGS) -c -o $@ $^ + +install: all + -mkdir -p $(BINDDIR) + install -m 755 cil2conf $(BINDIR) + +relabel: + +clean: + -rm -f pp $(CIL2CONF_OBJS) + +indent: + ../../scripts/Lindent $(wildcard *.[ch]) diff --git a/policycoreutils/cil2conf/cil2conf.c b/policycoreutils/cil2conf/cil2conf.c new file mode 100644 index 0000000..ff564f0 --- /dev/null +++ b/policycoreutils/cil2conf/cil2conf.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; +}