From patchwork Wed May 30 14:11:03 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Enderborg X-Patchwork-Id: 10439075 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 5E3EC60327 for ; Wed, 30 May 2018 14:18:56 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 46D6B286AE for ; Wed, 30 May 2018 14:18:56 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 3B80928DEE; Wed, 30 May 2018 14:18:56 +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=-5.2 required=2.0 tests=BAYES_00, MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from uhil19pa09.eemsg.mail.mil (uhil19pa09.eemsg.mail.mil [214.24.21.82]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 00BAE286AE for ; Wed, 30 May 2018 14:18:54 +0000 (UTC) Received: from emsm-gh1-uea11.ncsc.mil ([214.29.60.3]) by uhil19pa09.eemsg.mail.mil with ESMTP/TLS/AES256-SHA; 30 May 2018 14:18:53 +0000 X-IronPort-AV: E=Sophos;i="5.49,460,1520899200"; d="scan'208";a="13920275" IronPort-PHdr: =?us-ascii?q?9a23=3A+6DI6h9j2UZ6vv9uRHKM819IXTAuvvDOBiVQ1K?= =?us-ascii?q?B62uwXIJqq85mqBkHD//Il1AaPAd2Graocw8Pt8InYEVQa5piAtH1QOLdtbD?= =?us-ascii?q?Qizfssogo7HcSeAlf6JvO5JwYzHcBFSUM3tyrjaRsdF8nxfUDdrWOv5jAOBB?= =?us-ascii?q?r/KRB1JuPoEYLOksi7ze+/94HTbglSmDaxfa55IQmrownWqsQYm5ZpJLwryh?= =?us-ascii?q?vOrHtIeuBWyn1tKFmOgRvy5dq+8YB6/ShItP0v68BPUaPhf6QlVrNYFygpM3?= =?us-ascii?q?o05MLwqxbOSxaE62YGXWUXlhpIBBXF7A3/U5zsvCb2qvZx1S+HNsDtU7s6RS?= =?us-ascii?q?qt4LtqSB/wiScIKTg58H3MisdtiK5XuQ+tqwBjz4LRZoyaOuB+fqfAdt0EQ2?= =?us-ascii?q?RPUNtaWyhYDo+hc4cDCuwMNvtaoYbgvVsDtRuwCxeiCu3szTFHhHH20qIn3e?= =?us-ascii?q?Q5EwzKwQItEM4BvnvKt9X4L7sSXOKvwaXU1zjPc+1a1DHg44bIaBAhpvSMUK?= =?us-ascii?q?pqf8XP1UkgCRnFhUifp4zjIjyayP4NvHOc7+p6WuKklmkqqxlvrTiz2MgskJ?= =?us-ascii?q?PFiZwTyl/Z6yp52p06JdqiSE50etOkC5xQtyeaNodsXswiRGRotT88x7Ybup?= =?us-ascii?q?C7ZDAHxIkoyhPQcfCKc5WE7gj9WOuePzt0nm9pdKqxihuw60Ss1+PxW82u3F?= =?us-ascii?q?pXridIk8PAum4J2hHV98OJUOFy/l271jaKzw3T7+ZELl0qmqfDMJ4hx6Iwlo?= =?us-ascii?q?IUsUTeAi/6gEX2g7GSdkUj4uWo9/7oYq/npp+BLI94kB3+M6Qylcy/BuQ0KA?= =?us-ascii?q?4OUHSA+eugzrHj+Ez5QLFSgv03lKnWrozaKNwGqqO2DAJZyIYu5wulAzu439?= =?us-ascii?q?kUg2MLIE9ddBKClYfpOlXOIP7iDfe4hlShiCxryO7CPr3gBJXNM3fCnK76cr?= =?us-ascii?q?Z69k5czhY8ws5E559PFrEAIO78Wk/2tNDCCB85KBa7z/zoCNV6yIMSQXiPDb?= =?us-ascii?q?OBMKPOrV+I4foiI+uLZI8Tojn9N/gl6OTojXIim18deq+p3Z4NZ3CjAvRpPV?= =?us-ascii?q?+ZYWH2jtcGC2cKsRI0TPb2h12aTT5Te3GyUro+5jE5Eo2pEYTDRpuqgLyH3S?= =?us-ascii?q?e7AIZbZm5CClCRHnbnbJiEW/EQaCKPOMNhlSYEVbe5QY87yR6urBP6y6ZgLu?= =?us-ascii?q?fM9CwYtJbj1N1r6O3Jjhwy+yJ7ANma02GXVW50hnkIRzg03K9hvUN91k2P0a?= =?us-ascii?q?9ig/xXDdZT/e9GUh8mNZ7AyOx3E839VR7EfteOTlamXsiqDCovTt0v2d8OYk?= =?us-ascii?q?d8G9KkjhzZ2SqlHaMVnaSRBJMo6qLcw2TxJ8FlxnnbyKkulUMmT9BTOm2hg6?= =?us-ascii?q?5w6xLcB5XVk0mDkaala7gc1jbX9Gif1WqOoF1YUAloXKXLR3AQfE3Wosj45k?= =?us-ascii?q?PZVLKuDKwnMgpYxc6ZJKpKccfljVJcRPfsIN7eeX6+m3+sBRaUwbOBdInqdH?= =?us-ascii?q?8e3CXaFUgJiAMT8myFNQg5GyetuWXeDCZhFVj3eUPj7fF+qG+nTk8z1wyFdV?= =?us-ascii?q?Bu16C0+hELn/yRUOkc0a4BuCs7rDV0Blm91crMC9WcvwphYLlcYdQl7VddyG?= =?us-ascii?q?3WqhdwPpOlL6FtnFIedRp4v1/23RVtFopAidQqrG8tzAdqMqKY3klBdzSD3Z?= =?us-ascii?q?DsIbDXMW/y/Behaq7TwF7e1sya+qER5/Qks1/jph2mFlI+83V71NlYy3Wd6Y?= =?us-ascii?q?/ODAoOT53xSF03+gNkp77EeCky/J7U1Xh2PamzqD/C1MojBPE5xRa4Y9dfLK?= =?us-ascii?q?SEGRf0E80bA8iuLPIlm0OyYx0eIu9S7qk0M9mhd/uc166hJPxgky6+jWRb/I?= =?us-ascii?q?B91VqB9zR9SuHUw5YFxOuY0hGbWDf8i1ehtM/3lJtAZTETGGqw0zLkBIlLaq?= =?us-ascii?q?11Z4YLBn+kI9erydVmm57tR3lY+UanB1MHw8+pZQOeb0fj0g1U1EQXp2GnmC?= =?us-ascii?q?SjwjxvizEpr6yf3C3SzOT5bhYHPHBERHV6h1f2PYe0l8waXFSvbwUxjhul4k?= =?us-ascii?q?L6x6xFq6RlM2bTRklJcjPtL2F/TqSwraCOY8lV6JMnqS9XSvizYUiGSr7hpB?= =?us-ascii?q?sXyyDjEHVYxDAgbDyquYv2nxphiGKbMnlzsGDVecZqxRfQ/NbcX+Je3iIaRC?= =?us-ascii?q?lkjjnaHkC8MMO0/dWQiZjDqvqxV2S9VpJNaynm1p6AtDCl6m1wGh2zheuzmt?= =?us-ascii?q?r6EQggzSD0yddqVSLSrBbzfIbnzaK6Pvx7fkNwHl/z99J6Gp1ikos3nJwQx3?= =?us-ascii?q?4aiYiO8HoZl2f8LNVb1bj4bHUTWT4B28TV7xT92E1/MnKJwJr0Vm2Hzct8Y9?= =?us-ascii?q?m3eX8Z2iMh78FKEauU4qZLnS1vrlq/twLRbuB3ni0Bxvs29H4an+YJtRIjzi?= =?us-ascii?q?qHBLASAU5YPSn3mhSG8d+xsaJXZHy1friozkp+mtKhA6+erQFAQnr5fY0iHS?= =?us-ascii?q?Bo5MVlLF3MyGHz6p3jeNTIaNIcrBmUkxPegOhJNJI+jOAFiDFhOW3joX0l0P?= =?us-ascii?q?I0ggZ23Z6kpoSHLXti/L6hCB5CKjL1f98T+i3qjatGkMaWxZ6gEYh6GjoRWp?= =?us-ascii?q?voUfWoECkJuPv9KwmOFScwqnCBGbrQBQWf8ltpr2rTE5C3MHGaPH8Zzc94Sx?= =?us-ascii?q?mFPExSmw4UXDQgnp4iCgCqys3hcEFj6TAX+lH4qwFDyuZyOxn4SGffqx+iai?= =?us-ascii?q?0oR5iHMBpW8gZC6l/NMcOA9e18ASdY/py9rAyKMWGbZhpHAn8XVUCeAFDjJL?= =?us-ascii?q?au78Ha8+eEHuq+M+fOYbKWpONFTPiEwpav0op9/zaQLcWDJGJiAOMn1UZZRn?= =?us-ascii?q?B2BcDZmzQJSywKmCPAdNKUpRem+i1qtcCz6vrqVxjz5YuUDLtSN89j+xesga?= =?us-ascii?q?eML+SQnjp2KS5E1pMQwn/F0KMQ3F8diyFpcTmgCqkPujDWQ6LRgKBXCQQXay?= =?us-ascii?q?RpNMtH96g8xBVCOdbHitPp0b51luQ6C1hfWlz/hM6kfssKI3mjO1PBAUaELr?= =?us-ascii?q?WGJTnQzMHwbqKwU7pQjP9btxeoozaUD1fjPiiflznuTx2vLeZMjCSBMBxEv4?= =?us-ascii?q?G8cwhiCW74Q9L8bR20Ltx3gCYqzr0zg3PFKXQTMSNgc09XqL2f8z9YiO1lG2?= =?us-ascii?q?Nd9nplMfWEmyGB4unaKpYXseNrAiNwl+Jb/HQ11aBY7CRFRPxpgivdsMRio1?= =?us-ascii?q?a8kumA0jBnSgZBqi5XhIKXukVvIabZ95lEWXna5x8N6GKQCxoEp9R7Ft3vp6?= =?us-ascii?q?BQyt/KlK3tMjtC9czb/dcEDcjONM2HKGYhMQbuGDPMCgsKUySkNWXEikxel/?= =?us-ascii?q?GS7WGVoYI8qpj3m5oOS6VXVForGfMGEk5lBsANII9rXjM4lr6WlNQI6mSlrB?= =?us-ascii?q?bPXspapIzIVvKJDPr0KTaZl6RLZxwGwbPgN4QcKI3611ZkalZkgITAA1DQUs?= =?us-ascii?q?xVoi19cg80p11A/2V5Tm013ULqdx2i4HsSFfOvhBE5lBF+YeM3+Dfr+Vc3KU?= =?us-ascii?q?LApDEsn0kphdXlnTeRfSbsI6iqQ4FWCjf7t1MqP5zhWQZ1dwqynEJ/NDjaW7?= =?us-ascii?q?1RkqFgdWF3iA7co5dPH+BTTbFcah8K2f6Xf+ko0Uhbqii/wU9H4vHFBoVklA?= =?us-ascii?q?ordp6htH1A2wR+bNIvIqzQPqVJxEBKhq2Spi+oyvwxwAgGKkYW7mySfC8IuE?= =?us-ascii?q?oVNrgpPCen4uts6QmelDRZY2gMS+AmovR0+UMhI+6A1T7v06ZfKkCtMOySN7?= =?us-ascii?q?+Zu2nFlc6PXlMw1kMJmlJY8rh30cYsaVGbW1opzLSPCxQDLdDCJh1Nb8pO6H?= =?us-ascii?q?jTej6Dvv/JwZJ0I4qyCPjnTeqOtaYShUKkGhwmEp8X4cQABJas1ljULcn6LL?= =?us-ascii?q?IfzxUi+hjrLk2fDPtVYBKLjCsHo8anwZBsw4ZdICoQDn9gPiWp+LnXvBQqj+?= =?us-ascii?q?CZXNY2eHsaWZEENn0uUs2ghyFZp2hADCWw0u8BxwiC8j78piDUDDbiatpuf+?= =?us-ascii?q?qbag13B9G34zo/9bK6iVnN8pXRP2v6L8htusfT6eMGoJaKE+lUTb98s0jAm4?= =?us-ascii?q?lYQHiqU3XXH9CsOpb+cZUhY9vvB3mmVVy/ji46QN3qPNaxNKSIhx/nRZpMuo?= =?us-ascii?q?mBwD8jLdO9Fi0ZGxpoveEM/rh8ZQoYbJcgfR7orR4xN7KhLwec09WuRWmtKT?= =?us-ascii?q?9XT/lQzeW6e7JXwDA2bu+/0ncgSI81z/Wv+04XWJ4Klg3exeqkZ4RGXyn/AG?= =?us-ascii?q?BSewXOpSo8lmhuLOUyz/w+wBzWr1YTLSqHdOtzaGxLp9s8H0+dIW1qCmokQF?= =?us-ascii?q?+RlY/D7RS237AR4SRdg9dU0etKsHXlsJ7QejSsV7CvqZXSriovcMMmr7d3MY?= =?us-ascii?q?P9PsuMrInekSDHTJnMrg2FVza3GOBAmthNJiJUWvpIlHokOcwHuIpB9VE+Wt?= =?us-ascii?q?04J7NRFKkmvqqqZiZ8DS4O0S8ZUJuN3D0EguegxbTakgmfcJE8PxwYqpVDgs?= =?us-ascii?q?AQUyluYiwAoq+jUp/Zl26ASmcQJwcS4h5A5AUalo9/Zurl+pbHTIdQyz5KpP?= =?us-ascii?q?J5SjfLFp5t91bgVmGanV34R+67n+yvww1S0Orm0sMHVx5nFUhd2+FWm1MoKL?= =?us-ascii?q?5tMakfpIrKvSKTeEznom3t0POmK0dVycLKbV30Fo3FtXDzUicE430bWZdPyG?= =?us-ascii?q?3DFZQViwd5aqErq0tXLY+7ZEn+/CIrx551H7amSM+n3VAlomgaRy2yCdpOF/?= =?us-ascii?q?lmsE7LWD1ie52rtIjqNIhTQmBK/J2QsEtWkEJoMyGl05VcMN1N7iQKXDdRvT?= =?us-ascii?q?WXpMGyR9Fb2c9qE58MJc9ytGzzGKxYJJScoWA6t7L0x3DF/DA8tUu1yy+oG6?= =?us-ascii?q?+kVe5Z+XMRGhkxLWSEtkYvF/cs8nvV8l3VqFB74fpUBriVgkVtuzt9GpdOBi?= =?us-ascii?q?hX2ny7M1tzS2RJvPtAJKTTbcNcX+E4ZQWzNBwmCf4mw0uJ8FlsnXfifyx9rB?= =?us-ascii?q?ZV+zzGUgkvUikVn63tliEApcGhJT8aUYhHbTE7YyfCMQKbljhdvAxDZEFyR5?= =?us-ascii?q?AZHtFF9qkH3YtO4MXNV1ujJDoYXBxmKgI4y+BQlVBCsEWffSDSExaoeezIsh?= =?us-ascii?q?1tcsebtNSpI+jh/AdbloPnt/g196cZSH28ng2tWtTeoJXittCRs0uOaaP4M/?= =?us-ascii?q?G9YXDdTTjDlxawhaw+A5nN5SjTPxJRK4Nmxno8fZjhFWnLMAxEJ60BIUpbW7?= =?us-ascii?q?p6adJbre9EfMJkZLwG+al2BhKAXB/vHpKgrOVeJFbJWTveNzmB8vC4oY/L67?= =?us-ascii?q?zdTfPtZs2Kx3bCWa53P5F66TfhG7jwyo9e5lD22upx+UNmVFjGKT6OoM7mJg?= =?us-ascii?q?MR68moblHisYExHTPKHJdwl2LgxkdBd8ULRC2q9I4XyIhD5HbxTuJ41VPzsP?= =?us-ascii?q?ZJ+rlh5oQ27KplycCuJafdMf5aq1NoAgCIBgV28ZUgGHRwSHpVYuAPM/fRYa?= =?us-ascii?q?QYjcf1puDsC6MX6QOa++pFadvGPU7NgM+/BS+ASRZchgcOtSYaLheA1/6Cg6?= =?us-ascii?q?J0Td2lpe3510827VixMAMJzLd35Yie4qqIvujXbxnPwrcYRqjmXMTzrq4ju0?= =?us-ascii?q?mK//0riKYOenBpYw2gCOUdVM8dxmL7wKAv0y0tE93MH6jh+P5FWHI1hDTglI?= =?us-ascii?q?5hH18OAPMbAaKL/ZhCnmc/g+HZN9wXfbpYlWmTDhOkCaENyWK15CSLOmVlhQ?= =?us-ascii?q?vO0x7oS2Op8FD2tTN4QTfLz9r7iUVVV6K3BElIUCqrOE94rCuPMxD1tNrzoq?= =?us-ascii?q?k68EY2PXH6u92XiWuhIrRXH9flK9CGJik0vl0XhoUrRtOzwYAbBca9INAJ/X?= =?us-ascii?q?FmdPTe93+kky9PoqdAnYre4diZ+u7JEnmkjq2araiNxT9Dx3ggp14/9syvNv?= =?us-ascii?q?HA5t2NWfSo1HwdTyRhtAvbWR66tLjbo0oTOUyR30fBgJYKMc1B3XkkykHm4/?= =?us-ascii?q?AuQN0p+wVECInAe/MCqCv3ODv13VaQfdI3WTOD0ztMBF71F0d3GLQk0mLqoM?= =?us-ascii?q?3JjWvQ+0EvRoRoeEzomxp3D5k/KUIq71QX2TQMEQwMaRCdEbGpCl/oLY8aWk?= =?us-ascii?q?gZaRWIxqK2eqEp0k1v2rmv/vPcbfRgB6oRMfZQlhKBnFpBFZ0KqqARXLV8e1?= =?us-ascii?q?tZ9K7WuAfiEZTnUOb6mnowL/G1Rdpa8c8BvXs4/gm/Xwag6YtE77sDjZCIca?= =?us-ascii?q?hEYYTDvM9i9Epn4D8PeTZLgBdhkxO4X+ccpPrg4tjAqpao7PihVLo1TeUN6x?= =?us-ascii?q?c0H3h+j4f3gF07rtHYy/xcSpbMhYri/w5DJX+KuIDH0xhzMucOJIerc6xm93?= =?us-ascii?q?oZPSQeIGgOPdWOYfkm/yBtKCnT50BFAs4UZ9MYO8rNmQZOhkL1WLFT8tfbFU?= =?us-ascii?q?KZCodyccAo9Gn3yDEu/JsiU+bg9iW5JZTC4FFMJf9DijtjlM7arugP3fXSED?= =?us-ascii?q?QX4WWeaxVtwyOC1YOCC/Dr8OWI1dHbSlIGHiktU4tHIzqC4wOnTPKvlJr1Sg?= =?us-ascii?q?OU9tPzgJUmeUKSWHOxkqoFsqJXHO9OkCr72CZRFpzvi/KTrdWs9HNdtkdbH4?= =?us-ascii?q?Zr8R3FBKJfM410ORT8kcmqSFZzBi/7eMzPbRouv+yWxuYQ7OlkMUvxe5MbKA?= =?us-ascii?q?oey73m8XpVUhduSLnus1acXOIRZ9hmSPTfo3BX841gKKgPPF6Dq5zstDtIrk?= =?us-ascii?q?45ABMxYr8qsjNablXOnBFSW6vso7EPlA0cUcJitE9XHWKwP34+5ybZVatLka?= =?us-ascii?q?adEvsV8i+cTqYWSUVnLjt+Qw+p2JVpY7aphfdHsmdckSNnrvkq1DhmRBWntC?= =?us-ascii?q?3poKIN3ikg96+kuzUbvnxFVf6ekybOCVVM1vgKir0cC3n641ymfHYDdJfy4K?= =?us-ascii?q?VgJcn4+4ku/XA/YRQ7fyIYRumhCiDwj6aNAoORqtJcgACCtN/Jbb+pIigYLq?= =?us-ascii?q?49xg77R3hhzgjemw5l8WUTQjW67d8rOJuyNN0gxiqpBWjbbkgD7rlOsMvrul?= =?us-ascii?q?4BVPE2Zk95wGV/zsiHQTUARMvLG2krlQUkcWFEf4hY6R8GFqknniqIvrNY8Q?= =?us-ascii?q?4KejvUFJqq+pXIl8fSxXY9Vctqxn7RpqCdgpMq0Xtlm8577yKXvHQSdvfYU9?= =?us-ascii?q?N3AnXo14dQ0+r+Z/K3vuAAUotmx6yrUOUePcm75Wu2xJJqV1egxrsEA1W5MO?= =?us-ascii?q?4DxrHcUyq+V22YWOKLfHaInzY4NE7y+BapIkcwaMdQoE83KvHCiYJElw39Tb?= =?us-ascii?q?N0QT2dpV3Bw2wgNuMVbBk7uJqhewwWTO4RYPWcJecuwP0iElcMaWHGHTduAe?= =?us-ascii?q?+srVGthJR7O2ln4UjiY+Tt9wfmMMGIGhkFCo7XtZhx9ua/Rm2fOH9s1hpyPF?= =?us-ascii?q?N79+3HDVQ+qvdcc4qNndjXn9l7yuAFd/JxPiA8udMegZxj5peO0MeLcBDRyZ?= =?us-ascii?q?DyKcvToveGH/2Mh3gtLzVCX6YUe0X44Yk3JNQ+QbL7BrxfrFIXAq1sBNQZPn?= =?us-ascii?q?r1vIRzKxl+OlrJbamwqtHju+bOY5xTvXKQ5VU1emOUgAEO0vy5S0RAapmug3?= =?us-ascii?q?jjaMQrSilps8xmChwgGpBGXcwHsVzjS7OOmarzs9ar+lgy7+ISuLDxEdjS3c?= =?us-ascii?q?64xJ11VpNXo0uRM2CVTItih0l+xsG1mO3BydGlC8rndMhCUK5+RXTfa6TuGZ?= =?us-ascii?q?+2ITaDfMn7fhgCu5KV1rN0Vl2zeTr2Uqyd/HmoPfNl7EE54ol1eO7ayjs9qb?= =?us-ascii?q?rc3Y22L01cuyjriXOFOpxF4BSeCejTUxxTU/at6mtpHaQLK4Dz8bFKeYg5zd?= =?us-ascii?q?yd5RRjxChT28uCZa66pwnD3VwtMdqPKErvxjZ8QoQBPQ6+LVpphGjVt3DQKW?= =?us-ascii?q?pTI9LiKsR3htuRSBv36B810TUpZ2hcCi/rSM2XNGwzxc2zfkuJ+RhNAtJFmP?= =?us-ascii?q?S4Lwpw/Ja/U+ZlcrgN362KvbEDgNAjY3XUSdJVMgnQJbtyLzwXBeLK8hxgKC?= =?us-ascii?q?YNrrx9d89zLb2FA04BNkqRg2um1QLf1Uj/dPSo1aCUMGAI9HhbibPP1H5HoA?= =?us-ascii?q?zv6tiDhci2aL3FYYu+cfjePTAvUSuVDWAqHFqk4xGpvfYJpvCfO2g3uVcSc2?= =?us-ascii?q?SZDwtF9fMnlsTZEmKGwb4rR5YNnv3PHnmpEHcixqMvGiZGs1yNSPMfFA7QKm?= =?us-ascii?q?Xsm3dYpBf9fa1R9nXhNuyAz/MLHeEbB5BDNPiQQt+efPFadFJK3jkaOePped?= =?us-ascii?q?raov5511/TVmIWHuHO80HWV0+ZRPGQhnrrUIwZspJyu38u/dTdkw=3D=3D?= X-IPAS-Result: =?us-ascii?q?A2CJAwANsg5b/wHyM5BcGwEBAQEDAQEBCQEBAYNBA4EFX?= =?us-ascii?q?BYSjFqMAYMIkzwUgV0qEwGGXiE2FgECAQEBAQEBAgFrKEIOAYFkJAGCTwMDA?= =?us-ascii?q?QIkExQgDgMJAQE+AggIAwEtFREGAQcLBRgEgwGCAQMBpx0zg3gBAYRLgWiIN?= =?us-ascii?q?4FUP4hcARIBC4VoAoc8CIYKixcHAoFnjG4LgTuGUoR/klsGK2FxTSNQgkOCI?= =?us-ascii?q?BeNYQE3bXoBAYgOhEYOF4IhAQE?= Received: from tarius.tycho.ncsc.mil ([144.51.242.1]) by emsm-gh1-uea11.NCSC.MIL with ESMTP; 30 May 2018 14:18:52 +0000 Received: from prometheus.infosec.tycho.ncsc.mil (prometheus.infosec.tycho.ncsc.mil [192.168.25.40]) by tarius.tycho.ncsc.mil (8.14.4/8.14.4) with ESMTP id w4UEIL7t011482; Wed, 30 May 2018 10:18:33 -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 w4UECAZh011022 for ; Wed, 30 May 2018 10:12:10 -0400 Received: from goalie.tycho.ncsc.mil (goalie.infosec.tycho.ncsc.mil [144.51.242.250]) by tarius.tycho.ncsc.mil (8.14.4/8.14.4) with ESMTP id w4UECCqB010995; Wed, 30 May 2018 10:12:13 -0400 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A1DzAADrrw5bly0YGNZcHQEBBQELAYNBg?= =?us-ascii?q?WQWEot7jGCDCJM8gXiEdwKCHCE0GAECAQEBAQEBAhQBAQEBAQgWBoYAAwMnYj8?= =?us-ascii?q?SVwYBEoMiggQBpxIzg3gBAYRLgWiIN4FUP4h7hWgChzwIhgqLFwcCgWeMbguBO?= =?us-ascii?q?4ZShH+SVIIKTSODE4IgDgmNYQE3bY1QgkYBAQ?= X-IPAS-Result: =?us-ascii?q?A1DzAADrrw5bly0YGNZcHQEBBQELAYNBgWQWEot7jGCDCJM?= =?us-ascii?q?8gXiEdwKCHCE0GAECAQEBAQEBAhQBAQEBAQgWBoYAAwMnYj8SVwYBEoMiggQBp?= =?us-ascii?q?xIzg3gBAYRLgWiIN4FUP4h7hWgChzwIhgqLFwcCgWeMbguBO4ZShH+SVIIKTSO?= =?us-ascii?q?DE4IgDgmNYQE3bY1QgkYBAQ?= X-IronPort-AV: E=Sophos;i="5.49,460,1520913600"; d="scan'208";a="288400" Received: from emsm-gh1-uea10.ncsc.mil ([214.29.60.34]) by goalie.tycho.ncsc.mil with ESMTP; 30 May 2018 10:12:11 -0400 IronPort-PHdr: =?us-ascii?q?9a23=3AY7iMkhJ9selqcUKVedmcpTZWNBhigK39O0sv0r?= =?us-ascii?q?FitYgXKPnyrarrMEGX3/hxlliBBdydt6oZzbKO+4nbGkU4qa6bt34DdJEeHz?= =?us-ascii?q?Qksu4x2zIaPcieFEfgJ+TrZSFpVO5LVVti4m3peRMNQJW2aFLduGC94iAPER?= =?us-ascii?q?vjKwV1Ov71GonPhMiryuy+4ZLebxlIiTanfb9+MAi9oBnMuMURnYZsMLs6xA?= =?us-ascii?q?HTontPdeRWxGdoKkyWkh3h+Mq+/4Nt/jpJtf45+MFOTav1f6IjTbxFFzsmKH?= =?us-ascii?q?w65NfqtRbYUwSC4GYXX3gMnRpJBwjF6wz6Xov0vyDnuOdxxDWWMMvrRr0vRz?= =?us-ascii?q?+s87lkRwPpiCcfNj427mfXitBrjKlGpB6tvgFzz5LIbI2QMvd1Y6HTcs4ARW?= =?us-ascii?q?dZQ8hfVzJPDI2/YYUIDeUBM+lXoJXmqlsSsRezHxWgCfnzxjNUgHL9wK000/?= =?us-ascii?q?4mEQHDxAEuBcwBsGjKo9XvKawcXua1w7TWwjXZdPxW3i396IfVeR0mufGDQ6?= =?us-ascii?q?5wftTLyUU1CQzFiEifppL/PzyO0eQNqWeb4vF7VeKojW4mqxt9rSSoxscpk4?= =?us-ascii?q?TEgJ8exFPc9Shh3oo5ONK1RFRlbdOrCpdcqS6XO5F5T84iW21ltiQ3xqcbtZ?= =?us-ascii?q?O1eCUG0okryh7eZvCdbYSF5hTuX/uLLzhinnJqYre/ig6y8Ue+zu38UdG531?= =?us-ascii?q?hUoyRclNfBuG4A2QbP58SbSPZx5Fmu1iiK1wDI5eFIO0U0mrDaK54l2LIwk5?= =?us-ascii?q?sTsUDbEi/3nkX5krOWe1069uS15OnreKvqq5CGO4NqhQzyKKsjl8ynDeQ9KA?= =?us-ascii?q?cOXmyb+eqm1L3k+E30WK9EgeMqkqbHqpDWP8sVpqikDABLyIYs8BG/Dy2p0N?= =?us-ascii?q?kDhnkHK1RFeRKdg4f1PFHOJej0De2jjFS0jDdr2/fGM6X6AprQNXjOi6vhfL?= =?us-ascii?q?Zh5E5czwo/19Zf54lOBb0bL/LzXVHxvsTCDhAlKwy03/rnCNJl24MFR22PBq?= =?us-ascii?q?6ZMKXPsV6H/e8vP+mNa5MVuDb6MfQl4eXugmUjlV8Seqmpw8hfVHftSuxrP0?= =?us-ascii?q?iDJ3fqjtobG2AQsSIlS+r7zlaFVGgXL067QqZ0wzY8Eo/uWZ/KW4SFmLWc2G?= =?us-ascii?q?K+GZpMayZNDVXaVT/Ta4icW/oKIBmXK8tlny1MAaOtUKc9xBqus0n80LMhIe?= =?us-ascii?q?3KrGlQmIji35BN7vfSjllm+CR9FcWG+3mEVWBvhmcBTDJw27pw9wg16F6G3L?= =?us-ascii?q?MwpvtCD91Ir6dLWwI3LtjYiel9EcrzQSrGZN6CTFvgSdKjV3V5Yts3wtIKK2?= =?us-ascii?q?RgAdqviAuLiyajBb4Yk76jAZEw9qva2Gi3LMF4nTKO+K48gBECT8dBMneqzv?= =?us-ascii?q?pz8wXfCYnTn22DmqqqfLha1ynIoiPLmXGDuEBeTR5YTbTOXXdZYFDf69v++B?= =?us-ascii?q?WGB+uqCLI6Ik5axMWfMKpWe5jsillbQPrLJtvTeSSyln22CBLOwamDOs6iL2?= =?us-ascii?q?Ec2jjNTUsJiQYe+V6YOgUkQCSsuWTTCHppD125JwumyuRkp37zYwdyhyGDa0?= =?us-ascii?q?lw0fD9rgUYn/ORY/Ma2rYVvmEqrDAiWB7359vLD5Kt70wpWa5/bNU77UYNnT?= =?us-ascii?q?bBvhF5O5ejB6RjgEMONRpxsl+o1h9yTI5HlJ55gmktyV9KJL6VyhtscT+Vx5?= =?us-ascii?q?r3ILKffnH/4B21LaPQ1lzE2tGM9Y8U7/Ip7V7kuVf6RQIZ73x73owNgDOn7Z?= =?us-ascii?q?LQAV9XCMqpCBxl/gVmp7zcfig27p/V0nspK6SvrzvewI1wVvYuzRL5Ls9Waf?= =?us-ascii?q?3CGQL3CMJcAsGvLKovmlz6Jh4HPeUH8qkyMovmcvadw6ekMa5mmy7ulmVI5o?= =?us-ascii?q?1xkwqM+iNwR/SO3sMDxPeV0w=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0C/AAAksA5bly0YGNZcHQEBBQELAYN?= =?us-ascii?q?BgWQWEot7jGCDCJM8gXiEdwKCHCE0GAECAQEBAQEBAgETAQEBAQEIFgZXgjU?= =?us-ascii?q?kAYJPAwMnYj8SVwYBEoMiggQBpxIzg3gBAYRLgWiIN4FUP4h7hWgChzwIhgq?= =?us-ascii?q?LFwcCgWeMbguBO4ZShH+SVIIKTSODE4IgDgmNYQE3bY1QgkYBAQ?= X-IPAS-Result: =?us-ascii?q?A0C/AAAksA5bly0YGNZcHQEBBQELAYNBgWQWEot7jGCDC?= =?us-ascii?q?JM8gXiEdwKCHCE0GAECAQEBAQEBAgETAQEBAQEIFgZXgjUkAYJPAwMnYj8SV?= =?us-ascii?q?wYBEoMiggQBpxIzg3gBAYRLgWiIN4FUP4h7hWgChzwIhgqLFwcCgWeMbguBO?= =?us-ascii?q?4ZShH+SVIIKTSODE4IgDgmNYQE3bY1QgkYBAQ?= X-IronPort-AV: E=Sophos;i="5.49,460,1520899200"; d="scan'208";a="12288797" X-IronPort-Outbreak-Status: No, level 0, Unknown - Unknown Received: from ucol3cpa07.eemsg.mail.mil ([214.24.24.45]) by EMSM-GH1-UEA10.NCSC.MIL with ESMTP; 30 May 2018 14:12:10 +0000 X-EEMSG-check-005: 0 X-EEMSG-check-006: 000-001;cc529896-3ab7-40c1-b5a6-484f0c3bde1b Authentication-Results: ucol19pa16.eemsg.mail.mil; dkim=none (message not signed) header.i=none X-EEMSG-check-008: 468991633|UCOL19PA16_EEMSG_MP14.csd.disa.mil X-EEMSG-SBRS: 3.5 X-EEMSG-ORIG-IP: 37.139.156.29 X-EEMSG-check-002: true X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A0DNAABDrw5bhx2ciyVcHAEBAQQBAQoBAYU7Eot7jGCDCJM8gXiEdwIIghQhNBgBAgEBAQEBAQIUAQEBCgsJCCgvhSkDAydiPxJXBgESgyKCBacFM4N4AQGES4FoCQGILYFUP4h7hWgChzwIhgqLFwcCgWeMbguBO4ZShH+SVIIKTSODE4IgDgmNYQE3PTCNUIJGAQE X-IPAS-Result: A0DNAABDrw5bhx2ciyVcHAEBAQQBAQoBAYU7Eot7jGCDCJM8gXiEdwIIghQhNBgBAgEBAQEBAQIUAQEBCgsJCCgvhSkDAydiPxJXBgESgyKCBacFM4N4AQGES4FoCQGILYFUP4h7hWgChzwIhgqLFwcCgWeMbguBO4ZShH+SVIIKTSODE4IgDgmNYQE3PTCNUIJGAQE Received: from seldsegrel01.sonyericsson.com ([37.139.156.29]) by ucol19pa16.eemsg.mail.mil with ESMTP; 30 May 2018 14:11:37 +0000 X-EEMSG-check-009: 444-444 From: Peter Enderborg To: , Paul Moore , Stephen Smalley , Eric Paris , James Morris , Daniel Jurgens , Doug Ledford , , , , "Serge E . Hallyn" , "Paul E . McKenney" Date: Wed, 30 May 2018 16:11:03 +0200 Message-ID: <20180530141104.28569-5-peter.enderborg@sony.com> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180530141104.28569-1-peter.enderborg@sony.com> References: <20180530141104.28569-1-peter.enderborg@sony.com> MIME-Version: 1.0 X-Mailman-Approved-At: Wed, 30 May 2018 10:18:15 -0400 Subject: [PATCH V3 4/5 selinux-next] selinux: seqno separation 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: Errors-To: selinux-bounces@tycho.nsa.gov Sender: "Selinux" X-Virus-Scanned: ClamAV using ClamSMTP This patch separtate the locks for read and write, and to be sure that they are using the same structure the seqno is used. If the seqno is changed from the read to write section the function reportes an eagain error. Signed-off-by: Peter Enderborg --- security/selinux/ss/services.c | 143 ++++++++++++++++++++++++++++------------- 1 file changed, 98 insertions(+), 45 deletions(-) diff --git a/security/selinux/ss/services.c b/security/selinux/ss/services.c index 2be471d72c85..954ebe490516 100644 --- a/security/selinux/ss/services.c +++ b/security/selinux/ss/services.c @@ -2104,6 +2104,9 @@ int security_load_policy(struct selinux_state *state, void *data, size_t len) u32 seqno; int rc = 0; struct selinux_ruleset *next_set, *old_set; + size_t size; + void *storage; + struct policydb *pdc; struct policy_file file = { data, len }, *fp = &file; next_set = kzalloc(sizeof(struct selinux_ruleset), GFP_KERNEL); @@ -2111,14 +2114,15 @@ int security_load_policy(struct selinux_state *state, void *data, size_t len) rc = -ENOMEM; goto out; } + next_set->sidtab = kzalloc(sizeof(struct sidtab), GFP_KERNEL); if (!next_set->sidtab) { rc = -ENOMEM; - kfree(next_set); - goto out; + goto nexterr; } if (!state->initialized) { + /* sidtab exist before inititalisation */ old_set = state->ss->active_set; rc = policydb_read(&next_set->policydb, fp); if (rc) @@ -2152,57 +2156,80 @@ int security_load_policy(struct selinux_state *state, void *data, size_t len) kfree(old_set); goto out; } + + pdc = kzalloc(sizeof(struct selinux_ruleset), GFP_KERNEL); + if (!pdc) + goto allocerr; + + rc = policydb_flattened_alloc(&state->ss->active_set->policydb, + &storage, &size); + if (rc) + goto pdcerr; + + read_lock(&state->ss->policy_rwlock); old_set = state->ss->active_set; + rc = policydb_copy(&old_set->policydb, pdc, &storage, size); + + /* save seq */ + seqno = state->ss->latest_granting; + + read_unlock(&state->ss->policy_rwlock); + + policydb_flattened_free(storage); + + if (rc) + goto cpyerr; + #if 0 sidtab_hash_eval(sidtab, "sids"); #endif - rc = policydb_read(&next_set->policydb, fp); if (rc) - goto out; + goto cpyerr; next_set->policydb.len = len; /* If switching between different policy types, log MLS status */ - if (old_set->policydb.mls_enabled && !next_set->policydb.mls_enabled) + if (pdc->mls_enabled && !next_set->policydb.mls_enabled) printk(KERN_INFO "SELinux: Disabling MLS support...\n"); - else if (!old_set->policydb.mls_enabled + else if (!pdc->mls_enabled && next_set->policydb.mls_enabled) printk(KERN_INFO "SELinux: Enabling MLS support...\n"); + rc = policydb_load_isids(&next_set->policydb, next_set->sidtab); if (rc) { printk(KERN_ERR "SELinux: unable to load the initial SIDs\n"); - policydb_destroy(&next_set->policydb); - goto out; + goto cpyerr; } rc = selinux_set_mapping(&next_set->policydb, secclass_map, &newmap); if (rc) - goto err; + goto loaderr; rc = security_preserve_bools(state, &next_set->policydb); if (rc) { printk(KERN_ERR "SELinux: unable to preserve booleans\n"); - goto err; + goto maperr; } rc = sidtab_clone(old_set->sidtab, next_set->sidtab); if (rc) - goto err; + goto maperr; /* * Convert the internal representations of contexts * in the new SID table. */ args.state = state; - args.oldp = &old_set->policydb; + args.oldp = pdc; args.newp = &next_set->policydb; + rc = sidtab_map(next_set->sidtab, convert_context, &args); if (rc) { printk(KERN_ERR "SELinux: unable to convert the internal" " representation of contexts in the new SID" " table\n"); - goto err; + goto maperr; } next_set->map.mapping = newmap.mapping; @@ -2210,30 +2237,44 @@ int security_load_policy(struct selinux_state *state, void *data, size_t len) /* Install the new policydb and SID table. */ write_lock_irq(&state->ss->policy_rwlock); - security_load_policycaps(state, &next_set->policydb); - seqno = ++state->ss->latest_granting; - state->ss->active_set = next_set; - write_unlock_irq(&state->ss->policy_rwlock); - - avc_ss_reset(state->avc, seqno); - selnl_notify_policyload(seqno); - selinux_status_update_policyload(state, seqno); - selinux_netlbl_cache_invalidate(); - selinux_xfrm_notify_policyload(); - - /* Free the old policydb and SID table. */ - policydb_destroy(&old_set->policydb); - sidtab_destroy(old_set->sidtab); - kfree(old_set->sidtab); - kfree(old_set->map.mapping); - kfree(old_set); - rc = 0; - goto out; + if (seqno == state->ss->latest_granting) { + security_load_policycaps(state, &next_set->policydb); + seqno = ++state->ss->latest_granting; + state->ss->active_set = next_set; + write_unlock_irq(&state->ss->policy_rwlock); -err: + avc_ss_reset(state->avc, seqno); + selnl_notify_policyload(seqno); + selinux_status_update_policyload(state, seqno); + selinux_netlbl_cache_invalidate(); + selinux_xfrm_notify_policyload(); + + /* Free the old policydb and SID table. */ + policydb_destroy(pdc); + kfree(pdc); + sidtab_destroy(old_set->sidtab); + policydb_destroy(&old_set->policydb); + kfree(old_set->sidtab); + kfree(old_set->map.mapping); + kfree(old_set); + rc = 0; + goto out; + } else { + write_unlock_irq(&state->ss->policy_rwlock); + rc = -EAGAIN; + } +maperr: kfree(newmap.mapping); +loaderr: sidtab_destroy(next_set->sidtab); +cpyerr: policydb_destroy(&next_set->policydb); + policydb_destroy(pdc); +pdcerr: + kfree(pdc); +allocerr: + kfree(next_set->sidtab); +nexterr: kfree(next_set); out: return rc; @@ -2873,11 +2914,13 @@ int security_set_bools(struct selinux_state *state, int len, int *values) goto errout; } - write_lock_irq(&state->ss->policy_rwlock); + read_lock(&state->ss->policy_rwlock); old_set = state->ss->active_set; + seqno = state->ss->latest_granting; memcpy(next_set, old_set, sizeof(struct selinux_ruleset)); rc = policydb_copy(&old_set->policydb, &next_set->policydb, &storage, size); + read_unlock(&state->ss->policy_rwlock); if (rc) goto out; @@ -2913,19 +2956,29 @@ int security_set_bools(struct selinux_state *state, int len, int *values) rc = 0; out: if (!rc) { - seqno = ++state->ss->latest_granting; - state->ss->active_set = next_set; - rc = 0; - write_unlock_irq(&state->ss->policy_rwlock); - avc_ss_reset(state->avc, seqno); - selnl_notify_policyload(seqno); - selinux_status_update_policyload(state, seqno); - selinux_xfrm_notify_policyload(); - policydb_destroy(&old_set->policydb); - kfree(old_set); + write_lock_irq(&state->ss->policy_rwlock); + if (seqno == state->ss->latest_granting) { + seqno = ++state->ss->latest_granting; + state->ss->active_set = next_set; + rc = 0; + write_unlock_irq(&state->ss->policy_rwlock); + avc_ss_reset(state->avc, seqno); + selnl_notify_policyload(seqno); + selinux_status_update_policyload(state, seqno); + selinux_xfrm_notify_policyload(); + policydb_destroy(&old_set->policydb); + kfree(old_set); + } else { + rc = -ENOMEM; + write_unlock_irq(&state->ss->policy_rwlock); + printk(KERN_ERR "SELinux: %s failed in seqno %d\n", + __func__, rc); + policydb_destroy(&next_set->policydb); + kfree(next_set); + } } else { printk(KERN_ERR "SELinux: %s failed %d\n", __func__, rc); - write_unlock_irq(&state->ss->policy_rwlock); + policydb_destroy(&next_set->policydb); kfree(next_set); } policydb_flattened_free(storage);