From patchwork Tue Jan 31 19:41:56 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Carter X-Patchwork-Id: 9548301 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 8162860425 for ; Tue, 31 Jan 2017 19:44:10 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 7330427F81 for ; Tue, 31 Jan 2017 19:44:10 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 6813328304; Tue, 31 Jan 2017 19: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=-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 9B88627F81 for ; Tue, 31 Jan 2017 19:44:09 +0000 (UTC) X-IronPort-AV: E=Sophos;i="5.33,315,1477958400"; d="scan'208";a="2769887" IronPort-PHdr: =?us-ascii?q?9a23=3ABVUKbRwq9mq1XyTXCy+O+j09IxM/srCxBDY+r6Qd?= =?us-ascii?q?1egSLPad9pjvdHbS+e9qxAeQG96Kt7Qa1qGP6f6ocFdDyK7JiGoFfp1IWk1Nou?= =?us-ascii?q?QttCtkPvS4D1bmJuXhdS0wEZcKflZk+3amLRodQ56mNBXdrXKo8DEdBAj0OxZr?= =?us-ascii?q?KeTpAI7SiNm82/yv95HJbQhFgDWwbalzIRi2ogndq9cajIp/Iast1xXFpWdFdf?= =?us-ascii?q?5Lzm1yP1KTmBj85sa0/JF99ilbpuws+c1dX6jkZqo0VbNXAigoPGAz/83rqALM?= =?us-ascii?q?TRCT6XsGU2UZiQRHDg7Y5xznRJjxsy/6tu1g2CmGOMD9UL45VSi+46ptVRTnhj?= =?us-ascii?q?0HNzok+2/JjMJ+gr9QrBa4qxBh34LYZYeYP+d8cKzAZ9MXXWpPUNhMWSJPAY2y?= =?us-ascii?q?aIkAD+QZPetasoXwqVQBogexCwayH+Pi0SNIi33s0KEmyektDR/K0Qo9FNwOqn?= =?us-ascii?q?TUq9D1Ob8WX++vyanH0y7DZO5I1Djn8ojIbg4uoeuRVr93c8rQx1UgGBnfjlWM?= =?us-ascii?q?t4DoJC+V1+QRvGib6OpsT+Svi3U9pA1rrTivwdksh5DPi4kIyV7E7T10zJs6KN?= =?us-ascii?q?C3UkJ2YcOoHIFOuyyVKYd6WN4uTmd1sygg0LIGo4S0fC0SxZQiwB7QduKIfpCT?= =?us-ascii?q?4hLmSOaROTB4hG95eL6nhxa970ygyurkW8moyllKtCtFksTXtnwXyxzS6tSISv?= =?us-ascii?q?t6/ku73zaAyxvT5f1eLUAxlKrbL4Ytwr82lpUNrUTOBjL6lUr5gaOMdkgo5/Kk?= =?us-ascii?q?5/rob7n4vJOQKpd4igTkPaQvnsy/D/44Mg8LX2WD4uSzyrnj/Uz/QLVXgfw6i7?= =?us-ascii?q?LWsJfHJcQduqG2HRRV350/6xe/Ezim0NMYkWMBLFJeYh2LlYfpO1bQIPzgF/ew?= =?us-ascii?q?n0yskCt3x/DBJrDhAJLNLn7Zn7f9fbZy8UhcxRExzdBY4ZJUD6sOIOnvWkDvrt?= =?us-ascii?q?zYFQU1Mwuuw+boEN99zJ8RWXqTAq+FN6PfqV2I5uA1LOaQZ48VozH9K/4k5/7w?= =?us-ascii?q?lnI5l1sdfbSm3JQMdXC4GOhmI1iDbXrrmNcBHn8AvhAiQ+zylF2CTTlTam6qX6?= =?us-ascii?q?0i/T40FoSmDYbfRoCqm7GB3Tm0EYNIaWxcDVCMC3jofZ2eW/gQcCKSPtNhkjsc?= =?us-ascii?q?WLe8TI8h0xeuuxLkxLpjL+rZ4TcXuoz51Nhy/eHTkgsy9TNsBcSHz26NV310nn?= =?us-ascii?q?8PRzIuwa9/vVZyyk2Y3KdkhPxYEMBc6OlSUgcmL5LcyfJ1C8zqUALbYtiJUEqm?= =?us-ascii?q?QsmhATwpT9IxxcMObFh5G9q8ixDMwTaqA6UVlrGQA5w06rzT3370J8lnynbG0L?= =?us-ascii?q?Iuj14pQ8dVMm2mnKF//RDJB4HVi0WZi7qqdaME0S/N9WaDymyOsVpdUA50SKnF?= =?us-ascii?q?XHYfalHQrdvj/EPCTL6uCao5PQdbz86NNLdKYMXzjVpaXPfjJMjeY2WplmiuHR?= =?us-ascii?q?aH3KmMbIvxe2gGxCXSElIEkwEI/XaeMQgxHDuurHzEADxpD1LvbFvm8fNip3Oj?= =?us-ascii?q?Uk800waKYlVv1rq0/h4VgOKTS+kI07IKpigutjJ0HEyn0NLOEdqAoAhhc7tAbt?= =?us-ascii?q?Mh+ltH0njZtwNlNJy6M69inkIecxhwv0722RV3EJ9Pkc42o3Mr1wp/MqeY0EtA?= =?us-ascii?q?dz+BxpDxNKbXJnP1/BC1ZK7cwkve38qO+qcT9PQ4rE3uvAKzGUoh9HVnzsJY03?= =?us-ascii?q?iG6ZXJCwoSTIj9UkEt9xh1v7vaeDUy55vI1X1wNqm5qiXN1M8zBOsk1BmgZcxS?= =?us-ascii?q?P7mYGw/3CcEaANKuKOMykVizch0EJPxS9LIzP86+a/SJwqqrM/h7nDK6jWVH55?= =?us-ascii?q?tw0lmQ+Cp9VOHI2YoFw/CC0QedUTfzkkuhuNjtmY9YfTESAna/yS/8CY5ReKJy?= =?us-ascii?q?eYILCWC1Ls2z29V+m5ntW3tC+1K5AFMGwsCpcwKIb1PhxQ1QyVgXoXu/lCujwT?= =?us-ascii?q?x0iTYprrGD3CHV2OTich0HO2BORGZ4i1fgO460gM4GXEKwdQgmiAOl5Vrmx6hc?= =?us-ascii?q?vKl+IXPcQUNUfyfoNWFiSbC9tqScbM5V85worCBXXP67YVCARb73uwEa3D/7H2?= =?us-ascii?q?tC2DA7cCmnuonkkBNniWKSNnJzoWHFdsF3wBfQ+MbTReVN3jYcQil3lyXXDECm?= =?us-ascii?q?P9a15dWUi4vDsuemWmKnV51TdS3rwp2btCag/2JlHwe/n/eplt3gCwg63jfx18?= =?us-ascii?q?N2WiXQsBb8fo7r2rykMeJmYkZoGFj869BgFo5ikoswg5cQ2XcBi5WR/HoHl338?= =?us-ascii?q?Mc9c2a7ka3oNXzELycbP4Af5wE1jMm6Jx4XhW3WZw8thfMW6bnoN2i0j68BKCa?= =?us-ascii?q?GU7KFLnCZuuVq4tQPRYf58njgB0vsi8ngajP8VuAA11CWSHqgSHVVEPSzrjxmI?= =?us-ascii?q?9de+rKFTZGmxa7i/yE1+nN66AbGZvwFTRG35do0lHS9q4cV1KEjM32Hr6oH4ZN?= =?us-ascii?q?nQasoetgWOnBfdi+hZMog+muARiipgPWL9oXoly+gggBxrwZ26uo+HJHl38KK/?= =?us-ascii?q?HBFYKiX/Z9kP9TH1kaZegsGW0pisHpp/HDULR4DlTfG2HzIUrvTnMRiBECEmpn?= =?us-ascii?q?ecA7rfEheV6F16oHLXD5CrK3aXKWEBzdp4WRmdIFJQgBgOUzU8gp42CBqqydf8?= =?us-ascii?q?cEdi+D8R/EX4pgFXyuJvKhn/SHvQqxmmajczUpifIwRZ4htE50jLLcyU9vhzED?= =?us-ascii?q?1A/p29sAyNLXSWZxpODW4UQUGEGVbjMaSu5dXa9eiXGPa+JePUYbqSsexeS+uI?= =?us-ascii?q?xZW334t+5TmMK8GPM2J+AP06xkpCXWl1G8rDlDUJUSAXkDjNb8GDrhem5iJ3tt?= =?us-ascii?q?y/8OjsWA/35ouOC79SPst09hCzhqeDOeCQizhlKTZE1pMMwnrIx6YF0F4UlS5u?= =?us-ascii?q?ayGnEa4cui7VUKLQhqhXAgYVayxpMstI86U83gxWNM7VlNz6y7l4juQvBFddT1?= =?us-ascii?q?zhncOpatIWLGGhLl/HA1yLNLueLz3R3873eb+8SaFXjOhMqhKwvyyUHlT+MTSF?= =?us-ascii?q?jTblTRevMftDjCuDJhxRpJm9cgpxCWjkVN/mcAe3MdFtgT0z27I0gnTKNG4HPD?= =?us-ascii?q?dmb0xNq6ec7SRCgvVwA2ZB9GZqLfGYmyaF6OnVMpAWseFxDSRsj+JX+3o6y7pP?= =?us-ascii?q?7CFfWPx1lirSrth0rFGgjuaPyyBoUB5UpjZMnoKLsl1oOb/F+ZlYRXbE4BUN4H?= =?us-ascii?q?2NBBQRudRqENLvu7pKxdjRj6/zMy1N89HJ/csGHcfYMsaHMGcnMRXzAj7YFRcF?= =?us-ascii?q?TTmoNWDfgExRiveS+WOJrpIisJjjhIIOSqNHVFwyDv4VEUVlHNMFIJdxRT4rjK?= =?us-ascii?q?CUg9UJ5XWkqhndXsJavorIVviKG/XgNC6ZjaVYZxsP2b73N4sTOZfl20N8cVR6?= =?us-ascii?q?m5zKFFTWXdBIuCJhbws0r15K8HlxVGEz3Fjlagy16n8JCfG0hgI2ihd5Yek16D?= =?us-ascii?q?fs5FI3KkDQpCs3kUg+h9PljiuLcD72MqiwXppbBDbzt0g0Lpz0WR11bRGokUxi?= =?us-ascii?q?KjjEW6pbj6F8emBzlA/cpZxPFOZaTaJaehAQweqaZ/Yv0VRHtiWo30lH5fDGCZ?= =?us-ascii?q?tjjgcqd4Cjr25Y0QJ5cNE1PbDQJLZOzlVInKKBoDSo2f4rzw8EO0kN8HifdzUJ?= =?us-ascii?q?uEwSK7YmICSo/vR26QOcmzpPYm4MWOQ2ovhy7EMyJ/yAzz78075EMk2+KvaQL7?= =?us-ascii?q?2Yu2fdjs6FWUk/1lkSl0lC87l2ytksfFaJV0A1zbuRCxQIOdDEKQ5Lc8pY7GLT?= =?us-ascii?q?cjqWseXR3ZJ1OJ2wFu7yTeCQqakUmVirHAA1H4QL9cQMBYOj313dLcv9K74F0x?= =?us-ascii?q?ot7hzxJFqZFPRJZA6LkDAfrsG7y593x5dSJjccAGV6Kii36bDXphIwjPqERtc2?= =?us-ascii?q?bW8QXpEYOXIuRM26hylZsmxbDDap1uIZyQ6C7yLzpynLEDb8aN9ja+uOahN3FN?= =?us-ascii?q?G64zM//LaqiVTP6JXRO3n6Nch+ut/I8e4VuoqIC/ZTTbl7r0fQhpJVR2K0XG7V?= =?us-ascii?q?EN60Jp/wa482YdzyFHm6TkS1iygpQMfpINatMq+IjBnrRYZOsIiUxjYjNdO9Fj?= =?us-ascii?q?wFFBdwoPkD675maQ0FfZU7fQbitx4iOKynPAeYztKuTn6xKTtXSvlfyvm6Z7xX?= =?us-ascii?q?zic3c+C6yXshQYshwOWt904CWo0KhAnExfm/f4leTTTzGntFdgXAvyo2jW5hNv?= =?us-ascii?q?opz+c+xxPJv18cMyyLdON3aWxEuc08Ck2IIXlsDGo3WUOch5LZ4gGwx7AS4zdd?= =?us-ascii?q?n9FM3OJftHj+v4PQbyy0V6yuqZTVtS0gbd48rKBqKoPjI9GJtJXHkjzRUZncqA?= =?us-ascii?q?uFXzCmF/BCgNhfPDpYQOVUmWEiIcEJopRO6UwqW8gkOrNPFrcjpqqxaTV+Fy4T?= =?us-ascii?q?zTUVV4Sa3DwNmu28wafVlg+McJQ+NxwJqI9Cgt0cUyFqYiMeo6ujV57OmWGdV2?= =?us-ascii?q?YFOhse4wNX6Q0ckY9we/zq75DTTJ9Q0TJWpex7UjfTHJly61T7Un2WgUT/SPi5?= =?us-ascii?q?j+Op3xhdw+7339YHXx5/DUxdx+dImUsyNLF4NbUfvo7Qvj+Pb0P6s3rnyPG6K1?= =?us-ascii?q?lJ1c3Ua1r4AZLftWXmSC0c/mYbSJRTyHHFD5sSjRR2aKIqpFVKL4Cmfkf+5zMk?= =?us-ascii?q?x4R1Ebm3T9qrx1M/oXYAWSiqD8JLC/t6v1LPRD1lf5erpY3rOplIXmBQ+Jydq1?= =?us-ascii?q?JYkEp3MC600ptcJN9T7TESRjRPpi+dvNSqQs1ZxcB2F4MMIst4u3rlAKNEP5yR?= =?us-ascii?q?rGcsur3hzX/Z/z48vUy/xDW0HK+4VPxW8HEEGgUuPGSesUgvD+0j8mvI9VDNqF?= =?us-ascii?q?909f9BBreTlUVxvCp9HpdWCzlTz3ClMlJzQGNFs+hBKaTVcs1cQ+UpahO1PRwx?= =?us-ascii?q?C+Im1VST/U5ohXf5fzBytgxC9iDBWAk0UDIYgqvxlT0bsc6rIzkaRIxUbT85dS?= =?us-ascii?q?fKNxqbmTxLvBZYc0xqW4oWAsxf9LEfwIRZ5dfNRli0KSEdQhNiMhw30eBFmU5E?= =?us-ascii?q?qkWYdjjXDRC0evbXrh13YcCRodarLPT+4ghKkZ7ov/4j96odXX2mhROiTs3Eo4?= =?us-ascii?q?/6qNKKqlOEdL3kPO2kfX/BUD/MgAirircqE5bG4yrePBdVJpRh1XUkZp3hBnLR?= =?us-ascii?q?MhRdO6IXPUxbWr5mad9euOBVe9dkeLoV+a9qHh+HXA3gF5GvrPZcMlbeXjDeLy?= =?us-ascii?q?Kf8uOhv47c8bvdRvX+acCWwXbIXb53NI9g6TbnA7fqzZNe+k3u1/d17UN6VULJ?= =?us-ascii?q?PD2drNn6PQML49SidlH+sZI3GzPWHI1wn2Dpxk1acMoXWSKq+owCyJxF8HbwVf?= =?us-ascii?q?540k/rve1O7blr95c47K1yxMepIafSNe5avlV5AhiVAQVq8osiAHRlS2BWeO8R?= =?us-ascii?q?J+/bfb4FgsD2t+D3C6sX5QWQ++NDbdvHI1/OmtWjCj6GUxNJhwEBpiAGLguHy/?= =?us-ascii?q?GKgbd0Rti/qej/xE0t/0C0LgQaw7B1+YeE5q2IqffVbxTL17gEXbPqRsfpobQy?= =?us-ascii?q?oE6S4OAklLoSemx0fwKnEfISVsgGxmv6yqAq1y0sGdvZH7384P5DS245njX4lp?= =?us-ascii?q?B/BVoWHP0UHaCM/YtDgGg1gPDZOccQcqBZnWaDDxikHaEeyXSz8SuYPHFlgg3S?= =?us-ascii?q?0xH3WW6z40L2rS58QSvI0djjl1FYWaSpCkhJXiqmI0l4vCmIPAryu9r9ob4141?= =?us-ascii?q?0uMmz4qNKNk3OsOLVTH8DkJdycJyw0qEgWjJ03SNyvw5oUGcGhINcL7XFxcufe?= =?us-ascii?q?636xkyBfuatHgJDe4s6N8PXNAXagl7Gaq6mKxD1Az3g4ulc/6syvNv7Q/NCKRv?= =?us-ascii?q?Wo2HwXTyhhpwvAURm1qqbYr1API0CL1lnEmJASNNFDwXY4zl3m5PQkQN8r7gVR?= =?us-ascii?q?C5vPaugNpTD2Nzr421CfbMwrViOGyTtYAkr1EUVkGKg7wG/wuNnJlXLQ9lAzSI?= =?us-ascii?q?l/aVHohRttD4oiMUIt8l8XwigdHgcRdRCXFraoBV7qLYEcT0gMdQyH3KSmeqcw?= =?us-ascii?q?xUBz2amg5PHJYuxzGaUNLe1QjhWUk1hFAJ0WvrMRQKlmd19b6qHXuhDoC5L7UP?= =?us-ascii?q?j+iXowKfq1T9hY8cAYsnsv+QO/SASg6Jhd9bYbiZaIdqFebZjKos98819t5SQT?= =?us-ascii?q?eSxVnBh/kxS5XPgdpOHi+NfUqoan5/21VKkzW+UY6QQ7C355j5vqj1ApucvX2P?= =?us-ascii?q?tESo3JlYT/9xhALGWLuIbB3RhzM+gOK4O3fLZ47XoHOiweKmkSMtqRdvYz/TVi?= =?us-ascii?q?MCjJ51xFGMMDf8kUPM3XmQBbkkfpQq1c9tLHGl+EDId+b9go4HDryD8p8Zs9XO?= =?us-ascii?q?Hg6CW1JZzG9FFCIfdDjCRqlNLfq+kY2uLSBzIL4XaFaxh0zCSCy4OOC/rq/uWD?= =?us-ascii?q?1svUV1UYES4ySYtdIyCC+QO/TOqviJrpSh+U6tP0gJ8maEKQXGK+nKAfvaZKD+?= =?us-ascii?q?FNkTj03jlRFoD0m/KaqcGs53FNtl1aCopz6wPKGLlHNJVhJRv4jtWrRlR7Bibn?= =?us-ascii?q?d8HbbAAut/SKxucM+Oh+M0r+ZZMFLRIE0b369GFVQhFoSLHoolaTRfgRa8d+SP?= =?us-ascii?q?PYsnBV7pptK6ARM1ibuJzqqTBIpFctAAA3bL8wrzpadlTBnQBOX6b7pqQAiwsG?= =?us-ascii?q?XtJjv09DB36wMnok5zXbTaRVkLWRCPsN/zWVT6wBT0JoMidkTBOuwpluerypnf?= =?us-ascii?q?dcsmNdhS59pfcn0jN8SBu7oy3sqLoH2Sg897GgqDUBpXtFQ/2RkyjUElVD1+0G?= =?us-ascii?q?g7oTBXjk6Fy8ZmQDbYTp7bloIMTv748h7GolbRUkZS0GUvyqCzvsgKOQHoyPrN?= =?us-ascii?q?VciQaPuMXJbb+zKzIeOag9yRLnWnhyzwnfnBdu8GsQQTWg7cQpJJu8OcY73CWo?= =?us-ascii?q?HXXUdFcW7qNPrsTxqUYBTPEqZlN53GVjzs+HSzUMRMzRAWk1iBMpaWFZcJ1e6B?= =?us-ascii?q?8aELIojiyPvqlc8QEeeC3UHZi9+onMgcfI3mEwTdV0yWLYqK2Fgogn0XN/lNNy?= =?us-ascii?q?8CGOpG4ed+rGXM9wGnLzzJtQyfTiZ/WxteAKUIRmyLCmUP4MLMaj/W+21Y5xWk?= =?us-ascii?q?+iwLQeHka2PPUFxrjFTyevUXeYVviTc2iQgzY5NVb/5RuoLlw3cMdKqEs9Mure?= =?us-ascii?q?hpFCjADhVLJ0RjmKpVDF1mAjNvkadw0usoe9ZwMKVPIRZ/SbJeU23P0+CV4MYm?= =?us-ascii?q?TVHSt3F+C2skCinIxhN3Vm/0r6ffzn8hr6P9uKBhkEDYnao4Z0+fy7RWKBOnhg?= =?us-ascii?q?wQZwPEZu9OffEFIxufFac5qLm9jfmch72/Yfd/hxKS09psITmoV75IaPzsiKdw?= =?us-ascii?q?3Rw43pJdHRpfiYH+Hfz1o0dW5HSLYZZhn154oiNN4jR7LTBadZvQgbBaUiTpwu?= =?us-ascii?q?KWPx9KBsLAxtaQPQZbW0gszvpu2VfJtUo2HZ4kg3LCfGtB0J0ua0QhBjb5C2m3?= =?us-ascii?q?XyJ4g9RzxZr913CxtpAJVAFtgFrwqmH56Ugr+0h8W2+0NgtO8AqbDwBezS1NSl?= =?us-ascii?q?w4VxWIBX5UuPPDnPH6RrmkBlgf6pgvfc05n+Fd/ieckaW+dlWGLFbKHJHpmnID?= =?us-ascii?q?KUJs38Y1JG86Kb0L9hVhWRZSb5X7eJtSG9MPVk4F47ypBjfOfIzTwi9bfb2Nzo?= =?us-ascii?q?a2FcvCejomaDNIFD41zSGezeQxVUROKe8Gl7Ga0XbI309PoBMNAlz9ac/wlz4y?= =?us-ascii?q?pY0MSbO6iutFTB2kFlepLBKkvmxSI5VpIXIBSwK0cshnXZqnvFC3RGMsekMdVt?= =?us-ascii?q?gMqSDhH14kl+g30iZm5AGmruQtecInYb28O4ZAKU8AJLDtADn/O4eEIisa2yU+?= =?us-ascii?q?ZoMI1fmeq2rLUHjcppKybXSchYJS7QL7h2MSFKA+XSolgofh4Es78oWoc6ZZiO?= =?us-ascii?q?PFkLMEGexiPu1QHCy1H7d8Sw1KaVJyYb6m5IwKnC3ThIpgm5ouqZgtb5XLDCcp?= =?us-ascii?q?75QOTeMDE7WTGeRDQyF1up+Fi/tvUYvPuYO3ofoksObiOcEgETurtvrd/WDmPJ?= =?us-ascii?q?nu1jZpIKjuiAWy/sUC14iLYyBiFTuECDWfUMDhPWb37/j2pYowGiOPtM8mj+b7?= =?us-ascii?q?2Z26pZQeoWDZVQcveBWdvXZeheJys0ljUeIOu8fdjcr7Ej0lLSTGsZCLLF9FuE?= =?us-ascii?q?Q06TXPOcxijnXYIPv4g7oiAo4M7fnjdrE6TUOLaSvyWu8oC9jCmEuODTVXIgY1?= =?us-ascii?q?Irj+IYAWmAwR5AKGceB9ETpk7tXraKZ1xQ23IxleJuxxgMdRxxUn1p1H1WmO2w?= =?us-ascii?q?GshHRlEJgmOuR+cGY0xpAz8q+0+F/BHyMpQ8vpXISmtf8KYcYZYMJ/kvro/MMe?= =?us-ascii?q?0fx+h68ihhpXkYuiCQFBt2hxiZ/rCYSKBjzbRY+TMQ4+B9XkbJRSjWNGfA1Nz1?= =?us-ascii?q?WIp02S5yrCW8hILvted3Oe4f/dl0?= X-IPAS-Result: =?us-ascii?q?A2FIBADo55BY/wHyM5BdGwEBAQMBAQEJAQEBFgEBAQMBAQE?= =?us-ascii?q?JAQEBgyiBWRGOUahOJoV5gkFXAQEBAQEBAQECAQJfKIIzG4IcBgECJBMUIA4DC?= =?us-ascii?q?QEBFyEICAgDAS0VEQ4LBRgEiUANrgc6JgKLPY9YEQFkDYUQBYErAYdXhjF+iyM?= =?us-ascii?q?CkX4Cik2GKZJ/WHYeBwIRI0peg14cgX9XhX2CLQEBAQ?= 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:08 +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 v0VJi77a019963; Tue, 31 Jan 2017 14:44:07 -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 v0VJfhCC015602 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 v0VJfgGC019171 for ; Tue, 31 Jan 2017 14:41:42 -0500 From: James Carter To: selinux@tycho.nsa.gov Subject: [PATCH 3/5] checkpolicy: Create common function for user declares and requires Date: Tue, 31 Jan 2017 14:41:56 -0500 Message-Id: <1485891718-18829-4-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_user() and require_user() into the new function create_user(). Signed-off-by: James Carter --- checkpolicy/module_compiler.c | 224 +++++++++++++++++++++--------------------- 1 file changed, 114 insertions(+), 110 deletions(-) diff --git a/checkpolicy/module_compiler.c b/checkpolicy/module_compiler.c index 891cadf..90e82c2 100644 --- a/checkpolicy/module_compiler.c +++ b/checkpolicy/module_compiler.c @@ -456,103 +456,132 @@ static int user_implicit_bounds(hashtab_t users_tab, return 0; } -user_datum_t *declare_user(void) +int create_user(uint32_t scope, user_datum_t **user, char **key) { - char *id = queue_remove(id_queue), *dest_id = NULL; - user_datum_t *user = NULL, *dest_user = NULL; - int retval; - uint32_t value = 0; + char *id = queue_remove(id_queue); + user_datum_t *datum = NULL; + int ret; + uint32_t value; + + *user = NULL; + *key = NULL; if (id == NULL) { yyerror("no user name"); - return NULL; + return -1; } - if ((user = (user_datum_t *) malloc(sizeof(*user))) == NULL) { + + datum = malloc(sizeof(*datum)); + if (datum == NULL) { yyerror("Out of memory!"); free(id); - return NULL; + return -1; } - user_datum_init(user); - retval = - declare_symbol(SYM_USERS, id, (hashtab_datum_t *) user, &value, - &value); + user_datum_init(datum); - if (retval == 0) { - user->s.value = value; - if ((dest_id = strdup(id)) == NULL) { + if (scope == SCOPE_DECL) { + ret = declare_symbol(SYM_USERS, id, datum, &value, &value); + } else { + ret = require_symbol(SYM_USERS, id, datum, &value, &value); + } + + datum->s.value = value; + + if (ret == 0) { + *user = datum; + *key = strdup(id); + if (*key == NULL) { yyerror("Out of memory!"); - return NULL; + return -1; } + } else if (ret == 1) { + *user = datum; + *key = id; } else { - /* this user was already declared in this module, or error */ - dest_id = id; - user_datum_destroy(user); - free(user); - } - if (retval == 0 || retval == 1) { - /* create a new user_datum_t for this decl, if necessary */ - hashtab_t users_tab; - assert(stack_top->type == 1); - if (stack_top->parent == NULL) { - /* in parent, so use global symbol table */ - users_tab = policydbp->p_users.table; - } else { - users_tab = stack_top->decl->p_users.table; + free(id); + user_datum_destroy(datum); + free(datum); + + switch (ret) { + case -3: + yyerror("Out of memory!"); + break; + case -2: + yyerror("duplicate declaration of user"); + break; + case -1: + yyerror("could not declare user here"); + break; + default: + abort(); /* should never get here */ } - dest_user = (user_datum_t *) hashtab_search(users_tab, dest_id); - if (dest_user == NULL) { - if ((dest_user = - (user_datum_t *) malloc(sizeof(*dest_user))) == - NULL) { + } + + return ret; +} + +user_datum_t *declare_user(void) +{ + char *key = NULL; + user_datum_t *user = NULL; + user_datum_t *dest_user = NULL; + hashtab_t users_tab; + int ret, ret2; + + ret = create_user(SCOPE_DECL, &user, &key); + if (ret < 0) { + return NULL; + } + + /* create a new user_datum_t for this decl, if necessary */ + assert(stack_top->type == 1); + + if (stack_top->parent == NULL) { + /* in parent, so use global symbol table */ + users_tab = policydbp->p_users.table; + } else { + users_tab = stack_top->decl->p_users.table; + } + + dest_user = hashtab_search(users_tab, key); + if (dest_user == NULL) { + if (ret == 0) { + dest_user = malloc(sizeof(*dest_user)); + if (dest_user == NULL) { yyerror("Out of memory!"); - free(dest_id); + free(key); return NULL; } user_datum_init(dest_user); - dest_user->s.value = value; - if (user_implicit_bounds(users_tab, dest_id, dest_user)) { - free(dest_id); - user_datum_destroy(dest_user); - free(dest_user); - return NULL; - } - if (hashtab_insert(users_tab, dest_id, dest_user)) { - yyerror("Out of memory!"); - free(dest_id); - user_datum_destroy(dest_user); - free(dest_user); - return NULL; - } + dest_user->s.value = user->s.value; } else { - free(dest_id); - } - } else { - free(dest_id); - } - switch (retval) { - case -3:{ - yyerror("Out of memory!"); - return NULL; + dest_user = user; } - case -2:{ - yyerror("duplicate declaration of user"); + ret2 = user_implicit_bounds(users_tab, key, dest_user); + if (ret2 != 0) { + free(key); + user_datum_destroy(dest_user); + free(dest_user); return NULL; } - case -1:{ - yyerror("could not declare user here"); + ret2 = hashtab_insert(users_tab, key, dest_user); + if (ret2 != 0) { + yyerror("Out of memory!"); + free(key); + user_datum_destroy(dest_user); + free(dest_user); return NULL; } - case 0:{ - return dest_user; - } - case 1:{ - return dest_user; /* user already declared for this block */ - } - default:{ - abort(); /* should never get here */ + } else { + free(key); + if (ret == 1) { + user_datum_destroy(user); + free(user); } } + + return dest_user; } /* Return a type_datum_t for the local avrule_decl with the given ID. @@ -987,53 +1016,28 @@ int require_attribute(int pass) int require_user(int pass) { - char *id = queue_remove(id_queue); + char *key = NULL; user_datum_t *user = NULL; - int retval; + int ret; + if (pass == 1) { - free(id); + free(queue_remove(id_queue)); return 0; } - if (id == NULL) { - yyerror("no user name"); - return -1; - } - if ((user = malloc(sizeof(*user))) == NULL) { - free(id); - yyerror("Out of memory!"); + + ret = create_user(SCOPE_REQ, &user, &key); + if (ret < 0) { return -1; } - user_datum_init(user); - retval = - require_symbol(SYM_USERS, id, (hashtab_datum_t *) user, - &user->s.value, &user->s.value); - if (retval != 0) { - free(id); + + free(key); + + if (ret == 1) { user_datum_destroy(user); + free(user); } - switch (retval) { - case -3:{ - yyerror("Out of memory!"); - return -1; - } - case -2:{ - yyerror("duplicate declaration of user"); - return -1; - } - case -1:{ - yyerror("could not require user here"); - return -1; - } - case 0:{ - return 0; - } - case 1:{ - return 0; /* user already required */ - } - default:{ - abort(); /* should never get here */ - } - } + + return 0; } static int require_bool_tunable(int pass, int is_tunable)