From patchwork Tue Nov 29 21:05:48 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Carter X-Patchwork-Id: 9453127 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 DD73B6071C for ; Tue, 29 Nov 2016 21:06:28 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id CE92D2833B for ; Tue, 29 Nov 2016 21:06:28 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id C14B428389; Tue, 29 Nov 2016 21:06:28 +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]) (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 E5F702833B for ; Tue, 29 Nov 2016 21:06:27 +0000 (UTC) X-IronPort-AV: E=Sophos;i="5.31,570,1473120000"; d="scan'208";a="1142102" IronPort-PHdr: =?us-ascii?q?9a23=3A5j2UahCNBK+an9xIxV+qUyQJP3N1i/DPJgcQr6Af?= =?us-ascii?q?oPdwSPr5r8SwAkXT6L1XgUPTWs2DsrQf2rGQ6P+rAzNaqb+681k6OKRWUBEEjc?= =?us-ascii?q?hE1ycBO+WiTXPBEfjxciYhF95DXlI2t1uyMExSBdqsLwaK+i764jEdAAjwOhRo?= =?us-ascii?q?LerpBIHSk9631+ev8JHPfglEnjSwbLd8IRmsowjctMYajZVgJ6ov1xDEvmZGd+?= =?us-ascii?q?NKyG1yOFmdhQz85sC+/J5i9yRfpfcs/NNeXKv5Yqo1U6VWACwpPG4p6sLrswLD?= =?us-ascii?q?TRaU6XsHTmoWiBtIDBPb4xz8Q5z8rzH1tut52CmdIM32UbU5Uims4qt3VBPljj?= =?us-ascii?q?oMODAj8GHTl8d+kqRVrhy8rBB72oLYfp2ZOP94c6jAf90VWHBBU95RWSJfH42y?= =?us-ascii?q?YYgBAe0ZPetasoXwqVQBogexCwayH+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/DBJrDuHI3NIWLZkLfgZrZw8FZcxxApzdBe/JJUErUBL+jvVUDvrt?= =?us-ascii?q?DYCQU5MwOsyeb9FNp9zp8eWX6IAqKBPqPSq0WH5uQzLOmNf48YozP9K+Ak5/L3?= =?us-ascii?q?ln84l0QdcbOu3ZsNZ3CyBu5mLFmBYXrwntcBFn8HvgkkQ+zpj12CTCVeZ3WoUK?= =?us-ascii?q?I/4TE7FZiqDYDZRoCimLaBxju0HoVKZmBaDVCBCW3neJieW/cNdi2SONRsnSYY?= =?us-ascii?q?WrikUYMh0guutADiwbp9MuXU4jEYtY7k1NVt5+3cixUy9ThzD8mG12GNUn10nm?= =?us-ascii?q?QNRzAsxqx/plZ9ylib26hin/NYDcBT5+9OUgoiLp7cwfZ6C9fpWgLdZdqJU1Cm?= =?us-ascii?q?QtKoADE0VN0xxcUCY0BjFNW+lhrDxTalA6cJl7yXA5w56qzd0GL1J8Zh1XnGzr?= =?us-ascii?q?IhgkI4QsRRL22pnbN/9w3JC47OiUWZmL6gdb4A0y7V6GeD0W2OsVlEUAFtTKrF?= =?us-ascii?q?XGoQZk/NoNvl4UPCSqOhBq48Mgtd08KCLLVFasHxh1VcWPjjIMjeY362m2qoAx?= =?us-ascii?q?aIx7eMbI70dGUGxyjSElYLkxoU/XqcMgg+HCihqXrEDDNyDVLvf1/s8e5mpXym?= =?us-ascii?q?VEA00xuFYFNv17u64RMamfycROkJ3rIYpighsS94HFCj0NLKE9CAvRZufL1AYd?= =?us-ascii?q?Mh51dKzXzZtw1hMZy8KKBinEQSfBh3v0Pp0RV3BZ5NkcwrrHMs1gVyM6WY3ElG?= =?us-ascii?q?dzOC0pD6IqfXJXXq/BCzd67W3UnT0NKX+qcU9PQ0sk7jsx+tFkoj9XVnztZU3m?= =?us-ascii?q?CH5pXSDQoSV5PxXVos9xRgobHVfDU97ZvO1XJwKam0riPC29UxCes/zRage9Nf?= =?us-ascii?q?P72eFADuFM0bCdOjKPc3m1e1dRIIJudS9LQ7P8m+bfuJxLarPPp8nDKhlWlH+J?= =?us-ascii?q?py0l+I9yZmUOHExY0Kw/ac3gubUDf8ikysssXrlYBCYjEdAnCzyS76C45Nfqdy?= =?us-ascii?q?Z5oECX+yI82rwdVzn5vtW3pB+FG9AVMLw9GpdgSWb1z5wwJQz14boXq5liuk1z?= =?us-ascii?q?Z0iS0mrrKD3CzSxOTvbBkHNXBNRGl5llrsIpa7j9YBXEiucQcpiAGp5UHgx6hU?= =?us-ascii?q?vK5/NXXcQV9UfyjqKGFvSrWwtryfbMNU9pMotzhYUOSmbVCcVLH9vwMQ0zn/EG?= =?us-ascii?q?tG2DA7azaqt43hnxNglWKdKG1+o2bYecFsxRbT/dLcSuRX3jYcQyl4kzbXDECm?= =?us-ascii?q?P9a15dWUi4vDsuemWmK5TJJTbC3rwp2YtCSh421qHQOwn+qol936Cgg1zzX718?= =?us-ascii?q?JwWSXTqxb8f5Pr2LikPuJpeUloHlD85NRgFoF4jIQwmIka2WIGiZWN4XoHjWDz?= =?us-ascii?q?PM1V2a3kanoNWTkLw9vO7QjrxkJsM3WJx5jjWXWF2MthYNu6bX0K1SIh9cxKD7?= =?us-ascii?q?2U7LNclytvvlW4tR7RYeR6njoFxvsu6GIVg/sJuQo10iWdBasfHU9GMizwjBSH?= =?us-ascii?q?88qxrL1Ja2q1d7i/ylZ+l8i7DL6eugFcRGr5epA6EC919Mp/NFbM32Pv6oH4Yt?= =?us-ascii?q?bfd8kethuKnBfclOhaNIg+luIUiiZ9P2Lyo2ElwfYhjRNyxZG6oJSHK2J18aKj?= =?us-ascii?q?GBJZOCf5Z8YJ9THpiqZfnt2b0JqzEZVkADkLW4HoTf2wGjIIqfvnLxqOECE7qn?= =?us-ascii?q?qDH7rfBxWQ6F9+r3/UHZCrNmuXJGIFzdVsRRmdIlZQgAYIUzU7hJE5EhqmxMv7?= =?us-ascii?q?cEd2/joR/EL3qgNQyuJ0MBnySn/fqxmzZTgqTpifLQZW7gZZ6kfUL8OR8Px8Ez?= =?us-ascii?q?tf/p27owyHMnabaBhQDWEVRkyEAEjuMaS15dbe6eeYCfC+IOHQYbiVsuxRTfSI?= =?us-ascii?q?xY+10oR85TqMMtiPPn94AP0hw0ZDQXd5G8fZmjUIUSAXkTzCb9KDrhem5iJ3tt?= =?us-ascii?q?y/8OjsWA/3/ouAEaVSPs9g+x+omqeOLPWQizxnKTlC2ZMD22TIxKIZ3FEMlyFk?= =?us-ascii?q?byOtHqgYtS7RUKLQnbdaAAUaayN8M8tI6bkx0RRTNsHAi9P6zLh4guQyC1dfWl?= =?us-ascii?q?zrgtupatASI2GhKFPHA16GO66JJTLR3cH4f7ixSbpIjOpKsR2wvCyUE07nPjuY?= =?us-ascii?q?kDnoWAqjMeZWjCGUJBZeop2ycg5xCWj/S9LrcgG7MNhyjTEs2700gXLLOnAaMT?= =?us-ascii?q?dnaUNNqaOf7SBDj/pjHGxB62ZqIvOfmyaF9eXYLIgZsedzCCRui+1a+Gg6y6dS?= =?us-ascii?q?7CxcR/x0mC/SocB1rlGjlemPxDRnXwRSqjZXhIKLukBiNrvD+plGR3nE4AoH7X?= =?us-ascii?q?+MBBQSu9tlFtrvtrhRytjJiKL8NjNC/MzR/cQCG8jUMsKGPWEmMRrxBjHUCg4F?= =?us-ascii?q?QiSqNWHbnENdl/6T+meSrpggpZjmgIAORaNDVFwpCvMaDVxoHNocL5htWjMpir?= =?us-ascii?q?2bjMkT5XqithbRQt5avpPGVv6IB/XgNiqZh6FeZxQU2bP4MZgTNorj1kx4dFZ6?= =?us-ascii?q?h5rFFFDKXd9Roi1sdRQ7oERX8HdjSW0z1Vrlahmz734TD/K0mAA5ihdma+Q36D?= =?us-ascii?q?js+0s3JkbNpCYojUYxntPlgTaMfzHvKKewXJpbBDDquEgrNZP3WQF1bRe9nUZ8?= =?us-ascii?q?LjfLW6pRj6d8dWBskALTpIFAGeBdTaJZex8d3uuYZ+8y0VRbpCSn3lFI6vfYCZ?= =?us-ascii?q?t4lQsqbZ6to2hG2w19cN4/PbbQK7ZRzlhMmqKOuTel1u4rwAAAOkkN63mdeCgU?= =?us-ascii?q?uEwPLbkrPDCn8fBp6QCYnDtDYmcMXeIwov127kM9J/iAzyX43r5HLUCxLfKQL6?= =?us-ascii?q?WYumjHjsOITVUw1l4Sm0lC57h23t8pc1CIWEA30LuRCxMJONLZKQ5La8pS9X7T?= =?us-ascii?q?fTuBsOjW3Z11OIC9GfzyQu+VqKYYmESkExg1H44U9MQOAoGs0F3ELcfgNLMFyg?= =?us-ascii?q?8t5QTxK1WDEPRJeAmGkDgAo8Gn0JB7x49dKS8BAW9lKyW4+q7XphM2gPqERNo2?= =?us-ascii?q?fnYaXo4DNnIqWM27mzVUsGlBDDi3yO0W0xKO7zniqSTMFDP8dcZsZO+IZRNwD9?= =?us-ascii?q?G74TU/86+ohl7Z7JrePXr3NdV8tdDR9+wWvZGHC+lbTbNlqUfTh5FYR2C2U27I?= =?us-ascii?q?CdO6PZzwa4gwYtPqEnm6V1y+izQyT8f3JtmgNbOHgQDySoZSqYWb0i0jOdW7Fj?= =?us-ascii?q?4ABxd6v/sD675kZQ0ff5o7ZgbluB8gOKy5OwqXyMihQ3izJjtMVPlQ1/+6ZrxN?= =?us-ascii?q?wyordO+6x2MqTosmwOmv7U4NWJYKgwnRxfa+ZoleVSzzFWJYewjUuCU2iXNuNu?= =?us-ascii?q?cozec52h/ItkMcMz+TfuxzdGNEp808BU+VIXhuEGo4QV6cgpbD4g6r27AS5DNT?= =?us-ascii?q?kc9J3+NfrHXwuYTSby6rWKyutZraqTEgbcQ8r613L4PjPtOMtInCkTzHUJnQrg?= =?us-ascii?q?qFXTagF/VHh9ddOy1YQPxHmG0/P8wJp5ZB41IrVsgiP7xPFLUspreyZDV4Dy4d?= =?us-ascii?q?1zMWWpic0zwFhue837ramQmKcJQ+LhMLrJVCjsEaUy5sbSMUvLWjWJnOl2+YVm?= =?us-ascii?q?gLJx8e7R5W6wIakY9/Zfvo4JbSTJBW1T5ZvfZ0UirNFpln81v7S26WgVjkSPWv?= =?us-ascii?q?ieOpxwdSwOjq0tYFRB51EVJdyPpOlks0NLF3LLEdv47QvT+Tb0z6uWPtyO29KV?= =?us-ascii?q?lQ1c3bbUb4A5bfumbmVC0T52EUT5dVyH7DDZQSjxZ5aKEzqVRCOoypZkb+5z0h?= =?us-ascii?q?x4RoBba4Vtumx1c7onkYWSimCd1BC/tpsFjPQj1qf4irqIn5O5VVWmJf4oedq0?= =?us-ascii?q?pfkEl3MC600ptcK8BM4j4QRzdDuzOds8WuSMdbw895E4cMIstju3f6AK5EN4KR?= =?us-ascii?q?rGcwurzz0XLZ+jc8sVm8xDWvG6+3UeNZ/2sCGgo3PWSSsE8vAPUw8m3K6FDCrk?= =?us-ascii?q?h0//tHBriIlUhxvDF9HpVVCzZVyXylKk98QGNAs+pENKTfa9ZcTOUqZR+zJxw+?= =?us-ascii?q?EuYr30yT8kFuh3j5ZzF9uxBH9C/DRwk0TTcagrPzlj0EsM2nPiUaS51QZzU7cy?= =?us-ascii?q?jFMx6bmTxQvBtHaUFqXI4WD81Y9L4Fxotb4NDCSVqyJi4YRhBiMBw30eZHn05Z?= =?us-ascii?q?rEqYYTzdDRavdfvXqRJ3c9ueoNKrIfjk8gpKkZ/osOc996ofXXKmghGtTcrYr4?= =?us-ascii?q?Diqt2ArlGOe7vgM+2gfX/BSyDBjQquirg5D5nF5TTTPRFfK5l913orf4btBnLM?= =?us-ascii?q?PRtbOa0XPUxbWr5mad9euOBVe9dkeLoV+a9qHh+HXgjvGJC1o/ZbMlbeXi/eLy?= =?us-ascii?q?Kc8uylvY3c87rdSfT6ZsOWw3bLWaV3Po116TPjAbflzZde+lbq2vdq7k56VULG?= =?us-ascii?q?PD6fo9v8PQ4L+c2idlf4vpIzAzPWAZBwkH7zyUFcbcYXRDeq8JsAwpND9HnwUf?= =?us-ascii?q?540lT0sOBK6rZk75M47qt0xseyP6jeM/NasVVoAhKMHAVl6o0tAHRjR2BWeuIR?= =?us-ascii?q?Ku3efb4ejcD1r+D4DbIX5QaQ++xEbdvHO0DBldW+Cj6GTxxEhx0NqTkALguTz/?= =?us-ascii?q?SFgbN7Sd65pejl3UIg+1q+IQQAzLBj/4eE/beHq/HMYhvN17cEXLPqRsTporQq?= =?us-ascii?q?pUyS+eUulKQSdWxtfw2nDO8dW9Ybxmfk1q0qzCQsE8bZE7Lh/v5DWWg5kSj7m5?= =?us-ascii?q?BhBVUWB+8bHaaW/YREgGg0gevZNscZcqpagGaACQakEqMeyX6s8yaXJmhljQ3J?= =?us-ascii?q?0xH0W2yz90X6rS5/QSvL1NfjiVFYVry4CEZdRSapPlV4sDyXNgryqNX3obg17F?= =?us-ascii?q?0xMmH8qN2Cjm+hN61MH83jJN2cJjI5pEkLg50wWNOv35wbGdunL9sL9nFxcOfe?= =?us-ascii?q?4XuxkyBdu6dHm5be4saN9/XTBnmgiq2Xpq6DxD9G13c4uks/5cq4NvHU4N2KQe?= =?us-ascii?q?qn2HoNTytlvAvBRRG1oKTBr18IIUyLzFvLmIsSM9Fc2Xk3yETm5O89T9I37whe?= =?us-ascii?q?GZjPZ/QZpTDrIjT03VefbMgzVimf1TtXAkz6EV18GKg912L/osTJmmvO9FEyQI?= =?us-ascii?q?l/aVDnjwRtD4okMUIt9EQXwi0bHAgPaBCbCaqlBUH7IooES0cDcxWH3L61eqst?= =?us-ascii?q?20183K+v7vfJbeNgH6oNKupdjgmWkVhaG5MZq7cRT65ndl9G6qHXuhbtBJT9U/?= =?us-ascii?q?jhj3owOuW/QtpG/sABq3si/gG/SgK75pdC9LYahoqHdqxFYZjQpMBz9Vpn5ToU?= =?us-ascii?q?eyNRhxhwkg22XvoBpOD55djbqoCn5vypVKY3SOUd7wI0CHhmj5vsnFAjpsna1/?= =?us-ascii?q?9GRY3JlYv/8A5MI3mQuIbZyhV8MvQBK4aqfLZm6nUGKDMTJ2oUMtqKd/Y84yFs?= =?us-ascii?q?MDLJ51xBGM8MZs0XPNDLmQ9Kjk3lQrZT9tDUGlWAEYd8a9go73bryDAy6ZY8Tv?= =?us-ascii?q?zg5yGyJZ/F6VFCIehOgzhtlNLNpegV3eDdCDMN7nmDdhh52CWCxIeRC/zo5+WD?= =?us-ascii?q?1MnUV08aHi4xS4pdKyCN+Ra5SeqplJXkSQeU6s7vgJ0gdEKfXGGxnL8fvqZKD+?= =?us-ascii?q?FAlj3x3iJCGYDtm/KVr92s5XNYtlJZFoZz8RrFGKJYMpVgJxv4ksirRk5hBirw?= =?us-ascii?q?Y8zUcgQhuPCWx+gW+el+MVXxZZMDKBIe17368WZVThdpSLPuu1aZWuQRZMdpSP?= =?us-ascii?q?zatX1V7INgJLUJPFeDuJzroDBIqEo1AA8ycrMwqCJVdlXWlg1PR6n0oKIAihcb?= =?us-ascii?q?UdNhtk9DBXmwOHkn6zTaWqpbiqiRCPoI8jScVaEOXEBoPTl4QxyrwplufKGpnf?= =?us-ascii?q?9fuGNcgix9uOQq0yBhRBakuy3soKIN2TQ69L6ktDUBvWFFQfifkifJD1VD1/cK?= =?us-ascii?q?jaYHBnb86Fy8fmMMbI/v77lmP8jg85cu42gnaxU5YyIGRfigCz33j66QA4yPrs?= =?us-ascii?q?hThBiWtcXKcL+8MCkSNrMmyR75QHh9yAfelg5y8GQXWjWg8MMkJIKlNMYn2CWo?= =?us-ascii?q?F2bbdFIX76JHqsTxs0AETPcsZVNn3mpjztCNRjcRS8zXB2Y1kg8kZH1LcJJH7h?= =?us-ascii?q?8bGbcngjKMvqRd5QEUZzHUEoW59YXKm8fHx2U9R89wxm3Kvq2Fmo8q0Hp9ltN2?= =?us-ascii?q?7i6PuGwSd+vcU89tHnj8yJxSyen/Z/WxqOAIVpFqyLO7UP8NKsOj43e52I12Wk?= =?us-ascii?q?+5wbQTB0a5MO4GxrrATyelSHGXWeeVfGiIhTo5NFD95QWwJF0tdMhKt1M9MvfF?= =?us-ascii?q?hpNEkg3hULB0RiaXpVLAzmwsK+AadwUwuIi5fQwGVugRaPaAJeI22v0xFEMMb2?= =?us-ascii?q?PVHStxE+K5qkCinI5nO3h7+kX6ZePt8hz6MNuMBBYLDJTWrplr+fy1XmiBI2Nv?= =?us-ascii?q?zAVuPElo8OfSD0wxtuhYc5mLh9jRidN70eoLd/p2NC09vdkTmpl95oaIyseKdg?= =?us-ascii?q?rRzo3zJdHTrfiUGfrfz14lemtCSLoWfRv155kmPt4+Q7DTE6VWvRAdBagiXpMs?= =?us-ascii?q?LGbw9KBxLAN2bAHRfrC0jdfwquKMfJtUqGfc7kgsIyfEpx0D1vu0QBR7b5C2h3?= =?us-ascii?q?XyJ5UwSShar9B2DxtmHZdPG9keoAa9BJ6Ugq67gcer+0xmo+8KrbbwCvfS2dW3?= =?us-ascii?q?x4VxRZla6lCVMzvKAalrg1hljv6sjfva1ZnxE8zic8seVOdnWm7FdqPGHoKnJz?= =?us-ascii?q?KJPsLzZVVL86aY0L1jSRWReCH5ULaatC2+Kvpr/183yopmc+rP1DYt9a3U2MPu?= =?us-ascii?q?Z2FHoSeutXqJNJpZ7FzXCu3SRhZUSfue8GZ5Bq0ador0+/0IMdwl2tSc5BNz7D?= =?us-ascii?q?ta2sufP6ehtlPM2l58dZ/DN0vmxSI5WYgMIBSiPkoghmDXqmjdAXtCNMirN9Ft?= =?us-ascii?q?j8yOAxzu+UZxg2ctaXBFGmXzWNeRNnIX28WkZA2F7AhLFcoMn/areU4ksa2/Ue?= =?us-ascii?q?1oOpRemeW2r7gGkM9pKyfVS8RAOSHfMqN2NCJLDurTvFgofgIEs78tV4cwf5eB?= =?us-ascii?q?PEMHMEaGySP11gbCz0z0d9qy26aNISYW9GhHzr3f3ThLvQm5tu6Tgtf/X7DBcJ?= =?us-ascii?q?H2QPnSPTInVj6ARjQyFl2m9Ey5u/oCoPqYIWAfok0bYiKSFA4fvKZvosbMDmXL?= =?us-ascii?q?g+1sYIUKhOyGWyD3UCB4m7A9CT1RtUCNXfUDERLbb2HlgGVGowyiJ+JM8Wjjb7?= =?us-ascii?q?KG2qpfQ/YWDZdUcv2FX9vYfuhTJzUtljUeIua8Zdzcr60i31LOV2QZFrfH9FyE?= =?us-ascii?q?QE6RWPycyCrhXZ8JsIgspioo5tXQkzdpHKTKOLafpziu8pW/jCaeouDeWXMtY1?= =?us-ascii?q?ErgO0cGmmN2h9AJ38YC9sNokHiXraAZ1pQ1HIuke9uwBEMeAFvXXBv0XBbh+i9?= =?us-ascii?q?FdNDSV4VjWKuR/sGYEpxDDwu4U+A+hfybsAYucDPW29e8aMBSYgaLPku7InaI6?= =?us-ascii?q?4Qz+g00zJopyw6qTmSAE1HggKD7aXQAPE0+roX/mQ8/vdrTmmTUjjfdS7B0YPg?= =?us-ascii?q?BMVRlgl0pnWx9cPRs/slH7JAu4xjSAMIHil/PMyH1SxQWmHzng2ptlC0GyrIc2?= =?us-ascii?q?FR2yoCOSFQLrU99OR8qhudM4yZ5A=3D=3D?= X-IPAS-Result: =?us-ascii?q?A2EeBQCW7D1Y/wHyM5BdHAEBBAEBCgEBFwEBBAEBCgEBgw0?= =?us-ascii?q?BAQEBAR+BSxC7WSWHdVMBAQEBAQEBAQIBAl8ogjMagiMCJBMUIA4DCQIXKQUDC?= =?us-ascii?q?AMBLRUfCwUYBIhMrlw9KgKLXY80EQGFfQWBJQGHNIcUimUCkQgCihyGEgKRfVV?= =?us-ascii?q?hFwI/NoI7RhwYgWNUhiGCLgEBAQ?= Received: from unknown (HELO tarius.tycho.ncsc.mil) ([144.51.242.1]) by emsm-gh1-uea11.nsa.gov with ESMTP; 29 Nov 2016 21:06:26 +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 uATL67X1022527; Tue, 29 Nov 2016 16:06:13 -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 uATL65dN098556 for ; Tue, 29 Nov 2016 16:06:05 -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 uATL65hA022525 for ; Tue, 29 Nov 2016 16:06:05 -0500 From: James Carter To: selinux@tycho.nsa.gov Subject: [PATCH] libsepol: Fix neverallow checking to also check the other types when self is included in a target type set. Date: Tue, 29 Nov 2016 16:05:48 -0500 Message-Id: <1480453548-21901-1-git-send-email-jwcart2@tycho.nsa.gov> X-Mailer: git-send-email 2.7.4 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 When neverallow checking was refactored in commit 9e6840e, self was not handled correctly. The assumption was made that self only appeared by itself as a target type, when it may appear in a list of types. Because of this, if self appears in a target type set of a neverallow, the other types in the type set are not checked. Example: allow TYPE1 TYPE2:CLASS1 { PERM1 }; neverallow TYPE1 {TYPE2 self}:CLASS1 { PERM1 }; The old assertion checking would not find a violation in the rules above because the target type TYPE2 would be ignored. This fix will cause all of the types in a target list that includes self to be checked. Signed-off-by: James Carter --- libsepol/src/assertion.c | 53 ++++++++++++++++++++++++++++++++---------------- 1 file changed, 35 insertions(+), 18 deletions(-) diff --git a/libsepol/src/assertion.c b/libsepol/src/assertion.c index a4be880..27c39e7 100644 --- a/libsepol/src/assertion.c +++ b/libsepol/src/assertion.c @@ -218,7 +218,7 @@ static int report_assertion_avtab_matches(avtab_key_t *k, avtab_datum_t *d, void avrule_t *avrule = a->avrule; class_perm_node_t *cp; uint32_t perms; - ebitmap_t src_matches, tgt_matches, matches; + ebitmap_t src_matches, tgt_matches, self_matches, matches; ebitmap_node_t *snode, *tnode; unsigned int i, j; @@ -230,6 +230,7 @@ static int report_assertion_avtab_matches(avtab_key_t *k, avtab_datum_t *d, void ebitmap_init(&src_matches); ebitmap_init(&tgt_matches); + ebitmap_init(&self_matches); ebitmap_init(&matches); rc = ebitmap_and(&src_matches, &avrule->stypes.types, @@ -240,17 +241,23 @@ static int report_assertion_avtab_matches(avtab_key_t *k, avtab_datum_t *d, void if (ebitmap_length(&src_matches) == 0) goto exit; + rc = ebitmap_and(&tgt_matches, &avrule->ttypes.types, &p->attr_type_map[k->target_type -1]); + if (rc) + goto oom; + if (avrule->flags == RULE_SELF) { rc = ebitmap_and(&matches, &p->attr_type_map[k->source_type - 1], &p->attr_type_map[k->target_type - 1]); if (rc) goto oom; - rc = ebitmap_and(&tgt_matches, &avrule->stypes.types, &matches); - if (rc) - goto oom; - } else { - rc = ebitmap_and(&tgt_matches, &avrule->ttypes.types, &p->attr_type_map[k->target_type -1]); + rc = ebitmap_and(&self_matches, &avrule->stypes.types, &matches); if (rc) goto oom; + + if (ebitmap_length(&self_matches) > 0) { + rc = ebitmap_union(&tgt_matches, &self_matches); + if (rc) + goto oom; + } } if (ebitmap_length(&tgt_matches) == 0) @@ -288,6 +295,7 @@ oom: exit: ebitmap_destroy(&src_matches); ebitmap_destroy(&tgt_matches); + ebitmap_destroy(&self_matches); ebitmap_destroy(&matches); return rc; } @@ -382,7 +390,7 @@ static int check_assertion_extended_permissions_avtab(avrule_t *avrule, avtab_t static int check_assertion_extended_permissions(avrule_t *avrule, avtab_t *avtab, avtab_key_t *k, policydb_t *p) { - ebitmap_t src_matches, tgt_matches, matches; + ebitmap_t src_matches, tgt_matches, self_matches, matches; unsigned int i, j; ebitmap_node_t *snode, *tnode; class_perm_node_t *cp; @@ -391,7 +399,9 @@ static int check_assertion_extended_permissions(avrule_t *avrule, avtab_t *avtab ebitmap_init(&src_matches); ebitmap_init(&tgt_matches); + ebitmap_init(&self_matches); ebitmap_init(&matches); + rc = ebitmap_and(&src_matches, &avrule->stypes.types, &p->attr_type_map[k->source_type - 1]); if (rc) @@ -400,19 +410,25 @@ static int check_assertion_extended_permissions(avrule_t *avrule, avtab_t *avtab if (ebitmap_length(&src_matches) == 0) goto exit; + rc = ebitmap_and(&tgt_matches, &avrule->ttypes.types, + &p->attr_type_map[k->target_type -1]); + if (rc) + goto oom; + if (avrule->flags == RULE_SELF) { rc = ebitmap_and(&matches, &p->attr_type_map[k->source_type - 1], &p->attr_type_map[k->target_type - 1]); if (rc) goto oom; - rc = ebitmap_and(&tgt_matches, &avrule->stypes.types, &matches); - if (rc) - goto oom; - } else { - rc = ebitmap_and(&tgt_matches, &avrule->ttypes.types, - &p->attr_type_map[k->target_type -1]); + rc = ebitmap_and(&self_matches, &avrule->stypes.types, &matches); if (rc) goto oom; + + if (ebitmap_length(&self_matches) > 0) { + rc = ebitmap_union(&tgt_matches, &self_matches); + if (rc) + goto oom; + } } if (ebitmap_length(&tgt_matches) == 0) @@ -449,7 +465,7 @@ exit: static int check_assertion_avtab_match(avtab_key_t *k, avtab_datum_t *d, void *args) { - int rc; + int rc, rc2 = 0; struct avtab_match_args *a = (struct avtab_match_args *)args; policydb_t *p = a->p; avrule_t *avrule = a->avrule; @@ -477,12 +493,13 @@ static int check_assertion_avtab_match(avtab_key_t *k, avtab_datum_t *d, void *a ebitmap_destroy(&match); goto oom; } - rc = ebitmap_match_any(&avrule->stypes.types, &match); + rc2 = ebitmap_match_any(&avrule->stypes.types, &match); ebitmap_destroy(&match); - } else { - rc = ebitmap_match_any(&avrule->ttypes.types, &p->attr_type_map[k->target_type -1]); } - if (rc == 0) + + /* neverallow may have tgts even if it uses SELF */ + rc = ebitmap_match_any(&avrule->ttypes.types, &p->attr_type_map[k->target_type -1]); + if (rc == 0 && rc2 == 0) goto exit; if (avrule->specified == AVRULE_XPERMS_NEVERALLOW) {