From patchwork Tue Jan 31 19:41:55 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Carter X-Patchwork-Id: 9548299 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 3A9EA60425 for ; Tue, 31 Jan 2017 19:44:09 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 2C1FE27F81 for ; Tue, 31 Jan 2017 19:44:09 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 2089428304; Tue, 31 Jan 2017 19:44:09 +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]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 43F6827F81 for ; Tue, 31 Jan 2017 19:44:08 +0000 (UTC) X-IronPort-AV: E=Sophos;i="5.33,315,1477958400"; d="scan'208";a="2769877" IronPort-PHdr: =?us-ascii?q?9a23=3Akq/ZSBcNHKHDI/WKjYtO0NiYlGMj4u6mDksu8pMi?= =?us-ascii?q?zoh2WeGdxcq4YBKN2/xhgRfzUJnB7Loc0qyN4vymBzFLuMzf+Fk5M7V0Hycfjs?= =?us-ascii?q?sXmwFySOWkMmbcaMDQUiohAc5ZX0Vk9XzoeWJcGcL5ekGA6ibqtW1aFRrwLxd6?= =?us-ascii?q?KfroEYDOkcu3y/qy+5rOaAlUmTaxe71/IRG5oAnLt8QbgYRuJrsvxhbIv3BFZ/?= =?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?nVSgiC1ryOzePr39HpXNKWDOkLXmfbZ78UFc1AozwspZ559PCLEBJ/TzWkrru9?= =?us-ascii?q?zDEh82LRa0w/39BNV6zIMeVnqFArWFP6PKrV+I+uUvLvGOZI8XojnyN/sl5+Xp?= =?us-ascii?q?jX8/mF8dY7Kk3ZUTaHClEfVpOFiZYXzwgtccC2sKuRA+TOPygl2YTTFTf2qyX7?= =?us-ascii?q?475jwjBoOmDIPDRoWzj7ybxyq7EINZaX1BClCWC3job5+EW/AOaC2MPsBhjiYI?= =?us-ascii?q?Vb+7S48uzRuurhP1y6J7LurI/S0VrY/s28Rw5+3UkxEy6SF4At+D026TVWF0n2?= =?us-ascii?q?IJRzgw3Kxlp0xy1EuD27Big/NEDdxT++9JUgAiOJHB0+x1EcryVxndcdeOTVap?= =?us-ascii?q?Xs+pASotTt4rxd8BfVp9Ec24jh/fxyqqH6MVl7uTCZ0086Pc2H7xKt14y3bCza?= =?us-ascii?q?Uhjl8mTtFJNWK8nK5/9AnTB5DXnEmDkaala7gc1jbX9Gif1WqOoF1YUAloXKre?= =?us-ascii?q?Rn8TYU/WrdXi5kPeVL+iE68nPRVdxsKYMatFdNnpjVRARPf+N9XTeH6+mmeqBR?= =?us-ascii?q?aV3bOAdoTrdH8B3CXGD0gElRof/XGcNQgxHi2huX7RDCRyFVLzZEPh6fdxqGuh?= =?us-ascii?q?QU8uzgGKdFZs16Kv9R4PhPycUOsT3rYetyg9tTp4BlG938jZC9CYvQpuYL1cYc?= =?us-ascii?q?8h4FdAzW/ZuRZ9MYamL69+h14eaB96v0b21xV2E4lAisYrrGgwwAp1M6KY30tL?= =?us-ascii?q?dymE0pDoJr3XNm7y8Qisa6HM2VHe18uW97wM6PsiqFXjuxypGlAl83V93Nlfy2?= =?us-ascii?q?Gc6YnSDAoOTZLxVV46+AJnqLHAYyky+ZnU2GZ2Pqaotz/OwdUpBPEqyhy4ZddQ?= =?us-ascii?q?LLuEFBPuE80dH8WuKPIlm1ytbhIDJ+1S8LM0P9+hd/uDwqGnJuFgnCipjW5f+o?= =?us-ascii?q?ByzlqM9zZgSu7Px5sF2P+Y3hGAVzfnkFesqdv3mYZDZTAcG2qw0y7kCJRXZqJs?= =?us-ascii?q?YYYBEX2uLNGvxtVim57tXGZV9VC5CFMCxM+mZwCSb0fm0A1Oy0sXu2eomTa9zz?= =?us-ascii?q?BulDEptKWf1jTUw+v+bBoHJnJLRG56gFfwPIe7ktEaU1KsbwUyiBSl4kP6yLRB?= =?us-ascii?q?q6RkM2nfW0FIcDbqL2t6SKu/qqKCY9JT6JMvqShXVuW8YVSeSrHjuBsXyDnsEH?= =?us-ascii?q?VExDA8bT2qvY/5nxNigmKHMHlztGbZed13xRrH+tzcROJe3iYBRClikzXYGli8?= =?us-ascii?q?P96v/dWbjJrDtuG+V2S7WZ1Jdinn14SAtDG05WdyGx2wg+izmsH7EQg9ySL709?= =?us-ascii?q?hqVT7UrBrleYnkyaC6MeNhfkl1C17x8NF6Gpl/kos2hZEfxWMaio+T/XUZjWf5?= =?us-ascii?q?Kc9b1r7mbHoRWT4LxMbY4BLi2E1nKnKG2Zj5WWmawspvfNS6eX4W1T4m78xQD6?= =?us-ascii?q?eU9rNElzNvolWktQLRfeR9njAFxPs28nEanuUJtBA3wSmHGb8SGk1YPTDrlxSO?= =?us-ascii?q?9N2+qblbZGCocbeszkZ+m86uDK2aqAFGRHn5YosiHTN37shnM1LDznvz6pr/dd?= =?us-ascii?q?nTc90TsAaUkxHegOhJMp4xkeAKhSV/M2LnoXIl0/I7jQBp3ZyiooiHLXhi8bmn?= =?us-ascii?q?Ah5eKzL1Z9kf+jfzgqZChsyWxZygHo19GjUXW5vlVeqoHygPtfTjLAuBDDw8qm?= =?us-ascii?q?ubGLbGEw+Q8kFmo2jIE5CxOHGdPGMZwsl6RBmBOExfhxgZXC8nkZEkDQ2qy8nh?= =?us-ascii?q?cUhj6jAX+FH4tgNGyvh0OBnnTmffuACoZy8sSJeFMRpW6h9N51/PPsyY8uJ8AT?= =?us-ascii?q?tY84a8rAyWNGObfR9IAXsSWkyDGlDjJKWh6sfO8+ifHOq+IOXBba+IqeNAS/eC?= =?us-ascii?q?3Yiv3Zd+/zaQKsWPOWFvD/Mh1UpFQXB5HMHZli4BSyMJii3NaNSbqw2k+i1tqc?= =?us-ascii?q?C/8urkVx7z5YeVDLtSK9pv8QisgaifL+6QmDp5KTFA25MJ33DIzLwf00AOiyFy?= =?us-ascii?q?bTaiC68NtSjTQ6LMga9YEwQUazttO8dS6aIzwBVNM9bBitzpzr54kuI1C1BdWF?= =?us-ascii?q?z7gM2oa9YGI2SnO1PDA0aKNK+LKifXzMHye6+8TqdQjOpMvR2qpTmbC1PjPiiE?= =?us-ascii?q?lzTxURCvK/tDjDmDPBFFtoG9cwxtCXP/TNLoax27NsV4jTsqzr01nHzKMXQQMT?= =?us-ascii?q?9mc0NCtreQ9z9Xgu1jG2xd6XpoNfGElDiC4ObGLJYWsOdrAiNvmuJb/ns11aVa?= =?us-ascii?q?4DtDRPxvlyvYtsRurE2+kumT1jpnVwJDpStQhI2Vp0piNr/Z+YNeWXvf5xIC92?= =?us-ascii?q?aQCwkQp9R/ENHvv71Qyt7Vm6LpMTtC79XU/cgcBsjTMs6HNmQuMQbxEj7OEAQF?= =?us-ascii?q?VSKrNX3Yh0FFi/Gd7GOVoYI1qpfyg5oDUaRbW0YrFvwABURqAscCLI1xXjw6jb?= =?us-ascii?q?6RlNQI6mamrBnNWMVauYjKWemTAfXgLzaZi6JJaAYWzrzjLIQcLIv711Zlallg?= =?us-ascii?q?k4TAA1DQUsxVoi19cg80p11A/2JxTmIpxULqdBig4HgLFfGqmB42jxFxYeUp9D?= =?us-ascii?q?j35Fc2KUDGpCwqkEk+gd/lmyyecCbtLKesWoFbEzb0t080Mp/hWQZ1agyzklJi?= =?us-ascii?q?NDjfXbJRiKVvdWNwhQDAvptPHOJTQrdfYB8M3/2XYesn0UhEoCW92UBH/ffFCY?= =?us-ascii?q?dllAYycp6tr3ZA1Bx4Yd4wIqzQKqRJwUZMhqKSvi+o0eUxzxEEK0YL7mySZDYC?= =?us-ascii?q?uFYUObk+Oyqo4uts5BSEmzRdYmcMU+EnovFt9kMmJ+SP1STg06VAKkCwLeCfKb?= =?us-ascii?q?2Wu3TYn86SXlwwzl8Il1VC/bVuy8csbVGUWF41w7uLCxsJNdHPJhpUb8pI6XfT?= =?us-ascii?q?eiiOsf3XwZ1rP4SxDOboQvGStKwMmEKrAB4pH5gQ7sQGBpSjzUbYLcHhLLEY1x?= =?us-ascii?q?ot4AXrKU6fA/tXYhKLly0Lo8alzJ94xYNdPC0SAX1hMSWr4bbavhIlj+CdXNc3?= =?us-ascii?q?f3gaRZAJOWgsWM2gnC5YsW9AAyer3eIE0giC7iP8pyTKADn6cdVjeO+eZQlwB9?= =?us-ascii?q?Gu5TU/76+2hEbZ8pXEOW71KM9itcXJ6eMGoJaHEOhZQqNhvEfZgYVYQGaqU2HX?= =?us-ascii?q?G96vO5fwc5UsbcDzCnuiVly/jCg1QNn3PNesKaiFmg7oRYBJsIWB2zAjL8C9HC?= =?us-ascii?q?kEGxhsv+ED+L58ZQobbpogfxHoswU+N6qiIAaXydihX2GtKT5KQPZF1uW6e6Zb?= =?us-ascii?q?zywyYe+m0HEgVI01z/Gr8U4RQ5EHlhLexeyjZoZEVyjzBnxddh7ApSo+j2huKv?= =?us-ascii?q?w+wuEhzxPUqVMcKSyEdPR1aGxYuNExHU+SIXRzCmo/W1+cjYrC7xWx0LAT/ypS?= =?us-ascii?q?hc1b3fdDsHfgop/VeCisV7CzqZXJryogasArrLd1MYziPsSJqovRnjnfTZnWtQ?= =?us-ascii?q?2FVjS1GuFBldhROi1YRuBEmW84OcAcv4pO91YxXN8kJ7NTEKksuqyqaT18ACEJ?= =?us-ascii?q?0yAZUZiN0yYfjeeixbTajAyQf444MB0EqplChcEdUyFuaCMEuKCjT5nWl3ODSm?= =?us-ascii?q?UTLwcT8AVM5AYEloBue+Do+5fHQ4FXxD5Xuf10VDHHFp5y91v0UmuWm0T3SO29?= =?us-ascii?q?k+y12gJf1Ojs0t8aWBFjCUhdwOJWllAwJr9uNqcepJLHvDiTeEzmu2LtzfepK0?= =?us-ascii?q?NKyc3IbVH4CpTKtXbkWC0G5XIUXZNPyG3YFZkKiQp2crwrpFJXL429Zkb+/SYr?= =?us-ascii?q?x5p3ELm8VMCrwVklrXIHRyelE9pBF+9mv0jNWD1geZyrrovqO4lKSG9K5JKds0?= =?us-ascii?q?tZkFlqMyOhx5tQMd1C4j4NXDhKoDWSptiyRdZC2cBoEZADPM1zu3DnGKNLIJKR?= =?us-ascii?q?uWE5uqTzyn/F/DAxqE21xC+uG6++Ve5Z/HYTGgQoJ2SftkkgFPEg8mHM/VDRql?= =?us-ascii?q?p05ftUBqCTjUVtpzZwBpFOBjBV1X+7K1R8UnxGvPtGKKTPc81RWP4yZQexNBw4?= =?us-ascii?q?EP4pxU2J/UVvknf+bC1+rAxa+zrSXwMsTykanq/tmSECqsGgITIaRIhIYi8nby?= =?us-ascii?q?fZMA+bmCdXvRhZa0F2W5AWHNdF+7cH3YRK5MrOU0CsJj8ZXBZ6LAI3zeJflVJf?= =?us-ascii?q?sEWfYS3dEQ2odfPUvx1rYcuRqdWmIO7//AhZloPtqPo4+LkbR326hQ2tRsjTr4?= =?us-ascii?q?/mud2QrESOcLr3PvahbnDfVDjMlQ6/hbM6AJnQ5STTNxBbK5Ziw3o+fZfhEXLL?= =?us-ascii?q?PQhBJ68DJUpbUr51ZM5bre9EfM9rZrwJ+bNzCR2aXB/vHpKgrOVeJFbJWTveNz?= =?us-ascii?q?mB8vC4oY/L9rPdR/TvatCOynraTa96JYt16T7+G7j2y4Be4Vb21u1r9kxkVVjM?= =?us-ascii?q?KzqBo8j5JgMX+MmicVPvvoc3EjzLAJd/imbty1pEd8oQXS2l7ooUx49e6HntV+?= =?us-ascii?q?10yE7zv/NO97N884k4/6hpyduoJafVMflaqVRnAgSOCQp36pUgG3N/R2dMYu8L?= =?us-ascii?q?NPjeY6IZjdz0q+/tE6wb8hqV+/ZWadHfPUHOhtG/Ci2ASRxDhAoBtSQaIRWC2P?= =?us-ascii?q?GYgKJ0VMKlpfTj2k03/Vi+LxkGzLRz6oeY4KaIo/XXbxTJx7geRqfqXt/zrqgr?= =?us-ascii?q?u06K+PIkkqQBd3dobA2hCucRTMkdxn3vzaoy1yIjD9vDH678+P5ET385nCjvm4?= =?us-ascii?q?p6H1UNHvMbB6SL8J9bnmcln+zZKtwWfbxDmmmVEx6kCaUOyXmx6yuYOGNlmA3B?= =?us-ascii?q?0wnsQWOv61/7tS14TjHKz9ftiEpVUaS4CllJUiq1I0B4tiiPPA3yuNrxp6s18F?= =?us-ascii?q?k8Mnb4u9KViGuhJLRXEtX5JNyYOiQ0pVQXjJgrStyu34AbF8C9L80K8HFidPve?= =?us-ascii?q?9n+kkzNco6ddmYXS+MaV+u/YHXO4la2Vt62NxCxEyng/pVw/7NGgOe3J592OWf?= =?us-ascii?q?uozHwdTyZ4uwvGRB61safWr1UbNE2EykvLn5YKPt5B13kiyk7m/PQjQM409AhG?= =?us-ascii?q?ConPffcCqi7oODvowVefZMk6VjKC3DtWAF31F0V4GKkm127qusLGi2vQ8UUyRo?= =?us-ascii?q?Zsb0znmQB3D4IgJEIp81gXxyoOHBMDaR+FEb6oAl7lIpEcVUgZbhSH3qa1dbsr?= =?us-ascii?q?3UFpxbOv/uDTZ/RmB6URLvZdkhKOnF9DF5IUsK0eRalxe1pD+6/XuAfiEYnnX/?= =?us-ascii?q?7plXYqM/26XNxa+9gDt3Q++ga/Wwag6ZBb4rYaiZGHbLRLboTXscBn8Uhn+SAA?= =?us-ascii?q?eTBXjBh4lRO5XvgWpPr/7djDrJqo9uGuWb42SOUW7Bg1CX5xj5nxgFA/udHYzf?= =?us-ascii?q?pcSonOhIvj9wBCPmCFt5zH0xlmLuoOMZikcKxn93UdKCgUP2gOMsaOa/kg/y9t?= =?us-ascii?q?Ny3e50RYDcMQedwYPMTMmQdOik3qQb1T7dTUGluZC4d1asAp4HH6yCgv/psgTu?= =?us-ascii?q?ng6DG3JZfF71FOJf9DjztjlMjEpOcLxfreEi8X4WOWaxJt2CON14GNC+rs/eWL?= =?us-ascii?q?0NzUS0kGETAyU4hHIjqN5xeqSfe0lJXmUwOU9tX8gIkke0KKW3y9hqIFvbhQEe?= =?us-ascii?q?RYkCX0wiBeFpzph/KSq9es53FYtkdZH4Zv7R3IA6FfPpRnORvmlsmkXFV8BjDl?= =?us-ascii?q?dMHSaBUupPKcxv0Q7OVmK0v+eYgbLwoLy73k73pVUgxuSLnxslaCQ+0RYNpmSP?= =?us-ascii?q?XZrnFa8o9gL7EAPEKdpZPwtDtIrk45ABMxYr8qsjNablXOnBFSW6vspLEAiBET?= =?us-ascii?q?XsJitEBQHmKwPGY+5zvZWqRPkKmeFuAa8jWJQqwJSUVoPTt0Qwmp15V2Z7upgf?= =?us-ascii?q?dHv3tDniN6pvgqzzNmSwWntC3ppqICwzQg96+ktDQPvnxFVOaekzzSBVVF0vsK?= =?us-ascii?q?kb8WC2z+5lykfHkDcIzy7aFoJcv87okh+G0zbwgscSMAXOSgDTzwjqyTD4yAtd?= =?us-ascii?q?JTnhiNt9vUYb+0NygSOaw3yQj/SHhlzgjegBFo/XMJQjWn7N8kIp+xNtolxiqs?= =?us-ascii?q?BGjUaVcN4qJPsMvqtl4LTfA7aU1gwGV9yMeHQjACRM3VF2YzkAckdX1OcIhf5h?= =?us-ascii?q?8CC6konjGIs7FH/gEKejjUFJ+o+o3NncjV2Hk9SsxqynjRpq2fiZMgyGdllM9s?= =?us-ascii?q?7i6SpHQScPTVU81yDXj92IdfzffzZvu3veABVoRm1K6tUPkcPcm/4WG2wollWl?= =?us-ascii?q?e5xrQCGFq0KOADxrPcUyarV2KYXeCLfnOXnzY+NE7y5AWnIkcxaMhUs083KvHC?= =?us-ascii?q?iYJElw39TbN0QT2dpV3bzG0jKeMacAY2uIa7ewMUV+MRYumcJfQ0wPIgElcMaG?= =?us-ascii?q?XJHSRuAe+srVGthJR7O2ln4UjifeTt8wXmPcCOGhkFDYHarYB++figSmKHJ3Bg?= =?us-ascii?q?0AV4PFNo+OfHC1Qxquhcfo6UndjRhNR70ukFeuxvMSInud4TnYRj5peS0MuQdx?= =?us-ascii?q?He0IryL8nPoveEG/3f01gqemZCX7UCfwz14Zk6M8UiW73XGrtZoQgcBbYkT5M8?= =?us-ascii?q?LWvx87t0LAxreA7LeLu0mtXqpv6MZpZMv3/W6VYwIz3GuxwNzfy0SQJ7Youvh3?= =?us-ascii?q?X1J5AwXSxOoMF3ChthB4tPAMIArwyoA5KOn6G7kdCx8Vtgu+AWqarwFuzK1NOh?= =?us-ascii?q?0oV/QZda4U2LPC7PC6Rwg0Vlj+GygvLe3ZnrDcPtZ8kIVO9hQm7KcrXGBJmwKi?= =?us-ascii?q?qSOsLgfE5L67Cd0KpjUhWQeC/2QbGLtCilNPV4+0U01JZ0fO3JzDwi97vbwsf9?= =?us-ascii?q?Z3lHpie/qn6ELJxf7FjUCuHFRxJUTeCK8H15Ha0WcYT06P0OPsI8z9SG5Ql88i?= =?us-ascii?q?hC2tOfI6e9tk/Mxl57dZXDIUvt2iY5X5QKIRumPUsogG/ZsWjdAW9HI8ilM8Zt?= =?us-ascii?q?htGVAgbq50lrlmEnfnRBFXbwRdeNJWgb3NqzZBaU+wJPDtYDmfO3eEE/uqO9Ve?= =?us-ascii?q?loOotKmf+0u7Ufi9lkMCLPS9ZAPyHWMrB2OiFeDvjApFQyZR4Eqbc1UJ8vZZeS?= =?us-ascii?q?OEMHLFuAySTqwAvHy0L7a9ys1KePICYR6XhH0bPF0T5SqAm9uPaZhNDjUb/DYJ?= =?us-ascii?q?HxRv7SPzIvViuGSjQqDUap5VCktuIGvPWCImcfpUsbbzmPCA4VuqBvrd/QDnLc?= =?us-ascii?q?me1jYJ0GnvaaVD7sSCdgjqo9Gj5LtVyQQ/oEDQTWYGXuj3FGuAyjOPBM+Wnob6?= =?us-ascii?q?OcxqVPQOwWA5ZMfuefQ9TGZfBUPy0omSkBOOagY93cqK400lDNTWseCanI7lye?= =?us-ascii?q?TFWNT/ya3T3rWJsav4kutiov4NLQkTd9E77UMLaHuz6u7om4gT6Due3QU2kif0?= =?us-ascii?q?04jeEZDWmf3hZAMmAECtASuEHrWKKAYVhD1G4xg+J0xxAMYBhzUmFp0nBOnva9?= =?us-ascii?q?HctZSVoPgWOrXvIJcV53DDQq/UCW/AL+e9oAtt7PRzwWyrxZUocZLf81+KHLKa?= =?us-ascii?q?AQx7Avxzsgrysk4AuHCFYIrAuA/rGYN6tm2rBYrT064Pp/RF3Vay/OeWjAjIy9?= =?us-ascii?q?AoRAwjk48iOs7Nbdou04bOgSnIp+GlpfRHguKw=3D=3D?= X-IPAS-Result: =?us-ascii?q?A2HQBADo55BY/wHyM5BdHAEBBAEBCgEBFgEBAQMBAQEJAQE?= =?us-ascii?q?BgyiBWRGOUahOJog6VwEBAQEBAQEBAgECXyiCMxuCHAYBAiQTFCAOAwkBARcpC?= =?us-ascii?q?AgDAS0VEQ4LBRgEiUANrgc6JgKLPY9YEQGGAQWBKwGHV4YxfosjApF+AopNhim?= =?us-ascii?q?Sf1h2HgcCESNKXoV5V4V9gi0BAQE?= Received: from unknown (HELO tarius.tycho.ncsc.mil) ([144.51.242.1]) by emsm-gh1-uea11.nsa.gov with ESMTP; 31 Jan 2017 19:44:05 +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 v0VJi42A019935; Tue, 31 Jan 2017 14:44:04 -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 v0VJfhlE015599 for ; Tue, 31 Jan 2017 14:41:43 -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 v0VJfgGB019171 for ; Tue, 31 Jan 2017 14:41:42 -0500 From: James Carter To: selinux@tycho.nsa.gov Subject: [PATCH 2/5] checkpolicy: Create common function for role declares and requires Date: Tue, 31 Jan 2017 14:41:55 -0500 Message-Id: <1485891718-18829-3-git-send-email-jwcart2@tycho.nsa.gov> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1485891718-18829-1-git-send-email-jwcart2@tycho.nsa.gov> References: <1485891718-18829-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 Move common code out of declare_role() and require_role_or_attribute() into the new function create_role(). Signed-off-by: James Carter --- checkpolicy/module_compiler.c | 252 ++++++++++++++++++++++-------------------- 1 file changed, 130 insertions(+), 122 deletions(-) diff --git a/checkpolicy/module_compiler.c b/checkpolicy/module_compiler.c index 0c76bfb..891cadf 100644 --- a/checkpolicy/module_compiler.c +++ b/checkpolicy/module_compiler.c @@ -201,108 +201,143 @@ static int role_implicit_bounds(hashtab_t roles_tab, return 0; } -role_datum_t *declare_role(unsigned char isattr) +int create_role(uint32_t scope, unsigned char isattr, role_datum_t **role, char **key) { - char *id = queue_remove(id_queue), *dest_id = NULL; - role_datum_t *role = NULL, *dest_role = NULL; - int retval; + char *id = queue_remove(id_queue); + role_datum_t *datum = NULL; + int ret; uint32_t value; + *role = NULL; + *key = NULL; + isattr = isattr ? ROLE_ATTRIB : ROLE_ROLE; + if (id == NULL) { yyerror("no role name"); - return NULL; + return -1; } - if ((role = (role_datum_t *) malloc(sizeof(*role))) == NULL) { + + datum = malloc(sizeof(*datum)); + if (datum == NULL) { yyerror("Out of memory!"); free(id); - return NULL; + return -1; } - role_datum_init(role); - role->flavor = isattr ? ROLE_ATTRIB : ROLE_ROLE; - retval = - declare_symbol(SYM_ROLES, id, (hashtab_datum_t *) role, &value, - &value); - if (retval == 0) { - role->s.value = value; - if ((dest_id = strdup(id)) == NULL) { + + role_datum_init(datum); + datum->flavor = isattr; + + if (scope == SCOPE_DECL) { + ret = declare_symbol(SYM_ROLES, id, datum, &value, &value); + } else { + ret = require_symbol(SYM_ROLES, id, datum, &value, &value); + } + + datum->s.value = value; + + if (ret == 0) { + *role = datum; + *key = strdup(id); + if (*key == NULL) { yyerror("Out of memory!"); - return NULL; + return -1; } + } else if (ret == 1) { + *role = datum; + *key = id; } else { - /* this role was already declared in this module, or error */ - dest_id = id; - role_datum_destroy(role); - free(role); - } - if (retval == 0 || retval == 1) { - /* create a new role_datum_t for this decl, if necessary */ - hashtab_t roles_tab; - assert(stack_top->type == 1); - if (stack_top->parent == NULL) { - /* in parent, so use global symbol table */ - roles_tab = policydbp->p_roles.table; - } else { - roles_tab = stack_top->decl->p_roles.table; + free(id); + role_datum_destroy(datum); + free(datum); + + switch (ret) { + case -3: + yyerror("Out of memory!"); + break; + case -2: + yyerror("duplicate declaration of role"); + break; + case -1: + yyerror("could not declare role here"); + break; + default: + abort(); /* should never get here */ } - dest_role = (role_datum_t *) hashtab_search(roles_tab, dest_id); - if (dest_role == NULL) { - if ((dest_role = - (role_datum_t *) malloc(sizeof(*dest_role))) == - NULL) { + } + + return ret; +} + +role_datum_t *declare_role(unsigned char isattr) +{ + char *key = NULL; + role_datum_t *role = NULL; + role_datum_t *dest_role = NULL; + hashtab_t roles_tab; + int ret, ret2; + + ret = create_role(SCOPE_DECL, isattr, &role, &key); + if (ret < 0) { + return NULL; + } + + /* create a new role_datum_t for this decl, if necessary */ + assert(stack_top->type == 1); + + if (stack_top->parent == NULL) { + /* in parent, so use global symbol table */ + roles_tab = policydbp->p_roles.table; + } else { + roles_tab = stack_top->decl->p_roles.table; + } + + dest_role = hashtab_search(roles_tab, key); + if (dest_role == NULL) { + if (ret == 0) { + dest_role = malloc(sizeof(*dest_role)); + if (dest_role == NULL) { yyerror("Out of memory!"); - free(dest_id); + free(key); return NULL; } role_datum_init(dest_role); - dest_role->s.value = value; - dest_role->flavor = isattr ? ROLE_ATTRIB : ROLE_ROLE; - if (role_implicit_bounds(roles_tab, dest_id, dest_role)) { - free(dest_id); - role_datum_destroy(dest_role); - free(dest_role); - return NULL; - } - if (hashtab_insert(roles_tab, dest_id, dest_role)) { - yyerror("Out of memory!"); - free(dest_id); - role_datum_destroy(dest_role); - free(dest_role); - return NULL; - } + dest_role->s.value = role->s.value; + dest_role->flavor = role->flavor; } else { - free(dest_id); - } - } else { - free(dest_id); - } - switch (retval) { - case -3:{ - yyerror("Out of memory!"); - return NULL; + dest_role = role; } - case -2:{ - yyerror("duplicate declaration of role"); + ret2 = role_implicit_bounds(roles_tab, key, dest_role); + if (ret2 != 0) { + free(key); + role_datum_destroy(dest_role); + free(dest_role); return NULL; } - case -1:{ - yyerror("could not declare role here"); + ret2 = hashtab_insert(roles_tab, key, dest_role); + if (ret2 != 0) { + yyerror("Out of memory!"); + free(key); + role_datum_destroy(dest_role); + free(dest_role); return NULL; } - case 0:{ - if (ebitmap_set_bit - (&dest_role->dominates, role->s.value - 1, 1)) { - yyerror("out of memory"); - return NULL; - } - return dest_role; - } - case 1:{ - return dest_role; /* role already declared for this block */ + } else { + free(key); + if (ret == 1) { + role_datum_destroy(role); + free(role); } - default:{ - abort(); /* should never get here */ + } + + if (ret == 0) { + ret2 = ebitmap_set_bit(&dest_role->dominates, dest_role->s.value - 1, 1); + if (ret2 != 0) { + yyerror("out of memory"); + return NULL; } } + + return dest_role; } int create_type(uint32_t scope, unsigned char isattr, type_datum_t **type) @@ -881,61 +916,34 @@ int require_class(int pass) static int require_role_or_attribute(int pass, unsigned char isattr) { - char *id = queue_remove(id_queue); + char *key = NULL; role_datum_t *role = NULL; - int retval; + int ret; + if (pass == 2) { - free(id); + free(queue_remove(id_queue)); return 0; } - if (id == NULL) { - yyerror("no role name"); - return -1; - } - if ((role = malloc(sizeof(*role))) == NULL) { - free(id); - yyerror("Out of memory!"); + + ret = create_role(SCOPE_REQ, isattr, &role, &key); + if (ret < 0) { return -1; } - role_datum_init(role); - role->flavor = isattr ? ROLE_ATTRIB : ROLE_ROLE; - retval = - require_symbol(SYM_ROLES, id, (hashtab_datum_t *) role, - &role->s.value, &role->s.value); - if (retval != 0) { - free(id); - role_datum_destroy(role); - free(role); - } - switch (retval) { - case -3:{ - yyerror("Out of memory!"); - return -1; - } - case -2:{ - yyerror("duplicate declaration of role"); - return -1; - } - case -1:{ - yyerror("could not require role here"); + + free(key); + + if (ret == 0) { + ret = ebitmap_set_bit(&role->dominates, role->s.value - 1, 1); + if (ret != 0) { + yyerror("Out of memory"); return -1; } - case 0:{ - /* all roles dominate themselves */ - if (ebitmap_set_bit - (&role->dominates, role->s.value - 1, 1)) { - yyerror("Out of memory"); - return -1; - } - return 0; - } - case 1:{ - return 0; /* role already required */ - } - default:{ - abort(); /* should never get here */ - } + } else { + role_datum_destroy(role); + free(role); } + + return 0; } int require_role(int pass)