From patchwork Tue Oct 17 16:33:28 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Cashman X-Patchwork-Id: 10012631 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 BFDF360211 for ; Tue, 17 Oct 2017 17:44:10 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id ADB1C289A5 for ; Tue, 17 Oct 2017 17:44:10 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id A21DA289B3; Tue, 17 Oct 2017 17:44:10 +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=-3.6 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_MED,RCVD_IN_SORBS_SPAM,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from USFB19PA15.eemsg.mail.mil (uphb19pa12.eemsg.mail.mil [214.24.26.86]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 34DC1289A5 for ; Tue, 17 Oct 2017 17:44:08 +0000 (UTC) Received: from emsm-gh1-uea10.ncsc.mil ([214.29.60.2]) by USFB19PA15.eemsg.mail.mil with ESMTP/TLS/AES256-SHA; 17 Oct 2017 17:44:07 +0000 X-IronPort-AV: E=Sophos;i="5.43,391,1503360000"; d="scan'208";a="4831705" IronPort-PHdr: =?us-ascii?q?9a23=3AZDjXiRTsGl4dG8pOxxH4L65UYtpsv+yvbD5Q0YIu?= =?us-ascii?q?jvd0So/mwa6/bBGBt8tkgFKBZ4jH8fUM07OQ7/i4HzVcqs/Y7DgrS99lb1c9k8?= =?us-ascii?q?IYnggtUoauKHbQC7rUVRE8B9lIT1R//nu2YgB/Ecf6YEDO8DXptWZBUhrwOhBo?= =?us-ascii?q?KevrB4Xck9q41/yo+53Ufg5EmCexbal9IRmqsQndrNQajIRtJqos1xfErWZDdv?= =?us-ascii?q?hLy29vOV+dhQv36N2q/J5k/SRQuvYh+NBFXK7nYak2TqFWASo/PWwt68LlqRfM?= =?us-ascii?q?TQ2U5nsBSWoWiQZHAxLE7B7hQJj8tDbxu/dn1ymbOc32Sq00WSin4qx2RhLklD?= =?us-ascii?q?sLOjgk+27ZkMxwiL9QrgynqRJx3oXYZJiZOOdicq/Ye94RWGhPUdtLVyFZAo2y?= =?us-ascii?q?cYUBAekGM+hFt4nwpUYCoBWgCgm3H+7j1iNEi2Xq0aAgz+gtDQfL1xEgEdIUt3?= =?us-ascii?q?TUqc34OqkIXuCzzanH0zHDZO5I1Djn84jIchUhruuKXbltdsfe1FUgGBnejlWQ?= =?us-ascii?q?rIzqJTWV2/8XvGid8uVgT+Wvi286pA1rvjevwcIsh5DPi4kIyV7E7T10zJs6KN?= =?us-ascii?q?C3UkJ2YcOoHIFOuyyVKYd6WN4uT3l2tComzrAKo522cSgQxJg52hLSZOaLfoiV?= =?us-ascii?q?7h/lSe2fOy13hGh/d7K6nxuy9E+gxfDiWcSsy1ZKqzZFksHLtnAQyxzf8siHRe?= =?us-ascii?q?V5/kemwTuPyxrc6vtFIUApjqrXMYIhw74smZoTtkTPBCn2l1ntjKCKbEkk/+mo?= =?us-ascii?q?6+D/brXnoJ+TKZN0hxnjPqkhlcGzG+Q1PhUUU2SF9umwyqfv8VDhTLVPlPI2k6?= =?us-ascii?q?3ZsJ7AJcQco660GxRV3Zgn6xa+CTemzdsZkWAcI1JCZRKHiZTmNE/VIP3jEfe+?= =?us-ascii?q?g0ijkDdsx/zcOL3hGY/CImLMkLfmY7Zx81RcxxYrzdBD+5JUDakMIPD0Wk/3rt?= =?us-ascii?q?PYEh85PBayw+v8CtV90YUeWWeVDa+CLKPdr0WI5vk1L+mLfo8Vty73K+I56P72?= =?us-ascii?q?kX85hVgdcLGr3ZsVcn+3AvdmI16eYXrqg9cBD3wHvgQ6TOz3h1yNSiNTZ3CuX6?= =?us-ascii?q?Ih/D07D5imDYjbTIC3nLOBxDu7HoFRZm1eElCDD2zneJuCW/cNdCKSJdRskj0a?= =?us-ascii?q?Wre/VYAtzxautBX1y7B/NOrb5jUYtY7/1Nhy/+DciBYy9TpyD8uAzW6NS2B0k3?= =?us-ascii?q?gSSDAoxqB/plZxylCZ0ah3m/ZYD8Bc5+tVUgcmMp7R1/F1C8zoVQLbZdqGVFGm?= =?us-ascii?q?QtC6Dj4rVdIx38UCY0BjFNW+lhrDxTalA6cJl7yXA5w56qPc337tJ8ljz3bJyq?= =?us-ascii?q?whgEc6QstVNWyrnal/9xDNCI7PlkWWjaeqdaAH0y7K+2aP122OvFtXUARoS6XK?= =?us-ascii?q?QWgfZlfKrdT+/k7DT76vCbMhMgZazM6CLrJGatzvjVlcQvfsIs7eY2Gwm2euGx?= =?us-ascii?q?mE3LWMY5T2e28FxiXSFFAEkxwP/XaBLQUxGD+hrHjEDDxvDlLieFvs/vNkqHO6?= =?us-ascii?q?VU801wWKYFd92LWr4BIVguacS/wL1LIepCghsyl0HEq639/OBduApg5hfKBCbt?= =?us-ascii?q?Mn+1pH23zWuBF6Ppy6Na9inkQecwN1v0zwyxp3Fp9Mkc8wrHMl1AByM76X0Etd?= =?us-ascii?q?dzOE2pD9IrPXKnPo8xCpd6HW20re3c2T+qcX6fQ0sk7jvQ+yFkY49HVnydZV2W?= =?us-ascii?q?OG5prWFAoSTY7xUkEv+hh5vb7aYS49557P2H1vK6a0sTjC288zCOsi0BagcM9V?= =?us-ascii?q?MLmYGw/qD80aG8+uJfQwlFe0dBIEPf5d9LQvMsy8a/SG3bSnPOF6nDKplW5H+p?= =?us-ascii?q?xy0lqQ9ypgTe7Fx4oKzOuc3gSZTDf8kFegssfslIBfeT4SH3SwyS74BI5QfKJ+?= =?us-ascii?q?Z4ALBnmyI8ev3NVxm4btW2JE9F6kH14GwtKmdgeJYlzy2A1R2l4boXq5liuk1z?= =?us-ascii?q?Z0iS0mrrKD3CzSxOTvbAEHOmBRRGllllfsPZO5j8scXEivYQkpkQGq5UDgy6hd?= =?us-ascii?q?uqt/M3HZQV1UcCjuM2FiTqywu6KMYsFV7JMorTtYUP6nYV2BVL7yvQEa3Dj+H2?= =?us-ascii?q?tb3jw7cCuquprhlRxglG2dNGpzrGbeecxo2RfQ+cHTRf9L0ToCXyR3lT7XBl2g?= =?us-ascii?q?MNaz5tWUi43PsuagWGK9TpdTazXkzZuctCun4m1nGQO/n/Gvld37Fgg6yzX32M?= =?us-ascii?q?VqVSXPqhb8bZLm16C7MeJhZEZoHlj859B9GoFknYs6nIsQ1mQChpWJ4XoHln/+?= =?us-ascii?q?MdFa2aLlcHoBXCULzMDR4Ajk3k1jM32IypniVnWFw8thYdi6bX8N2i4n6cBFFr?= =?us-ascii?q?uU5qRenSRpulq4sR7RYf9lkzcHzvsu7HoajP8TuAUxySWcDKsfHVJFPSPwjBSE?= =?us-ascii?q?9de+rL9YZGy3a7i/yFJ+ncy9DLGFugxcW2j2epE5HSJr7cVwLlTM0Gb16o76ZN?= =?us-ascii?q?ncd9UTtgebkx3YlehaNIoxluYWhSpgIW/9pWcqy/M/jRNwxZG1po6HK3lz86Kj?= =?us-ascii?q?GRNYKyb1aN0J+jH2l6pehcGW3521Hpp9BDoLUpzoTeinED0Mr/jnMRiBECEkoH?= =?us-ascii?q?eBBbXfBROf6Fthr3/XDZCrMWyYKWIHzdVkWRadJFZTgAYKUzUmhpQ5DBylxNT9?= =?us-ascii?q?cEdl4TAc/kb4pQFRyuJsLBTwTmbfpBuoazstRpiQNhxW4htF50fPPsyU9vhzED?= =?us-ascii?q?1A/p29sAyNLXSWZwdIDGENREOJHFXjPr6g5dnO7eeYGva+L/vJYbWLt+NSTfGI?= =?us-ascii?q?yoyz0oF+5TaDKt2PPmV+D/08wkdDU2p2G8LFmzUITiwajCzNYNCGqxe74C14tN?= =?us-ascii?q?i/8O7sWALt+4SAF6dSPc9o+xCsjqeJL/SQizphKTZEypMMwmfFyKIF0F8ckS1u?= =?us-ascii?q?ciOiEbAHtS/NV6/fgLNYDxsBZyN0LstI4Lo23hNRNs7DltP1yrl4g+Y7C1dfS1?= =?us-ascii?q?Puh9qpatYMI2GhM1PHH12GO66aKj3O2c33Zrm8SbJIhuVOqxKwoSqbE1PkPjmb?= =?us-ascii?q?kTnpTQqgMflUjCyAMhxeuZu9cg1xCWjtTdLmbAe0MNlrgj0327I0gmnGNWkGMT?= =?us-ascii?q?hza0lNtKGf7TtEgvVjHGxM9mFqIvKDlyad7unYMYoWseBxDiRvie1V/G42y6BL?= =?us-ascii?q?4yFARfx1njbSr9F1rl66kuiP0CdnUAFUpjdFno2LoV5iOaLf9pVaXnbE5h0N53?= =?us-ascii?q?2KCxsWv9tlFsHvu6dIx9jJlaLzLDNC/MzP/cYHHcfbNtiHMH07PRruAj7UAxMP?= =?us-ascii?q?TSS3OmHHm0xdjPaS+2WOoZg7pZjsn5wOR6RGW1MrDfwaC15qHNoYLJdwRDMknq?= =?us-ascii?q?aRjNQU6nqmsBnRWMJas4jdWfKdG/rvNiiWgKJDZxsQ37z4K4ETOZf620xmcVZ6?= =?us-ascii?q?m4vLF1DXXdBXrS1rdhU0r1lV8HhiUm0z3Froah+q4H8WD/K0hBk2iwpgbuQr7z?= =?us-ascii?q?js+VA3KUTJpCYrjEYxntDljiyLfz7qMKe8R4dWBDTot0IpKJP0Xx51bRGunUxj?= =?us-ascii?q?LDrEQaxegKFkdW1wiw/cvoBPGeJGQq1Cex8QxvCXa+8u0VtCtiWt3VVH6vfdCZ?= =?us-ascii?q?t+iAsqdoahr2he1AJ4ctE6P7bQK7ZJzlVLna2OvzWo2f02wA8QP0YN6n2deS4S?= =?us-ascii?q?tEwOKLYmOzKi/vZw5gyahztDZG8MWuI3rf1w6EM9OvmPzzn73rFZMECxLeufLq?= =?us-ascii?q?2Cu2feicGIX0kw1kIUl0hF57R219ksc1aMXUA10LSRDwgJNdbFKQxNa8pS82LT?= =?us-ascii?q?cjiIseTMxpJ4JIq9Fub1TeOUs6YUmE2kFh4zH4sQ9sQBAoWs0EbAIMf8MrEFzR?= =?us-ascii?q?Qt5AL2JFSKF/lGZBWLkDIbrM6l1593wZNRJjcDDmVhKS+3/KrYphc2gPqfW9c7?= =?us-ascii?q?emoVUZcBNnIxXs26hzNVsm9eDDapyOIZyQmD7zj6pijKCjnzccZjbu+OZRxwEN?= =?us-ascii?q?G25Sk/86+uhF7L85XeImb6Nchiut7P8u4VupeHCvNOQrZmqUvcnZdXR2CyWW7V?= =?us-ascii?q?DdG1P4Twa5UrbdHsBXa6SEawizQpT8rqPdatKaaJgQf0RYZUroab3TYjNdOjGT?= =?us-ascii?q?EEARtwof8M5L5kbw0Zf5U7eQLotxg5N6GnOgiY1tSuTHqzJjROSvlezeO6Z7tR?= =?us-ascii?q?zyU2deK103ogQYs8z+Wu/04NWYsGjhfAyva/f4NeSzT8GmRBewXToio0j3NuOf?= =?us-ascii?q?g0wuok2hzHrEccPC6RdOxycmNEpdE9CUmVIXVsBWoyX0Wcgpbb4g6ww7AS+DNQ?= =?us-ascii?q?n8xS0e1ErHf+vpjfYDa3WKKzsJvbrjAuYMQhraBqLYPjJc6Gu4/EkTzEUJncqA?= =?us-ascii?q?uFXzCmF/BCgNhfPDpYQOVUmWEiIcEJpYhB5lAtWcolO7NPD60sprSraTV6Fy4S?= =?us-ascii?q?0TEWWJ+A3DAYhee8wbTanA+KcJs+KBwErIlCgtwFXi5seCwevqijWJ7Nmm+YUG?= =?us-ascii?q?gEOhkT4hpI5AIBkI9wceTl4IvHTJ9M1z5Wreh7UjHOFpVy8Vv0VH2Wi0DiSPq9?= =?us-ascii?q?i+ypwR5SzPX039gVQhJwFUhdx+dTlkspMr53KLIdvo/UvTCWa0z2pmXtyPGpJF?= =?us-ascii?q?NJ083ba0X4DJbZtWr7SiAc4XoURYtVx3HFG5USlA55aKgwqVVJJ4CmfV3+6CI4?= =?us-ascii?q?yIRzGLm4Tturx1cjrXYJXSuqFMBBC+5+ulLNRDJle4yrqIniO5hKWGBQ4oCdq1?= =?us-ascii?q?FDnEVuKCO5yJtcK8BR4jEXRjRPpyuSvMeqQs1ZxcB2F4MMIst4u3rlBKNEP52R?= =?us-ascii?q?rmYqurDzz3/W4CowsFGkyzWvA6W4Vf5W/3UCGgU1IGSTskkvAPE28mjI9lDCr0?= =?us-ascii?q?t58PpFCbiXlUV+vjJ9EY5UBjpT0nClNVtzRmFcs+pGMKTVb9BcQ/4qaB+tPBwx?= =?us-ascii?q?C+Ur0FGX8kFvg3j5eTByuRVH9CzHWQk7SzUViK/3mTICssGnJSMaS5VQYDo6YS?= =?us-ascii?q?fKNx6XlCJKsBtRcExlR5cZAtNZ9L4BxotU4tDOSUCyJiEZRBZiLB430eJDlU5f?= =?us-ascii?q?t0WVYTrdAhS1evbPqBJ3YdycrMquLPTn4ghLlJ/osOcl+KodXXGmnxOiQczGpY?= =?us-ascii?q?/mqtKKrleOdLv/M+CkeX/BVyTMggqtirc4FJTK5C/TMBdBK5Zm13UkZ4ThCXTR?= =?us-ascii?q?MhRCPa4bIFBbVa9iY9Vcvu9af9NkeLoO+aJ1GhKHXA3gF5Kyo/RdM1bTQSjeLz?= =?us-ascii?q?+b/eyhoILT6rjdRvb8ZsCWwHbHWa13NI9g6TbnA7fqzZNe+k3u1/do7Ex6TVzG?= =?us-ascii?q?PD6drNT9PAwE/tKvdk38sZ01BjPZHI1/kGLzyU1accoYXTGq+owCyJxF8HbwVf?= =?us-ascii?q?540k/rve1Q7bZk844346ttyciuO6ffMvFasVJjAhiIBwVl6pQtD3J5R2BKeOMR?= =?us-ascii?q?L+3RfasBh8D0t+/3D7AX6AGS++FBa9vIPUfBmselCjGbVBNLghwMqSIAIQuazP?= =?us-ascii?q?6FnLV4ScC7qujlwkgt+USxLgYazLBx4oeJ4qWIpPLWbxvVybgLRK3qS9juobsy?= =?us-ascii?q?oEyS5OcrlLgUdmxyeQ2nH/AXVtQByWf40aAq0SUsHtvFH7Lk4/NDVnQ5njf6l5?= =?us-ascii?q?B8GVUWFOkUEqCQ/YRChGc4hvDWNsELcqBYhGmDDxmkEqUNyXSz8SuYPHFlgg3S?= =?us-ascii?q?0xH3WW6z6Vj2rSlkQSvD0djuiU9VVritCkdUQSWpJUF5sDSVPArrr9r7o6I141?= =?us-ascii?q?8qMmb8rtKCiHOhOK9LH834PNGcJTI0pFcXgZAqSNygx50UGd2nINgL6HF+dPze?= =?us-ascii?q?62G1nCBdv6dLnY3e4tua+v/PB3mvk7Waq6mRxDBf0nU4v1A/6tW7O/HL+dKLQ+?= =?us-ascii?q?qn13wQTyd5tAvNRRi1paLHr1oMI0yEzF/LmJAWPtFexXQ410Dn6/I5T90v7whe?= =?us-ascii?q?DZjPZ+8cqj/vIjf0xkyfY90vXCmEzzRXBk71EUV/GKUkw23wvdnJlHnK9F0qR4?= =?us-ascii?q?lwa1TnigZqD4U8Mk8i9F8XzTcdHgcXdBCbFraoBV7/IoceUkgDcxuH1qCgeqgr?= =?us-ascii?q?xU1z3q+v5OjLYOxkHaUNKupSjg6AnVhcAJIWsrQSQKlidF9Z9a7XoBXiCof8Uv?= =?us-ascii?q?j+j3UwKeG6QsBU8MAerXsi4RyzRxm+5pdZ6bYUlpSIerRDYZjWs8B2911n6iIX?= =?us-ascii?q?dixRnBh/iAu0UfwGpO/95tjUqpyo5fi1WakwRuUX+Bk0B3hkgJvrml8ju8zX2/?= =?us-ascii?q?1aSoLLlYT16BpNLGKSuIbGzxl8LvIDK42xc7Z66XoHOygeKmkKPdqXd/kz/S9t?= =?us-ascii?q?Py/O51xZGM8MY80XPNbVkwBOlkLpQK1T9tbcGlKABId8acYo73bwyDAy9pc8Sf?= =?us-ascii?q?jv6Du3JZDZ8lFMMOhOjCFym9LYpOka2+DeCC4J7nmFcxJ12D+Ny4GRC/bs+uWB?= =?us-ascii?q?0NfUV1IaES4xV4dSPiGC9RamRuqyk5XpSRiU59T2gJ8xe0OcXHuxnL4KsqxUC+?= =?us-ascii?q?5Plj373iRCFoDyn/+VvMaj6HBMtlFeDYh94hvLGKRZPpVmNhX1jcarRk1mCSv5?= =?us-ascii?q?Zs7YbB0uuPCZxu0U+eVxK1P+ZZMHIhID07/6631VTgtoSLLsolmZXeYRZMZ7R/?= =?us-ascii?q?LFr3BV75lgK6wOPFWGupzqrylIp0oyAAA0ab88tDpaeVfSnAdNQab7pKYAihcA?= =?us-ascii?q?Ud5+oUJMGHywN3g45zfcUaRVkbSeCP0S8jWIVKAOVF9oMixmSROvxJpuY6epne?= =?us-ascii?q?xAsm5enCNyvvYq0zJiRBantyzjvaQN1iw8+L2isjUOp2BFRP2EkyjUEVVD0OgK?= =?us-ascii?q?jaAEBnbt7Vy8Z3cCY5X24LljPsng7o4h43I+YRo/ZSEGW/qvCz3ohaOSHoOPqM?= =?us-ascii?q?5chAKKuMjWb7+zLSgTNqw6yRLnRnh9zhbRkQ1t8GsKXjWg9sErKJ+6OcY/ySqi?= =?us-ascii?q?AXLbe0oU4qNVrMvxskYGTPc3aVNk22hjzsmHSTEORMPRH2Y5lA4kZntYcJhb8x?= =?us-ascii?q?8VC7EogiqUvqlB5gwUZTbUEoem+onXhsrI22MyTdRtxmLQuKKFgIkm0Ht7lNNo?= =?us-ascii?q?9iSOomgdd/TEU89wBXj+zpxQxvL4Z/Wxqe0HU49myLO9UP8eLMms53a51I9tWk?= =?us-ascii?q?+/ybQUB0C5P/MbxrfHTyelTnWVWeqVfGiInjY5KlD96AKpL102bcdKqlEyMvHG?= =?us-ascii?q?hpFCjQHhVql0RiqIr1/B0GMjKf8adx4xuIq/dQ0KVPQRZ+mAKucw2/A+DVoMb2?= =?us-ascii?q?PTHSRoEeO2tkStnIdjMXV6/Ur6efjt8hzhMNaKHRkEFZDVo4Vp+fy+XG2BImNg?= =?us-ascii?q?zBxuM0lo7efQCUo+uvVac5mPgdjan8573vIdd/dxLS09vcYemoZi6YmSzceLfg?= =?us-ascii?q?jdzpLzJdHOvviYGObSz0UwdWFcVboVewT15581PtQhQb3cAaNZvQgABag9WJEh?= =?us-ascii?q?LHn+9KV1LAN1bw7Qa7O4jMb2puKLeJRUvWHZ7koqIyrHuB0M1Oa0TQplYJCunH?= =?us-ascii?q?ryPZ8wSihGr913BRtsBJFPFN8Yrwq7H56Un7m2i9qr9Exmu+8KsKzwCvfR2dSn?= =?us-ascii?q?3oVxWYZV5UiKPDbXGalqjV5pjuOogvfPypPxE9/tecsYVOhnRW7Icr3GEZ+8Kj?= =?us-ascii?q?KJIc3xYFNG87iA0LJ5VRWReS/5X6qatCG+MvVr/1k7wJRifOXP1Dwt863b2Nzq?= =?us-ascii?q?amFZoyejqmSJNIFe7FzRHuHeWQhbSf+b/2ZkB6EXapH09OgWO9w43Nec+xVz7C?= =?us-ascii?q?hF0MadOKihoErM1V56eJ/YN0bpxTg2WZMLIBW+Nkssh3XVqnLDDnRAfYCYLpx2?= =?us-ascii?q?jdKUCAH9z1VgkmEqIGhaEyznQsnVcXMXwOqidQaK80RNFN9FkOmpKmAisajnZe?= =?us-ascii?q?BuO5hB0c6jr7UCmNAhfy3ETdNaOijWBLZwMiBWD+mJr18tNE1X+4MpU5s4MMDd?= =?us-ascii?q?aHgMN12NnGarlQY=3D?= X-IPAS-Result: =?us-ascii?q?A2DZAACeQOZZ/wHyM5BcGgEBAQECAQEBAQgBAQEBFQEBAQE?= =?us-ascii?q?CAQEBAQgBAQEBgwgpA4FSJ44ZdI5DmCuBNQNYDhiKET8YAQEBAQEBAQEBAQFqK?= =?us-ascii?q?II4JIJJAiQZAQE3AQIDCQIfKQgDATABBQEjEgWISIFQA516QIshglg6gwgBAQW?= =?us-ascii?q?IVQgSgxyBNlGBRwqBao4EIIodgiSGHY5yi0GJHYtih0NIlHsCBAIJAgYUJIEVH?= =?us-ascii?q?zhPgQo0IQgdFYMtggxBDgEcggdWiDwsghYBAQE?= Received: from tarius.tycho.ncsc.mil ([144.51.242.1]) by EMSM-GH1-UEA10.NCSC.MIL with ESMTP; 17 Oct 2017 17:42:29 +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 v9HHduKi025721; Tue, 17 Oct 2017 13:40:49 -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 v9HHdYdB045792 for ; Tue, 17 Oct 2017 13:39:34 -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 v9HHdWJ0025686 for ; Tue, 17 Oct 2017 13:39:34 -0400 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A1CSAABYPeZZfyQbGNZcGgEBAQECAQEBA?= =?us-ascii?q?QgBAQEBgzMpgVUnjhmPN5grgTUDXAoThSiEbj8YAQIBAQEBAQEBEwEBCxaGKBk?= =?us-ascii?q?BATcBL2UBBQEjEohNgVADnXFAiyGCWDqDCAEBBYgrAQEIIAgSgxyBNlGBRwqBa?= =?us-ascii?q?o4EIIodgiSGHY5yi0GJHYtih0NIlHsCBAIJAgYUJIEVH4EHgQo0IQgdFYMtgk0?= =?us-ascii?q?OARwZgW5WiDwsghYBAQE?= X-IPAS-Result: =?us-ascii?q?A1CSAABYPeZZfyQbGNZcGgEBAQECAQEBAQgBAQEBgzMpgVU?= =?us-ascii?q?njhmPN5grgTUDXAoThSiEbj8YAQIBAQEBAQEBEwEBCxaGKBkBATcBL2UBBQEjE?= =?us-ascii?q?ohNgVADnXFAiyGCWDqDCAEBBYgrAQEIIAgSgxyBNlGBRwqBao4EIIodgiSGHY5?= =?us-ascii?q?yi0GJHYtih0NIlHsCBAIJAgYUJIEVH4EHgQo0IQgdFYMtgk0OARwZgW5WiDwsg?= =?us-ascii?q?hYBAQE?= X-IronPort-AV: E=Sophos;i="5.43,391,1503374400"; d="scan'208";a="86573" Received: from emsm-gh1-uea10.ncsc.mil ([214.29.60.34]) by goalie.tycho.ncsc.mil with ESMTP; 17 Oct 2017 13:39:21 -0400 IronPort-PHdr: =?us-ascii?q?9a23=3AQ86MCh9gG2w7df9uRHKM819IXTAuvvDOBiVQ1KB4?= =?us-ascii?q?2ukcTK2v8tzYMVDF4r011RmVBd2dsq4P0rOK+4nbGkU4qa6bt34DdJEeHzQksu?= =?us-ascii?q?4x2zIaPcieFEfgJ+TrZSFpVO5LVVti4m3peRMNQJW2aFLduGC94iAPERvjKwV1?= =?us-ascii?q?Ov71GonPhMiryuy+4ZLebxlUiDanfL9/Ixq6oRjMusQZnIBvNrs/xhzVr3VSZu?= =?us-ascii?q?9Y33loJVWdnxb94se/4ptu+DlOtvwi6sBNT7z0c7w3QrJEAjsmNXs15NDwuhnY?= =?us-ascii?q?UQSP/HocXX4InRdOHgPI8Qv1Xpb1siv9q+p9xCyXNtD4QLwoRTiv6bpgRQT2gy?= =?us-ascii?q?kbKTE27GDXitRxjK1FphKhuwd/yJPQbI2MKfZyYr/RcdYcSGFcXMheSjZBD5uh?= =?us-ascii?q?YYUPEeQPM+VWoY7mqlcSsRezHxWgCfnzxjNUgHL9wK000/4mEQHDxAEuEcgBsH?= =?us-ascii?q?LVrNrrMKcZTP64w7PTzTXDavNZwzH945XPfx88vf6DR6lwccrUyUY1EQPIlU+f?= =?us-ascii?q?qYr4MDOP0eQNsnWU4/B8WuKojm4qsgd8qSWsyMc0koTFmJ8Zx1/e+Slnz4s5P8?= =?us-ascii?q?O0RUxhbdOqEZZcrz+WO5dyT884QGxluDw2xqMbtZO0ZiQHyIkryhjCYPKdaYeI?= =?us-ascii?q?+AjsVOOJLDd4mn1lfLW/ig6v8Ui40eLzS9S43VJSriVfjtXBuGoB2ALN5ciCUf?= =?us-ascii?q?t98V2t2TOV2ADS7uFIO0U0lavfK5I5w74wkIQcsVjbEyPohUn7g7Waelsr9+Sy?= =?us-ascii?q?9ejqYK/qq5GdOoNsjwHxKKUumsixAeQiNQgOWnCW9vmg27L55k35QLBKgecwkq?= =?us-ascii?q?TCqp/aI9kUprS+Aw9Uz4kv8QqwDzCj0NgAh3kIMEpFeA6bj4juI1zOO+73DfO+?= =?us-ascii?q?g1SqjTdqyOvLPqHhA5rRLnjDl63tfbBm60FG0gYzwtdf54wHQo0Gden+Xk73qc?= =?us-ascii?q?zwEg4yMwvyxf3uTtp6yMdWQm6UKrOIO6PV91mT76QgJPffSpUSvWPRIv4k6vqm?= =?us-ascii?q?pnYimVoUe+H90ZAec3C9F/JOKkOVe33tjpEKFmJc7Vl2d/DjlFDXCW0bXH21Ra?= =?us-ascii?q?9po2hjUI8=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0CYAAB5P+ZZfyQbGNZcGwEBAQMBAQEJA?= =?us-ascii?q?QEBFgEBAQMBAQEJAQEBgwgpgVUnjhmPN5grgTUDXAoThSiEbj8YAQEBAQEBAQE?= =?us-ascii?q?BAQESAQELFl2COCQBgm4ZAQE3AS9lAQUBIxKITYFQA51xQIshglg6gwgBAQWIK?= =?us-ascii?q?wEBCCAIEoMcgTZRgUcKgWqLBgyCciCKHYIkhh2OcotBiR2LYodDSJR7AgQCCQI?= =?us-ascii?q?GFCSBFR+BB4EKNCEIHRWDLYJNDgEcGYFuVog8LIIWAQEB?= X-IPAS-Result: =?us-ascii?q?A0CYAAB5P+ZZfyQbGNZcGwEBAQMBAQEJAQEBFgEBAQMBAQE?= =?us-ascii?q?JAQEBgwgpgVUnjhmPN5grgTUDXAoThSiEbj8YAQEBAQEBAQEBAQESAQELFl2CO?= =?us-ascii?q?CQBgm4ZAQE3AS9lAQUBIxKITYFQA51xQIshglg6gwgBAQWIKwEBCCAIEoMcgTZ?= =?us-ascii?q?RgUcKgWqLBgyCciCKHYIkhh2OcotBiR2LYodDSJR7AgQCCQIGFCSBFR+BB4EKN?= =?us-ascii?q?CEIHRWDLYJNDgEcGYFuVog8LIIWAQEB?= X-IronPort-AV: E=Sophos;i="5.43,391,1503360000"; d="scan'208";a="4831561" X-IronPort-Outbreak-Status: No, level 0, Unknown - Unknown Received: from upbd19pa03.eemsg.mail.mil ([214.24.27.36]) by EMSM-GH1-UEA10.NCSC.MIL with ESMTP; 17 Oct 2017 17:39:12 +0000 X-EEMSG-check-005: 0 X-EEMSG-check-006: 000-001;2a33a327-1d2d-44d1-8b64-286fcd39f35d Received: from localhost.localdomain (localhost [127.0.0.1]) by UPDCF3IC02.oob.disa.mil (Postfix) with SMTP id 3yGhbR3DjTz2Sj6F for ; Tue, 17 Oct 2017 17:13:07 +0000 (UTC) Received: from UPDC3CPA06.eemsg.mil (unknown [192.168.18.13]) by UPDCF3IC02.oob.disa.mil (Postfix) with ESMTP id 3yGhbR2HCXz2Sj6C for ; Tue, 17 Oct 2017 17:13:07 +0000 (UTC) Authentication-Results: UPDC3CPA06.eemsg.mail.mil; dkim=pass (signature verified) header.i=@android.com X-EEMSG-check-008: 84092472|UPDC3CPA06_EEMSG_MP22.csd.disa.mil X-EEMSG-SBRS: 2.7 X-EEMSG-ORIG-IP: 209.85.214.51 X-EEMSG-check-002: true X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A0BTAABZOeZZfzPWVdFdGgEBAQECAQEBAQgBAQEBgzOCJY4ZjzeYK4E1A1wKE4UohG4/GAECAQEBAQEBARMBAQkLCwgmMYVLGQEBNwEvZQEFASMSiE2BUJ10QIshglg6gwgBAQWIKwEBCCAICQEIgxyBNlGBRwqBaosGDIJyIIodgiSGHY5yi0GJHYtih0NIlHsCBAIJAgYUJIEVH4EHgQo0IQgdFYMtgk0OARyCByA2iDwsghYBAQE X-IPAS-Result: A0BTAABZOeZZfzPWVdFdGgEBAQECAQEBAQgBAQEBgzOCJY4ZjzeYK4E1A1wKE4UohG4/GAECAQEBAQEBARMBAQkLCwgmMYVLGQEBNwEvZQEFASMSiE2BUJ10QIshglg6gwgBAQWIKwEBCCAICQEIgxyBNlGBRwqBaosGDIJyIIodgiSGHY5yi0GJHYtih0NIlHsCBAIJAgYUJIEVH4EHgQo0IQgdFYMtgk0OARyCByA2iDwsghYBAQE Received: from mail-it0-f51.google.com ([209.85.214.51]) by UPDC3CPA06.eemsg.mail.mil with ESMTP; 17 Oct 2017 16:33:35 +0000 Received: by mail-it0-f51.google.com with SMTP id j140so3093112itj.1 for ; Tue, 17 Oct 2017 09:33:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=android.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=ZRmPegItpqJju5z/JQugvRvTJ88dHoPFhD67nVC4GDE=; b=Qk2jGL7FQyiSa6iEan/RSDV4KXuNcMEYMgvFvHwjlPSKkXa+1YUmoeAgUQOII4lXaR 6Va9UHh9DXimsv7vkz60SEnq4p9gLKmSwBUukATSnvo290st1PNmecPsW/PSpWcy/sxb pZEr/j5CW23y9oz3p/Yh69h/m1J/4q2jG1BlB0VjDyXryx6c/akiIwvgltfaZ4oQnAtu vif0x3jTBE25ez1tsM2AL9TycQNuCP5zO3jid2burRj9VV7acqd9hLddKHJfx504zaK8 /AthgYQHAk6THB22E29ADEQWgO1LjhpY1Y9YVoz3wtWHcAR34pIOL1rbiuNWgtV8qOxV 61Pw== 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; bh=ZRmPegItpqJju5z/JQugvRvTJ88dHoPFhD67nVC4GDE=; b=i9aVNWLrxIC3rsbmqizYRD7zeNkufJgDgXrbASsDF3WVcsR4mM4E8vEJroQI3Acl8o RBTZ+GNOKmnZd1EFujMhsMCEPHqLIdxH9xDEgDnJ06EEiNq08DvUwrVYcmj/A+w2l6uC vxzTw/18h7KXXMCSEbi+Y0YB3DSDaJ/qlJnlDHefdkYd6jRY2QHHJIBGNJ1GBk5/V0Ab rJOm4CL6cZuGywhhrfx6WtftOM2YJokgWMvM+SZzudYvlZkGoefiCKkDLk/NUcNvsRfP aKJZ7NbMbnhx4WVnGzX1OkfshKL25A7cxXJ+IWa/UVF40U9q97LR8azhK0Pa35sMqFk/ nJGA== X-Gm-Message-State: AMCzsaVfJJYRXWM4jc6L9bXIHVG9RZ/LaJLESViT72Qwn+XoGRH3pgD2 BGyYdvQCmh6E59XmbXUgY60Pge1XH10= X-Google-Smtp-Source: ABhQp+RbiPwgT47nRldThi8eKmUlU/fIEjqxzlNtVYulDG4O4Xo7KeyUvOa3HuSD1tBJDgeH739VaA== X-Received: by 10.36.91.138 with SMTP id g132mr6123361itb.33.1508258013954; Tue, 17 Oct 2017 09:33:33 -0700 (PDT) Received: from dcashman2.mtv.corp.google.com ([172.22.112.71]) by smtp.gmail.com with ESMTPSA id n4sm5073017ioe.71.2017.10.17.09.33.32 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 17 Oct 2017 09:33:33 -0700 (PDT) X-EEMSG-check-009: 444-444 From: Daniel Cashman To: selinux@tycho.nsa.gov, sds@tycho.nsa.gov Date: Tue, 17 Oct 2017 09:33:28 -0700 Message-Id: <20171017163328.117702-1-dcashman@android.com> X-Mailer: git-send-email 2.15.0.rc0.271.g36b669edcc-goog Subject: [PATCH v3] selinux: libselinux: Enable multiple input files to selabel_open. X-BeenThere: selinux@tycho.nsa.gov X-Mailman-Version: 2.1.21 Precedence: list List-Id: "Security-Enhanced Linux \(SELinux\) mailing list" List-Post: List-Help: Cc: jwcart@tycho.nsa.gov, dcashman@google.com Errors-To: selinux-bounces@tycho.nsa.gov Sender: "Selinux" X-Virus-Scanned: ClamAV using ClamSMTP From: Dan Cashman The file_contexts labeling backend, specified in label_file.c, currently assumes that only one path will be specified as an option to selabel_open(). The split of platform and non-platform policy on device, however, will necessitate the loading of two disparate policy files. Rather than combining the files and then calling the existing API on a newly-formed file, just add the ability to specify multiple files to use. Order of opt specification to selabel_open matters. This corresponds to AOSP commit 50400d38203e4db08314168e60c281cc61a717a8, which lead to a fork with upstream, which we'd like to correct. Signed-off-by: Dan Cashman --- libselinux/src/label.c | 21 +++++--- libselinux/src/label_db.c | 13 ++++- libselinux/src/label_file.c | 104 +++++++++++++++++++++++++++++----------- libselinux/src/label_internal.h | 5 +- libselinux/src/label_media.c | 10 +++- libselinux/src/label_x.c | 10 +++- 6 files changed, 124 insertions(+), 39 deletions(-) diff --git a/libselinux/src/label.c b/libselinux/src/label.c index 48f4d2d6..0dfa054c 100644 --- a/libselinux/src/label.c +++ b/libselinux/src/label.c @@ -143,7 +143,11 @@ static int selabel_fini(struct selabel_handle *rec, struct selabel_lookup_rec *lr, int translating) { - if (compat_validate(rec, lr, rec->spec_file, 0)) + char *path = NULL; + + if (rec->spec_files) + path = rec->spec_files[0]; + if (compat_validate(rec, lr, path, 0)) return -1; if (translating && !lr->ctx_trans && @@ -226,11 +230,9 @@ struct selabel_handle *selabel_open(unsigned int backend, rec->digest = selabel_is_digest_set(opts, nopts, rec->digest); if ((*initfuncs[backend])(rec, opts, nopts)) { - free(rec->spec_file); - free(rec); + selabel_close(rec); rec = NULL; } - out: return rec; } @@ -337,10 +339,17 @@ int selabel_digest(struct selabel_handle *rec, void selabel_close(struct selabel_handle *rec) { + size_t i; + + if (rec->spec_files) { + for (i = 0; i < rec->spec_files_len; i++) + free(rec->spec_files[i]); + free(rec->spec_files); + } if (rec->digest) selabel_digest_fini(rec->digest); - rec->func_close(rec); - free(rec->spec_file); + if (rec->func_close) + rec->func_close(rec); free(rec); } diff --git a/libselinux/src/label_db.c b/libselinux/src/label_db.c index c46d0a1d..9a35abea 100644 --- a/libselinux/src/label_db.c +++ b/libselinux/src/label_db.c @@ -290,7 +290,18 @@ db_init(const struct selinux_opt *opts, unsigned nopts, errno = EINVAL; return NULL; } - rec->spec_file = strdup(path); + rec->spec_files_len = 1; + rec->spec_files = calloc(rec->spec_files_len, sizeof(rec->spec_files[0])); + if (!rec->spec_files) { + free(catalog); + return NULL; + } + rec->spec_files[0] = strdup(path); + if (!rec->spec_files[0]) { + free(catalog); + free(rec->spec_files); + return NULL; + } /* * Parse for each lines diff --git a/libselinux/src/label_file.c b/libselinux/src/label_file.c index 560d8c3d..b3b36bc2 100644 --- a/libselinux/src/label_file.c +++ b/libselinux/src/label_file.c @@ -709,28 +709,61 @@ static int init(struct selabel_handle *rec, const struct selinux_opt *opts, unsigned n) { struct saved_data *data = (struct saved_data *)rec->data; - const char *path = NULL; + size_t num_paths = 0; + char **path = NULL; const char *prefix = NULL; - int status = -1, baseonly = 0; + int status = -1; + size_t i; + bool baseonly = false; + bool path_provided; /* Process arguments */ - while (n--) - switch(opts[n].type) { + i = n; + while (i--) + switch(opts[i].type) { case SELABEL_OPT_PATH: - path = opts[n].value; + num_paths++; break; case SELABEL_OPT_SUBSET: - prefix = opts[n].value; + prefix = opts[i].value; break; case SELABEL_OPT_BASEONLY: - baseonly = !!opts[n].value; + baseonly = !!opts[i].value; break; } + if (!num_paths) { + num_paths = 1; + path_provided = false; + } else { + path_provided = true; + } + + path = calloc(num_paths, sizeof(*path)); + if (path == NULL) { + goto finish; + } + rec->spec_files = path; + rec->spec_files_len = num_paths; + + if (path_provided) { + for (i = 0; i < n; i++) { + switch(opts[i].type) { + case SELABEL_OPT_PATH: + *path = strdup(opts[i].value); + if (*path == NULL) + goto finish; + path++; + break; + default: + break; + } + } + } #if !defined(BUILD_HOST) && !defined(ANDROID) char subs_file[PATH_MAX + 1]; /* Process local and distribution substitution files */ - if (!path) { + if (!path_provided) { status = selabel_subs_init( selinux_file_context_subs_dist_path(), rec->digest, &data->dist_subs); @@ -740,43 +773,52 @@ static int init(struct selabel_handle *rec, const struct selinux_opt *opts, rec->digest, &data->subs); if (status) goto finish; - path = selinux_file_context_path(); + rec->spec_files[0] = strdup(selinux_file_context_path()); + if (rec->spec_files[0] == NULL) + goto finish; } else { - snprintf(subs_file, sizeof(subs_file), "%s.subs_dist", path); - status = selabel_subs_init(subs_file, rec->digest, + for (i = 0; i < num_paths; i++) { + snprintf(subs_file, sizeof(subs_file), "%s.subs_dist", rec->spec_files[i]); + status = selabel_subs_init(subs_file, rec->digest, &data->dist_subs); - if (status) - goto finish; - snprintf(subs_file, sizeof(subs_file), "%s.subs", path); - status = selabel_subs_init(subs_file, rec->digest, + if (status) + goto finish; + snprintf(subs_file, sizeof(subs_file), "%s.subs", rec->spec_files[i]); + status = selabel_subs_init(subs_file, rec->digest, &data->subs); - if (status) - goto finish; + if (status) + goto finish; + } + } +#else + if (!path_provided) { + selinux_log(SELINUX_ERROR, "No path given to file labeling backend\n"); + goto finish; } - #endif - rec->spec_file = strdup(path); /* - * The do detailed validation of the input and fill the spec array + * Do detailed validation of the input and fill the spec array */ - status = process_file(path, NULL, rec, prefix, rec->digest); - if (status) - goto finish; - - if (rec->validating) { - status = nodups_specs(data, path); + for (i = 0; i < num_paths; i++) { + status = process_file(rec->spec_files[i], NULL, rec, prefix, rec->digest); if (status) goto finish; + + if (rec->validating) { + status = nodups_specs(data, rec->spec_files[i]); + if (status) + goto finish; + } } if (!baseonly) { - status = process_file(path, "homedirs", rec, prefix, + status = process_file(rec->spec_files[0], "homedirs", rec, prefix, rec->digest); if (status && errno != ENOENT) goto finish; - status = process_file(path, "local", rec, prefix, + status = process_file(rec->spec_files[0], "local", rec, prefix, rec->digest); if (status && errno != ENOENT) goto finish; @@ -804,6 +846,12 @@ static void closef(struct selabel_handle *rec) struct stem *stem; unsigned int i; + if (!data) + return; + + /* make sure successive ->func_close() calls are harmless */ + rec->data = NULL; + selabel_subs_fini(data->subs); selabel_subs_fini(data->dist_subs); diff --git a/libselinux/src/label_internal.h b/libselinux/src/label_internal.h index c55efb75..43b63513 100644 --- a/libselinux/src/label_internal.h +++ b/libselinux/src/label_internal.h @@ -98,10 +98,11 @@ struct selabel_handle { void *data; /* - * The main spec file used. Note for file contexts the local and/or + * The main spec file(s) used. Note for file contexts the local and/or * homedirs could also have been used to resolve a context. */ - char *spec_file; + size_t spec_files_len; + char **spec_files; /* ptr to SHA1 hash information if SELABEL_OPT_DIGEST set */ struct selabel_digest *digest; diff --git a/libselinux/src/label_media.c b/libselinux/src/label_media.c index d202e5d5..34260cbb 100644 --- a/libselinux/src/label_media.c +++ b/libselinux/src/label_media.c @@ -100,7 +100,15 @@ static int init(struct selabel_handle *rec, const struct selinux_opt *opts, errno = EINVAL; return -1; } - rec->spec_file = strdup(path); + rec->spec_files_len = 1; + rec->spec_files = calloc(rec->spec_files_len, sizeof(rec->spec_files[0])); + if (!rec->spec_files) + return -1; + rec->spec_files[0] = strdup(path); + if (!rec->spec_files[0]) { + free(rec->spec_files); + return -1; + } /* * Perform two passes over the specification file. diff --git a/libselinux/src/label_x.c b/libselinux/src/label_x.c index 96745299..fafe034a 100644 --- a/libselinux/src/label_x.c +++ b/libselinux/src/label_x.c @@ -127,7 +127,15 @@ static int init(struct selabel_handle *rec, const struct selinux_opt *opts, errno = EINVAL; return -1; } - rec->spec_file = strdup(path); + rec->spec_files_len = 1; + rec->spec_files = calloc(rec->spec_files_len, sizeof(rec->spec_files[0])); + if (!rec->spec_files) + return -1; + rec->spec_files[0] = strdup(path); + if (!rec->spec_files[0]) { + free(rec->spec_files); + return -1; + } /* * Perform two passes over the specification file.