From patchwork Thu Nov 17 16:56:07 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Roberts, William C" X-Patchwork-Id: 9434595 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 693446047D for ; Thu, 17 Nov 2016 17:04:52 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 55C2429667 for ; Thu, 17 Nov 2016 17:04:52 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 4A7A629669; Thu, 17 Nov 2016 17:04:52 +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 (emsm-gh1-uea10.nsa.gov [8.44.101.8]) (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 4C5F029667 for ; Thu, 17 Nov 2016 17:04:51 +0000 (UTC) X-IronPort-AV: E=Sophos;i="5.31,506,1473120000"; d="scan'208";a="1059331" IronPort-PHdr: =?us-ascii?q?9a23=3Aak4KORVoADGvkyVUcWGypYEGoonV8LGtZVwlr6E/?= =?us-ascii?q?grcLSJyIuqrYYheDuqdThVPEFb/W9+hDw7KP9fuxAipZv93R7DgrS99lb1c9k8?= =?us-ascii?q?IYnggtUoauKHbQC7rUVRE8B9lIT1R//nu2YgB/Ecf6YEDO8DXptWZBUhrwOhBo?= =?us-ascii?q?KevrB4Xck9q41/yo+53Ufg5EmCexbal8IRiyowjdrNQajIptJqsyxRbCv2dFdf?= =?us-ascii?q?lRyW50P1yYggzy5t23/J5t8iRQv+wu+stdWqjkfKo2UKJVAi0+P286+MPkux/D?= =?us-ascii?q?TRCS5nQHSWUZjgBIAwne4x7kWJr6rzb3ufB82CmeOs32UKw0VDG/5KplVBPklC?= =?us-ascii?q?EKPCM3/2HNjsx7kbxVrhSvqRdix4LYeZyZOOZ7cq7bYNgUR3dOXtxJWiJBHI2y?= =?us-ascii?q?coUBAekGM+laoYn9v1kDoQawCAajGOzhxSFHhmTt0K0m0eksCx3K0RY8E94Qtn?= =?us-ascii?q?nfsdX7NL0VUeCw1KTJwzTDb/dS2Tf88ofIdwotru2WUbJqdsre0lcgFxnZjlWL?= =?us-ascii?q?soHlPjWV1vgTvGif9eZvSeWvi2shpgpsoTav3t8hhpTGi48a0FzJ9Th1zJwrKd?= =?us-ascii?q?C3VkJ3e8OoHINNuyyeNIZ6WN4uTmNotSogzrALvYS3cSYKxZkh2hXRceaIc5KS?= =?us-ascii?q?7RLmTOuRJDB4i297d7+nnBay9FSgyvX7VsmpzFZGtipFncfItnAKzxHT9tKISu?= =?us-ascii?q?F8/ke8wjaDzRzT6+FYLkA0kqrXMZghzaIrlpUPq0jDGy72mEHugK+XcEUr5PSo?= =?us-ascii?q?5vz6brjpqZKQLY95hhzkPqgwlcGzH/40PhUWU2ie4+u81bnj/UPjQLVNi/07ir?= =?us-ascii?q?LZv47eJcQaoK65HgBU3p845Ba4Ejem1sgXkmccLF9eZBKGj5TmO1HJIPziC/e/?= =?us-ascii?q?mE6jnC1kx/DBIL3tGo/NIWTbkLf9YbZ97FZRxxQrzd9F/ZJUC6oBLenrWkDrrt?= =?us-ascii?q?zYDwQ5MxSww+n9FNpyyJkSWWWVAq+WKKnSq0OH5vozI+mQY48YoDj8K/kh5/7r?= =?us-ascii?q?k3A5g0QQfae30pQKb3C4BO5pI12DYXrrgNcOD3sFvhYkQOztkl2CXiZZZ2yuUK?= =?us-ascii?q?Ik+jE7FIWmAJ/NRoC3mrOB2ju0HpxNZm1dD1CMCXboe5yfW/YCcyKeOMhhkiYL?= =?us-ascii?q?VbK5UY8uyQmutBPmy7pgNufU+TcXtZHk1Nho/ODTlgs99T9zD8SAyW2NSHt0nm?= =?us-ascii?q?wQTT8swK9/uVB9ykuE0aVgmfNXCMZT5/JXXQcgLpPT1fB1C9XoVgLGZNeJR06s?= =?us-ascii?q?Qs+6DjEpUtIx39gObl5hFNq4ihDMwTGqA6MVlryMH5E06b7T33nvKMZ713bG1b?= =?us-ascii?q?Mug0MgQsRRKW2snrR/+BTLB47Vj0WZkL6ndaQC0y7J8GeDynGDvEVFUA5sVqXF?= =?us-ascii?q?WGoQalHRrdTj6UPIV6WuBqg/Mgtd1c6CLbNHasbnjVVcQ/fjI8jebnmqm2e2Ah?= =?us-ascii?q?aJyLaMY5Dse2kH2iXSFlQEmRgJ/XmaLQg+Gjuho2XGAT1gD13vZ1/s/vdkqHOg?= =?us-ascii?q?VUI00R+Fb1d62Lqo/x4Zn/ucS+kc3rgcoicuty10HEqh39LRE9eAuxduc7hdYd?= =?us-ascii?q?wn5FdKzn7Wtwt4PpO8Na9inUIefx5xv0zwyxV9Ep9AntQyrHM20ApyLrqV0FVA?= =?us-ascii?q?dzOc2ZD/JKbXJ3Lo8x+xca7W3UvS0NGM+qcA8P44sUnsvBm1Fko+9HVqy8Ra3G?= =?us-ascii?q?GA5prQEgUSX53wX10r+Bh6vb7aeDU96J3O1XF2N6m7rCPC0cozBOQ50hagY8tf?= =?us-ascii?q?MKScGQ/sEs0VG9SuKOswm1Szch0EPOdS9Kg7P869c/uG2airM/x6nDKhl2hH55?= =?us-ascii?q?p90k2U/SpmVuHIx4oFw+2f3gafUzf8jUyhstzulYBfez4SGmu/yS75BI9efaBy?= =?us-ascii?q?Zp4LCWaoI8222tp+nIThW3hG+16/H1kGwtOmeQKOb1zh2g1dzV4XoXujmSu80T?= =?us-ascii?q?N0iS0mrq2R3SHV2OTiaQYIOnVRSGlll1fsLpC+j8oGU0iwcwgpiByl6F7ix6dB?= =?us-ascii?q?uaR/K3PfTl1ScyftKGFiVrewtr2EY8NU7ZMkrSNXUOOgblyATL7yvQca2Tv5H2?= =?us-ascii?q?RC3DA7ay2qupLhkhx/jGKRNWh8rHzCdMFu2xjf4NjcSuBL3jYcQil3lyXXDECm?= =?us-ascii?q?P9a15dWUi4vDsuemWmKiSJJTdzLrwJiDtCSl421qGhu/kO6vmtH9Fgg6yyD73c?= =?us-ascii?q?FwVSrUtBb8fpXr16OiPOJ/ZEZoGVv85NRiGo5klIswmI8f2WIBi5WI5noIj33z?= =?us-ascii?q?Mc5B1aLla3oNWCQLzMLL7wjr301jNH2JyJzjWnWb3MRhe8GwYnkK1SIl88BKFK?= =?us-ascii?q?CU4aRanStzv1W1thzRYf5gkTcd0/cu7mAVg/0Rsgo30iqdGqwSHVVfPSH0jxSH?= =?us-ascii?q?9c2+rKFMaWmzcLiwyEp/kcmvDL6YpAFQQnH5eo0tHSVo9MVwLErM0GHv6oHjYN?= =?us-ascii?q?TQbtISthmKnBrbiuhVL5wxlvQUiip7JWL9vXoly+slghB025G1opSHIX13/K2l?= =?us-ascii?q?Gh5YKiH1Z8QL9zHjl6lemNqW34eqHph6FDUEQobnTfWyED0IrfTnLQGOED8ipX?= =?us-ascii?q?iHBbrTBwif6F1pr3jXCZCkK2mXJGUFzdVlXBSdK0xfjxwOXDQ6hp45Cgeqydfn?= =?us-ascii?q?cEhn+jAR/UL3pQFUyu12LRX/VHnQpBuwYDcuVJefNAZW7h1F50rNLMOe6Ph8Ej?= =?us-ascii?q?pF8Z2ntgOBMGubZx5HDWsRQEyLG0jjPqWy5dnH6+WYHPCyLvXUbbWLs+NeU/CI?= =?us-ascii?q?xJK034R84zmMM9+DPn54D/00wkBDR2x2G9zFmzUTTCwajyTNb9SBqxek4i16tc?= =?us-ascii?q?6/8PXxWAL0+YuPBbpSMdN19BCwnaiDNvSfhCJjJTZfzJMMymfCyKID014KlyFu?= =?us-ascii?q?az6tHKwdui7WUq3fgKBXDwQBZCNtL8ZI9Lgz3gpQOc7BkNz5zLp4juMzC1hfT1?= =?us-ascii?q?ztg92pZcsJI2C9M1PLHkCLO6qaJTfT2cH4fbu8SaFMjOVTrxC/ojebE0DkPjSF?= =?us-ascii?q?jDTmSg6gPvpNjC6BOhxSooa9cgxiCWL7VtLpdgW7MMNrjT0x2bA7nHzKOnQCMT?= =?us-ascii?q?diaE5NqaWQ4j1egvV6AWNB735lIvKDmyeW9eXYLYwWsfRzCCRui+1a+Gg6y6dS?= =?us-ascii?q?7CxcWPx1ny7SosR0o1Ghk+iA1DxnXwFUqjZMmo2Lvl5vNrne9plFRXnL5gkN7X?= =?us-ascii?q?mKBxQMudRlFsXlu7pMxdjXiKLzNDBC/srU/csAB8jUL8eHP2A6MRfyHT7UDRcF?= =?us-ascii?q?TSS1Om3FgExdiv6S/GWPrpcmspjshIYOSrhDWVwzCPwVEEBlEccBIJdwRTMkja?= =?us-ascii?q?SUjMgT5Xq9rRndXsNasY7bVviKG/XgNC6ZjaVYZxsP2b74N5ocNpbl1EN4cFl1?= =?us-ascii?q?gITKFlHLUtBMuC1ucwg0oEtV8HhkUGIy21jpagWz738PDfS0hAI5ihNiYeQx8z?= =?us-ascii?q?fh+0o4KUDUpCsxjUYxgs7ojiqLcD7rK6exU5pWBDTouEgsKJP7Qhp1bA2okUxi?= =?us-ascii?q?KjjEW6pbj6F8emBzlA/cpZxPFOZSTa1efhAf2OqXaO8u0VRArSWn3lRK6vHZBp?= =?us-ascii?q?tnjgcqdoSsr31Y0QJ5cNE1PbDQJLZOzlVIgqKOuTWo2f43wA4fIEYA62ySeCgV?= =?us-ascii?q?uEASMbkmPSWo9PR26QOegztDZHQMV/0yr/Jx6Ew9P+WAzyT9079MMU2+K+ufL6?= =?us-ascii?q?aFtGfajs6IXkk81kUWmElZ5bJ2y9ssc1KIV0Azy7ucDwkGOtbHKQFSacpS6GXf?= =?us-ascii?q?cD2QserT25J1PoS8FufuTeOUsqYbnF6kFh4zH4sQ9sQBAoWs0EbAIMfkNr4EyQ?= =?us-ascii?q?8i5AL3JFWFF/lJdxWLkC8brM2lyp94w5VdLCkHAWphKSW3+qrXpggyjfqfXdc2?= =?us-ascii?q?Z3AaXpcENnM2Q8C1hi9ZvnRaAzasyO4ZzhaN7yPkrCTKEDb8d8ZjZOuTZR50B9?= =?us-ascii?q?G24y8w866qiVPM85XeIG/7NdJ+ut/P9+wappCHC+9KQrlnqUvcnZdXR2CyWW7V?= =?us-ascii?q?DdG1P4Twa5UrbdHsEHm6Vl2/hC4rQMjpOdasLq6IgQbuRYlOq4SUxzEjOtW7Fj?= =?us-ascii?q?0HFRdwuvsP5KRiag0fe5A7ewLntxwiN6yjJweVys6hTHirKTZNVfZQ0Pu6aKJN?= =?us-ascii?q?zyo3dOC60nshQos9z+mt/k4HXIsKgQ3Gxfa/e4leVjD+GmZbewXOuSU5l29hNu?= =?us-ascii?q?Ipwukn2R3GrEMSPiyMeuFydGNEuNQ8Ck+ILnVtFmo0XVmcgpTf4gS0xbAd4zNd?= =?us-ascii?q?n8pI0e1CqHXxop3fbyiwV6GwtZrVtC4gbdwno6JvK4zjPtWJu4/enjDFS5nQqA?= =?us-ascii?q?KFWjagF/VGgthQPD5YQP5QlGE/I8MGo41B5lEqW8ciPbxAErcsqa6uaTplCy4S?= =?us-ascii?q?wisZV4KP3DwCnue81aHVlg2VcJg4NhwLrolCiMMHUyFqeiMeuLOjV4LOmm6EUG?= =?us-ascii?q?cLOx0c7QFN5AIGjYJwf/zl75DTTJBQ0TFaufR0XTXXFpNw7Vv0VnmWgUTkSPWm?= =?us-ascii?q?i+Go0xhew+7s0tkaXR5/CFJSx+VNm0spNr54NbcfspTNsj+SekPwpHjtx/e+JF?= =?us-ascii?q?lN1c3UcEX1DJLCtWr4SCIc43MVRYhLyHHRDpkSlg15aKEwpFpSPI+mYEH+5yc/?= =?us-ascii?q?x4RoGbm4Wtqnx1E/rXYJXy2qCcZOC/l6sFLLXz1oe4qkqI/4O5VUWGNQ+4aQq1?= =?us-ascii?q?ZYkEVsLy620oBQK8dT7T4QRDJPuymSvMOuSM1f3s97F4MMItB6u3rmBKNIJJ2R?= =?us-ascii?q?rGYstrzp1HDZ5yg2sE2myzWrB6+4U+VZ8nUeGgozPWSRsE0vAPY3/2jP7F/Nqk?= =?us-ascii?q?h08PlfBreRl0V9ujF9HopBBjxRz3CqM0xzTGVas+VdMKnVc8tcTOc8ZRCxIRwz?= =?us-ascii?q?Dv8m0FKX8k5qh3v5ZDZytgRC8SDHQwY0TTUVgqvqmTAGqMGnPiEVRolVYjo/dC?= =?us-ascii?q?fKNRibmTxJsxlCcU1qXY4WAspd8bEBwYRU5tbCSVqrKSwdRxNiOB433eZdmEJe?= =?us-ascii?q?vkiVYjzSDQ2tdfnTqBJ3ZtuRoNSvLPvn4AdNkpnnv/wg96UfW32mnhWgQcrAoI?= =?us-ascii?q?Dhtt2FrFeOebz8M+27f3/OUibAggy3hbg5EZbG5S7TPxRHK5Ni03orfYDhCXLX?= =?us-ascii?q?PRRBP68bP1FbVbxgZtpbvuBXfNRkeKEU+a93Gh2IWBXvGJC1rPZcKlbfXzPeLz?= =?us-ascii?q?+O8uanu4Lc8aTdSfT8ZsyL33vHX7h3MYlk5jbmALrqzIte+lbs2vh36EN6SF/G?= =?us-ascii?q?MySfo9T9PA8L49OidkT6tJ0zATzWGItwkGbqxkxYcsoYWSmq8JAGx5NF9Hb/U/?= =?us-ascii?q?h331P1sOJM67lk8pU47KpxyciqP6vSL+pVsVN/CBiOGgpq7oktAHR4R21JYO8e?= =?us-ascii?q?Mu3RfaMCjcDqse/3Cbca6BiI++xdddvHJl3OmsilBTGaUhxIhgABqSQVLgGEzf?= =?us-ascii?q?6Kh7d0Sdq5pej+wk8t4UKxLhgIzLB34oeL57SHqfTLbxTLy7gEQa/qStn1rrsy?= =?us-ascii?q?p0OY/eckm6IWemxpfw2nF/AQVsEAxmfhyaAqyTwjE8bYEr395vFMTHM5kSjmm5?= =?us-ascii?q?xnGFUWAPwUF6KR/YtChmc4h/DZNtoOf6BEnmaCDh+kErkHyXKx6iuXJmdlggvU?= =?us-ascii?q?3BHrXWOz9kL2ojNkQSvR1dfsjFBZVr6tBUddRyCpI1N3sCuTPAr0s9r6oaE17E?= =?us-ascii?q?YwMmz4u9KCinCsOLZWH8LlItyTPzU0pVwQjJ0rRdyvwpoXGdyjL9cN6Ht+dOfR?= =?us-ascii?q?63u3ky9dpKdKn5De7dyI9fjMEnmgiqKbp6+LxD9G1ngypUs/5cy4NvHS+92KRO?= =?us-ascii?q?yl12IKTyd6uwbMRBC1paLGoFATI0yEyl/LmJYNPtFbw3Y3yl3m6PIkQNIp+wVU?= =?us-ascii?q?DpzAaO8apTDvJDv0xk6SY9czViaA1jtXGUz6EV1jFagzxm3wu9nJlW/K9F00R4?= =?us-ascii?q?l/bUjnhR1xD4UkN00t7FwXwisMEQcTbxCUEK+nCV7jLYQaSUgJcQ6H06Sieqcr?= =?us-ascii?q?wU1zxaui5PTJYuxiHaUNOehSjhWVkVhAAJ0Wr7cRQL1idF9G7qLXoBbtC5T/Vf?= =?us-ascii?q?j8iXUwLeG1Qtxd8c0BtXsi4wO/SgGl6Zhd77cUloqIdq9CYZjDpsx86Vlo5SIX?= =?us-ascii?q?fCxXnBd/lw+5UfwbpO3749jasYCn5fyyW6s2XOUY6QQ0CHpigJfqh1Aju97X3f?= =?us-ascii?q?9GSoLJkYT/7BxNI3mStYnB0hl8MuQPJJipfLZh63UHPzIRJ28KPdeNd/Y85DJi?= =?us-ascii?q?PyvJ6FxfGMMMYskYM9DXlQBTkE3pV6lZ9tDHFV+AF4dza8co4nLvyD8v7ZszTu?= =?us-ascii?q?bg6TGxJZDF7FFBJuhDgztolNLDougV3PXTBTMP4XaDdxh63iOCypeKC/bq/uWA?= =?us-ascii?q?0tLUWE0cHi4wTYhdICCO+Qu9Ruq6jJ/pSB+b6tfvgJIic0KdXmCxnL4bvaZIC+?= =?us-ascii?q?FAjDv00yNDGYD0iPKVssas53FMtlJdCoZz8AfJGKNBMZVnIR74jNWkRlBgBivj?= =?us-ascii?q?f8HZbhUut/CMxugS/+V+N1DzZYsaIhIY1b366WBaThZ1SLLsuFaWQ/4RbsN8SP?= =?us-ascii?q?zYtnBV9Z5gK6gXMViSupPqqCtIqFcxAAMuc78/sDhadkjInA1IVKf5o7oAhRUG?= =?us-ascii?q?Ud95o0BAA2SwN3wi5zDfT6RakLGRCOAJ8jWUVqEOVURoPT95QxOxwppuYKGlnf?= =?us-ascii?q?FAsmNBhSN9u+Mn0zlpSRqzoyHsoLgN2T048rGiqDoBoWBFTvmZkyrQBlVM0O8K?= =?us-ascii?q?jbwFB3j/5lKyZngDbI3v4LhoPsng+owh7G45YRo9ZSEGWv6gCy7ohaOSHoOPqM?= =?us-ascii?q?5chAKKuMjWb7+zKigSNrInxR3/R3h91hXekwtp8WsKRDWg99wkJISmNMY7xyqo?= =?us-ascii?q?B3LUdFIR7aNIqsfxs0AETPcuY1N73GpjytSHRjEKRMHXGmY1kBIraWNffZJH9B?= =?us-ascii?q?8VCqgogjGTvqVc+QEUejjUGJy/+obMhcfIxWU9TdByy2LUuKKFiJ0q0Hl+ltJ6?= =?us-ascii?q?9CGOvmodd/DCX89qHHfzyp9VyfbiaPW1ruAHVIxmxayuUP8GNcmi93W52JFuWk?= =?us-ascii?q?K+3bQeGFy5MO4fybvBVSeqV3GYU/yRc2eQhzY5LlLy5R6wI101aMdLr1c9MuzG?= =?us-ascii?q?hp5diw3uT6h5RiCRpV/H1mwsL/kWdwUsuIeoYwYKVvIeZ/CAJegyx/0zEEcMb3?= =?us-ascii?q?7MHSZtF++2sEKinItlNHVk+0n6Z/ri8hz+OtuIBhYECZLaroJ2+fGiQ2KBOHxg?= =?us-ascii?q?zB51PERv9efQDVcxtuhac5mPm9jcndJ73vAZd/11Ky0ypsYTmp5/6YmTyMqFag?= =?us-ascii?q?/ezpDuJdzOufiYB/rfz1g2emFETLUWfBn554IgPt42Q7fTB6dWvQwABagmR5ws?= =?us-ascii?q?L2nx+79wLANyag7eeq+5g8jrpuKOY5tbuWXW7lYuIyvGvB0D0PO0RxRhb5+2n3?= =?us-ascii?q?XyPIwwRjVZotxjEhtmBopPFN8eoAe8Bp6Umb27i8Wv9E9gvO8Kq6XwAOjQ1Nul?= =?us-ascii?q?x4VxQ4Ra5UuTMTbWAKlknF9ojvy2gvjayZnxFcLids8YVOhhXGHKdKXKHoOhJT?= =?us-ascii?q?KSIsj8YVJJ86aA0LJlVRWcfCT5X6uAtC25O/Ro+EE7yo1jfOrP1zwg9LDb18H0?= =?us-ascii?q?Z2FcvCujqmSJNJRH5lzQGePeRw5USeaC8Gt9Bq0Yc4/09OYIMdw/z9mQ5AZ97C?= =?us-ascii?q?hC0MSbOaiusFfM1VhgeJLYMkTpwSA5VpcOIBukLEssjnXVqnPHAXRTNsKkM9Vi?= =?us-ascii?q?gM6JDhzx4El8gWUtZm9aGmr0XtqQOHEb28SkawGQ8gJEEcoDlfateUEkrq2yVf?= =?us-ascii?q?VoOpJdlOWvrroIjdZpKyDJRMhdJCzQMr52PjxPAeXLpVgoZAMEsrcvVocyf5iO?= =?us-ascii?q?L1sNMF2cxiPq0QvCzUr0esSu1KmTIyYW9W5IwqnY0ThKuwm5ufGZgtDsULDZcJ?= =?us-ascii?q?H6RvjSPzQ5VjuCXzQ9DV6p+Uu4u/oDpPeXOnwQrlcQYiKTEw4TurtvocLLDmDN?= =?us-ascii?q?heJvZoYKi+6eWyDxTi14iaUzCz1XukGMWfoDCBLWY2XvgWVGpAyiPfhM/XT/Y7?= =?us-ascii?q?2f3KpVVPQcApFQff2BX9vYZfdeKi8nljoDI+m8ZdzcoKg90l/TU2sZF7PH9Eaf?= =?us-ascii?q?TE6LWPCcwSzkXZkNtYgupiUo4s7QnjNwE6nQPbafojmu8pSijCaZou3TTW8tbF?= =?us-ascii?q?YwgO0cAWmN2h5AKHsLC9sNokHiXraAZ1pQ1HIuke9hxR0MeANzUn1oyX1Wm/C9?= =?us-ascii?q?F9ZWSV4OkWOuXuMJbEptADM240CK/hX4YcYctsDLW29e6rwMRJIGLPkm7YnYJK?= =?us-ascii?q?odzfUy0TJ4viM6qSSdDlJajgKD6abQGrxzxqFa72ki4/52Rl2PQy/YcmXfyIqm?= =?us-ascii?q?DMRPxSN1rHDhycXbo+5tNLxAp45lHlgGGyR2Kc7B/WMJbWahwweplwqqFzSZZj?= =?us-ascii?q?QC6XAEIjJBPv14y+59rQbgasfK6UTWsbko7kSsF1WlEL2xjYNKDsXo3AD+Ym9R?= =?us-ascii?q?dj+mDYxtgvdLiNsWJ6ggYNvtS2vdJxTzW1rL8xsH8wLn9/HyVcc=3D?= X-IPAS-Result: =?us-ascii?q?A2HWBACY4i1Y/wHyM5BeHAEBBAEBCgEBFwEBBAEBCgEBgww?= =?us-ascii?q?BAQEBAR+BWKRQkB6GRiSIHlMBAQEBAQEBAQIBAl8ogjMaghwCBAECJBMUIA4DC?= =?us-ascii?q?QEBFwghCAgDAS0VEQcHCwUYBIhLrm89KgKLMQEKAQEBI4hBhnARAYV9BYhRhwy?= =?us-ascii?q?KZpBtAooXhg1JkRJVXUuFP1EBhUuCLQEBAQ?= Received: from unknown (HELO tarius.tycho.ncsc.mil) ([144.51.242.1]) by emsm-gh1-uea10.nsa.gov with ESMTP; 17 Nov 2016 17:03:55 +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 uAHH3mFj015474; Thu, 17 Nov 2016 12:03:49 -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 uAHGuLIj204365 for ; Thu, 17 Nov 2016 11:56:21 -0500 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 uAHGuIQI013962; Thu, 17 Nov 2016 11:56:21 -0500 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A1C5AwCZ4C1Y/yNjr8ZeGgEBAQECAQEBAQgBAQEBgzcBAQEBAR+BWKRPkB6COIQVhiECghhTAQIBAQEBAQJihRECBCdSECAxVwcSiGyuaz2LXgEBAQEBAQQBAQEBI4hBjH8FiFGHDIpmkG0CkCRJkRJVhmcdNAGHeAEBAQ X-IPAS-Result: A1C5AwCZ4C1Y/yNjr8ZeGgEBAQECAQEBAQgBAQEBgzcBAQEBAR+BWKRPkB6COIQVhiECghhTAQIBAQEBAQJihRECBCdSECAxVwcSiGyuaz2LXgEBAQEBAQQBAQEBI4hBjH8FiFGHDIpmkG0CkCRJkRJVhmcdNAGHeAEBAQ X-IronPort-AV: E=Sophos;i="5.31,506,1473134400"; d="scan'208";a="5830038" Received: from emsm-gh1-uea11.corp.nsa.gov (HELO emsm-gh1-uea11.nsa.gov) ([10.208.41.37]) by goalie.tycho.ncsc.mil with ESMTP; 17 Nov 2016 11:56:16 -0500 IronPort-PHdr: =?us-ascii?q?9a23=3AjMijihfE34AJatx8MVulHID6lGMj4u6mDksu8pMi?= =?us-ascii?q?zoh2WeGdxcS6Yh7h7PlgxGXEQZ/co6odzbGH6Oa5BydQvd6oizMrSNR0TRgLiM?= =?us-ascii?q?EbzUQLIfWuLgnFFsPsdDEwB89YVVVorDmROElRH9viNRWJ+iXhpTEdFQ/iOgVr?= =?us-ascii?q?O+/7BpDdj9it1+C15pbffxhEiCCzbL52Ihi6txjdu8gZjYZhJas61wfErGZPd+?= =?us-ascii?q?lK321jOEidnwz75se+/Z5j9zpftvc8/MNeUqv0Yro1Q6VAADspL2466svrtQLe?= =?us-ascii?q?TQSU/XsTTn8WkhtTDAfb6hzxQ4r8vTH7tup53ymaINH2QLUpUjms86tnVBnlgz?= =?us-ascii?q?ocOjUn7G/YlNB/jKNDoBKguRN/xZLUYJqIP/Z6Z6/RYM8WSXZEUstXSidPAJ6z?= =?us-ascii?q?b5EXAuQBI+hWsofzqVgJoxS8CwmhH//jxiNSi3Pqx6A2z/gtHAfb1wIgBdIOt3?= =?us-ascii?q?HUoc37NacTVeC1yKjIwi/Gb/9MxTjx8pLIchc6rv6SR7JwbdHRxFIuFwPDklWf?= =?us-ascii?q?t4jlMymJ2eQKtmiW6fdrW+G3i2M/tg18pjuiyt0xhoTLho8Z0FTJ+CFjzIs7Jd?= =?us-ascii?q?C1TlNwb8S+H5tKrS6aMpN7QsM8TGFsvyY30rMGuZugfCgPx5Qo3QLTZ+CZf4SR?= =?us-ascii?q?4xLsSPqeLS12hHJgYr6/hhCy8VS+xe34TMW7zFFKri9dntnNsHACyQDT59CaRv?= =?us-ascii?q?Z5/UqtwyuD2gLT5+1eJU05kbDXJpAhz7Iok5ocq0XDHiv4mEXsi6+Wc10p++ap?= =?us-ascii?q?6+TjZrXmp4WTN4puhg7iKKgugMu/Dv8mPQgUQ2ib4v+x1Lzl/U3lXrpKiuc6nb?= =?us-ascii?q?XesJDfPcgbvLK2AxdJ0oY/7BayFyym38kDnXQcMFJEeA6Ij4juO13UJvD4Fu2w?= =?us-ascii?q?j06jkDds2fDMJqfhDYnVLnjfjLfheq5w61VCxwo3zNBf4Y9UC74aLfLvWk7+qN?= =?us-ascii?q?zYDhgjPwyy2OboEs9x1owZWWKRUeelN/bJvUSg+vMkI+7KYpQc/jn6Nbxt/PPq?= =?us-ascii?q?jHkkiXcBbKKp2t0Rc3n+EfN4cGuDZn+5ndYFFWYDu0w1CvbtglCYTSV7ZnCuUq?= =?us-ascii?q?Z67TY+W9HuNpvKWo342O/J5yy8BJADIzkeUl0=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0FMBAA54C1Y/yNjr8ZeGwEBAQMBAQEJA?= =?us-ascii?q?QEBFQEBAQECAQEBAQgBAQEBgwwBAQEBAR+BWKRPkB6COIQVhiECghhTAQEBAQE?= =?us-ascii?q?BAQECAQJfKIIzGgGCGwIEJ1IQIDFXBxKIbK5qPYteAQEBAQEBBAEBAQEBIohBj?= =?us-ascii?q?H8FiFGHDIpmkG0CkCRJkRJVhmcdNAGHeAEBAQ?= X-IPAS-Result: =?us-ascii?q?A0FMBAA54C1Y/yNjr8ZeGwEBAQMBAQEJAQEBFQEBAQECAQE?= =?us-ascii?q?BAQgBAQEBgwwBAQEBAR+BWKRPkB6COIQVhiECghhTAQEBAQEBAQECAQJfKIIzG?= =?us-ascii?q?gGCGwIEJ1IQIDFXBxKIbK5qPYteAQEBAQEBBAEBAQEBIohBjH8FiFGHDIpmkG0?= =?us-ascii?q?CkCRJkRJVhmcdNAGHeAEBAQ?= X-IronPort-AV: E=Sophos;i="5.31,506,1473120000"; d="scan'208";a="860090" Received: from fmsmga002-icc.fm.intel.com ([198.175.99.35]) by emsm-gh1-uea11.nsa.gov with ESMTP; 17 Nov 2016 16:56:14 +0000 Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga002-icc.fm.intel.com with ESMTP; 17 Nov 2016 08:56:15 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.31,506,1473145200"; d="scan'208";a="32462499" Received: from rhampste-mobl.amr.corp.intel.com (HELO wcrobert-MOBL1.amr.corp.intel.com) ([10.254.68.24]) by orsmga005.jf.intel.com with ESMTP; 17 Nov 2016 08:56:15 -0800 From: william.c.roberts@intel.com To: sds@tycho.nsa.gov, selinux@tycho.nsa.gov Subject: [PATCH v3 2/3] expand_avrule_helper: cleanup Date: Thu, 17 Nov 2016 08:56:07 -0800 Message-Id: <1479401768-19811-2-git-send-email-william.c.roberts@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1479401768-19811-1-git-send-email-william.c.roberts@intel.com> References: <1479401768-19811-1-git-send-email-william.c.roberts@intel.com> 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 From: William Roberts General clean up for expand_avrule_helper: 1. Minimize the conversions of AVRULE specification to AVTAB specification, they are almost the same, the one exception is AVRULE_DONTAUDIT. 2. Clean up the if/else logic, collapse with a switch. 3. Move xperms allocation and manipulation to its own helper. 4. Only write avkey for values that change. 5. Return error rather than assert on invalid specification. Signed-off-by: William Roberts --- libsepol/src/expand.c | 135 ++++++++++++++++++++++++++------------------------ 1 file changed, 69 insertions(+), 66 deletions(-) diff --git a/libsepol/src/expand.c b/libsepol/src/expand.c index 3e16f58..5e2c066 100644 --- a/libsepol/src/expand.c +++ b/libsepol/src/expand.c @@ -33,6 +33,7 @@ #include #include #include +#include #include "debug.h" #include "private.h" @@ -1668,6 +1669,12 @@ static avtab_ptr_t find_avtab_node(sepol_handle_t * handle, return node; } +static uint32_t avrule_to_avtab_spec(uint32_t specification) +{ + return (specification == AVRULE_DONTAUDIT) ? + AVTAB_AUDITDENY : specification; +} + #define EXPAND_RULE_SUCCESS 1 #define EXPAND_RULE_CONFLICT 0 #define EXPAND_RULE_ERROR -1 @@ -1781,6 +1788,41 @@ static int expand_terule_helper(sepol_handle_t * handle, return EXPAND_RULE_SUCCESS; } +/* 0 for success -1 indicates failure */ +static int allocate_xperms(sepol_handle_t * handle, avtab_datum_t * avdatump, + av_extended_perms_t * extended_perms) +{ + unsigned int i; + + avtab_extended_perms_t *xperms = avdatump->xperms; + if (!xperms) { + xperms = (avtab_extended_perms_t *) + calloc(1, sizeof(avtab_extended_perms_t)); + if (!xperms) { + ERR(handle, "Out of memory!"); + return -1; + } + avdatump->xperms = xperms; + } + + switch (extended_perms->specified) { + case AVRULE_XPERMS_IOCTLFUNCTION: + xperms->specified = AVTAB_XPERMS_IOCTLFUNCTION; + break; + case AVRULE_XPERMS_IOCTLDRIVER: + xperms->specified = AVTAB_XPERMS_IOCTLDRIVER; + break; + default: + return -1; + } + + xperms->driver = extended_perms->driver; + for (i = 0; i < ARRAY_SIZE(xperms->perms); i++) + xperms->perms[i] |= extended_perms->perms[i]; + + return 0; +} + static int expand_avrule_helper(sepol_handle_t * handle, uint32_t specified, cond_av_list_t ** cond, @@ -1790,44 +1832,21 @@ static int expand_avrule_helper(sepol_handle_t * handle, { avtab_key_t avkey; avtab_datum_t *avdatump; - avtab_extended_perms_t *xperms; avtab_ptr_t node; class_perm_node_t *cur; - uint32_t spec = 0; - unsigned int i; - if (specified & AVRULE_ALLOWED) { - spec = AVTAB_ALLOWED; - } else if (specified & AVRULE_AUDITALLOW) { - spec = AVTAB_AUDITALLOW; - } else if (specified & AVRULE_AUDITDENY) { - spec = AVTAB_AUDITDENY; - } else if (specified & AVRULE_DONTAUDIT) { - if (handle && handle->disable_dontaudit) - return EXPAND_RULE_SUCCESS; - spec = AVTAB_AUDITDENY; - } else if (specified & AVRULE_NEVERALLOW) { - spec = AVTAB_NEVERALLOW; - } else if (specified & AVRULE_XPERMS_ALLOWED) { - spec = AVTAB_XPERMS_ALLOWED; - } else if (specified & AVRULE_XPERMS_AUDITALLOW) { - spec = AVTAB_XPERMS_AUDITALLOW; - } else if (specified & AVRULE_XPERMS_DONTAUDIT) { - if (handle && handle->disable_dontaudit) + /* bail early if dontaudit's are disabled and it's a dontaudit rule */ + if ((specified & (AVRULE_DONTAUDIT|AVRULE_XPERMS_DONTAUDIT)) + && handle && handle->disable_dontaudit) return EXPAND_RULE_SUCCESS; - spec = AVTAB_XPERMS_DONTAUDIT; - } else if (specified & AVRULE_XPERMS_NEVERALLOW) { - spec = AVTAB_XPERMS_NEVERALLOW; - } else { - assert(0); /* unreachable */ - } + + avkey.source_type = stype + 1; + avkey.target_type = ttype + 1; + avkey.specified = avrule_to_avtab_spec(specified); cur = perms; while (cur) { - avkey.source_type = stype + 1; - avkey.target_type = ttype + 1; avkey.target_class = cur->tclass; - avkey.specified = spec; node = find_avtab_node(handle, avtab, &avkey, cond, extended_perms); if (!node) @@ -1839,13 +1858,16 @@ static int expand_avrule_helper(sepol_handle_t * handle, } avdatump = &node->datum; - if (specified & AVRULE_ALLOWED) { - avdatump->data |= cur->data; - } else if (specified & AVRULE_AUDITALLOW) { - avdatump->data |= cur->data; - } else if (specified & AVRULE_NEVERALLOW) { + switch (specified) { + case AVRULE_ALLOWED: + case AVRULE_AUDITALLOW: + case AVRULE_NEVERALLOW: avdatump->data |= cur->data; - } else if (specified & AVRULE_AUDITDENY) { + break; + case AVRULE_DONTAUDIT: + avdatump->data &= ~cur->data; + break; + case AVRULE_AUDITDENY: /* Since a '0' in an auditdeny mask represents * a permission we do NOT want to audit * (dontaudit), we use the '&' operand to @@ -1854,36 +1876,17 @@ static int expand_avrule_helper(sepol_handle_t * handle, * auditallow cases). */ avdatump->data &= cur->data; - } else if (specified & AVRULE_DONTAUDIT) { - avdatump->data &= ~cur->data; - } else if (specified & AVRULE_XPERMS) { - xperms = avdatump->xperms; - if (!xperms) { - xperms = (avtab_extended_perms_t *) - calloc(1, sizeof(avtab_extended_perms_t)); - if (!xperms) { - ERR(handle, "Out of memory!"); - return -1; - } - avdatump->xperms = xperms; - } - - switch (extended_perms->specified) { - case AVRULE_XPERMS_IOCTLFUNCTION: - xperms->specified = AVTAB_XPERMS_IOCTLFUNCTION; - break; - case AVRULE_XPERMS_IOCTLDRIVER: - xperms->specified = AVTAB_XPERMS_IOCTLDRIVER; - break; - default: - return -1; - } - - xperms->driver = extended_perms->driver; - for (i = 0; i < ARRAY_SIZE(xperms->perms); i++) - xperms->perms[i] |= extended_perms->perms[i]; - } else { - assert(0); /* should never occur */ + break; + case AVRULE_XPERMS_ALLOWED: + case AVRULE_XPERMS_AUDITALLOW: + case AVRULE_XPERMS_DONTAUDIT: + case AVRULE_XPERMS_NEVERALLOW: + if (allocate_xperms(handle, avdatump, extended_perms)) + return EXPAND_RULE_ERROR; + break; + default: + ERR(handle, "Unknown specification: %"PRIu32"\n", specified); + return EXPAND_RULE_ERROR; } cur = cur->next;