From patchwork Wed Dec 21 18:21:03 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicolas Iooss X-Patchwork-Id: 9483615 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 7B9E8601D2 for ; Wed, 21 Dec 2016 18:23:57 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 72E2528458 for ; Wed, 21 Dec 2016 18:23:57 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 67D822847B; Wed, 21 Dec 2016 18:23:57 +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 5EFAF28458 for ; Wed, 21 Dec 2016 18:23:56 +0000 (UTC) X-IronPort-AV: E=Sophos;i="5.33,384,1477958400"; d="scan'208";a="1768320" IronPort-PHdr: =?us-ascii?q?9a23=3AZX31SBZOxqQpBKCU1VaKxrD/LSx+4OfEezUN459i?= =?us-ascii?q?sYplN5qZoci4YB7h7PlgxGXEQZ/co6odzbGH6OawAydRvt6oizMrSNR0TRgLiM?= =?us-ascii?q?EbzUQLIfWuLgnFFsPsdDEwB89YVVVorDmROElRH9viNRWJ+iXhpTEdFQ/iOgVr?= =?us-ascii?q?O+/7BpDdj9it1+C15pbffxhEiCCzbL52Ihi6twbcutcZjYZmKKs61wfErGZPd+?= =?us-ascii?q?lK321jOEidnwz75se+/Z5j9zpftvc8/MNeUqv0Yro1Q6VAADspL2466svrtQLe?= =?us-ascii?q?TQSU/XsTTn8WkhtTDAfb6hzxQ4r8vTH7tup53ymaINH2QLUpUjms86tnVBnlgz?= =?us-ascii?q?oJOD4j9GHcl9J+gqRVrhm8oxBz2pPYbJ2QOPd4Y6jTf84VRXBZU8hRSSJPH42y?= =?us-ascii?q?YYgIAeUDM+ZYt4vwq0YAoBSxGQaiC/3gyiRTi3/q36A3yfgtHBva0AA+Gd8FrX?= =?us-ascii?q?TarM/yNKcXSe271KjIwinEb/NSwzj985XDfBMmofGLRrJwatfaxE4pFwPEklqQ?= =?us-ascii?q?rojlMCmO1ugXsmib6O1gVfm0i2M8rgF8rTeuyt0rionTiYIY01bJ/jh3zoYyIN?= =?us-ascii?q?23Uk97Ydi8HZtfqS6aMZd2QsQlQ21yvyY60LIGtYahcygM1Zsr3Rnfa+aIc4WO?= =?us-ascii?q?/xntV/6RLC9liH9qd7+znRa//VW6xuHiWcS4zkxGojddntTOtH0BzQHf58aJR/?= =?us-ascii?q?dn4EutxTeC2xrd5+1aJ00/iLDVJIQ7wrEqk5oeqUHDHijrl0rolKKWbUAk+vSw?= =?us-ascii?q?6+Tgf7XmuoeQN49qhQH6NaQjgtC/Dv4iMggPQmib4v6w1KHj/ELlQLVKiec6kq?= =?us-ascii?q?/Fv5DBOcsXvKu5Aw5R0oo76ha/CSmp0MgAkHUaI19IdwiLgoj0N13UPvz1Aumz?= =?us-ascii?q?j06xnDtzwvDJJLzhApHDLnjZl7fheK5w61VCxwo3zNBf4Y9UC74YLP3oXU/xqd?= =?us-ascii?q?rYAQMnPAyv2OvnFNV82Z8eWWKIGKOZNrjSvkWS6uIgJOmMepcZuCzhJPg9+/7u?= =?us-ascii?q?kXg5lEcdfKio2psXbmu1HvFiI0mAYHrshM0NEWEQsQokT+zqiUOCXiBJa3a0Qa?= =?us-ascii?q?08+ikxCJi6AofbWoCtnLuB0T+lEZ1OfG9GEFGMEWzzeoWcQfgMciOSItR5kjwA?= =?us-ascii?q?T7euV5Eu2QuptA/gxLptNvDU9TEAtZL/yNh14PXelR8o9TNuCcSSz2CNT3pvk2?= =?us-ascii?q?MNXz823blzoVdzy1eYy6R4hOZYFdNL7fNTTgg6LYLcz/B9C93qWQLOZNSJSFG7?= =?us-ascii?q?Qti9AjE+VNExw9gTY0pnHNWilB/D1TKwA7AJj7yLGIA08qXE0nfrOsl90XfG27?= =?us-ascii?q?c7j1Q9WMRAKWimirR49wjJCI7Di1+ZmLqydaQAwC7N83+OzWqQs0FcVA5wVr7I?= =?us-ascii?q?XXQCZkvKqtT541nNQ6WpCbQ9PQtL0dSCJbdSat31kVVGQ+/uOM/QY2KrnGewHg?= =?us-ascii?q?qIy6iXbIrsfGUc0iDdB1ICkwwJ+3aJKxQ+DD+7o23CFDxuCU7vY0T0/Ohwsny7?= =?us-ascii?q?SlM0wB+Qb016zLe15AAaheaHRPMO27IIoiAhqy97HFylxdLZF8KApxZ9fKVbed?= =?us-ascii?q?49/EpI2n/YtwNnOpytNLxthlkbcwtrpUzuzAl3Bp9Gkcc0sHMg1BByJr6A0FNd?= =?us-ascii?q?azOY2oj9OrvWKmn2+BCgdbXW10rE39mI4KcP7+40q1L5vAGmDkAi6Wlo08FJ03?= =?us-ascii?q?uA4ZXHFBcdXojtUkkt6Rd6qb7bbzIh6IPUz3JsK7W0vSHY294zAusq1Aqgdc9F?= =?us-ascii?q?MKyYDA/yD9EaB8+2Jew0mlimcg4EPOdI9KIuI8ymd/yG2KikPOt7mDKmjGJH75?= =?us-ascii?q?pn0kKL7SZ8TfTI35kdyfGCwgSHTyv8jEumss3vnYBEZCoSHnamxSj/GoFRYqxy?= =?us-ascii?q?fYAWCWahOMC33c1+h5/rW35Z6FGjHEkK2Mm3dhqOd1b9xxFf1VwLoXy7niu11y?= =?us-ascii?q?Z0kzYtrqqbwiPO2fjtdB0JO2NQX2likEvjIZOug9AdRkioYBAjlAG56kbi26hb?= =?us-ascii?q?uKN/InHLQUhSYij2K3tuXbGqurWZZM5P7I8osSJRUOmnZFCWVrj9oxwG3C/5GW?= =?us-ascii?q?tR2iw7fSmwuprlhxx6lH6dLHFroXrcfcF83AnQ5NrHSP5PwDUGQC14hifNBlSm?= =?us-ascii?q?Odmm48mUnY/Zsu+iT2KhSoFTcS7zwIODqiS743ZqDAa8n/+tnN3nCg463jHn19?= =?us-ascii?q?VwUiXIthn8aJHx16umKeJnYlVoBFjk5spkHIFxj5A9hI8W2XcHhpWZ53wHnnnv?= =?us-ascii?q?Md9Dw6LxcGINRSIXw97S+AXlwFdsLm+Nx4/iSnqdw9dhZtmjbmMYwC096dpGCK?= =?us-ascii?q?CO7LxLhSF1uEa3rRrNYfhhmTcQ0eEu52MHjOwStwotyyqcDqoUHUZGISzmjw6I?= =?us-ascii?q?4MymrKVLeGavdqC91FJkktC8CLGNvBlcV2z/epc+AyBw9N5yME/X0HLt8IHkY8?= =?us-ascii?q?PcbckUth2JiRfPk/ZaKJw2lvoQiipoJ3jxvXs7xO4nlRZux421vJCbK2Vx+6K0?= =?us-ascii?q?GhBYOSfzZ8MP/THtiL1TnsiI0I+yGZVhAC8EXIPyTfKvEjIdq+joNxqUHD07sH?= =?us-ascii?q?ebFqLVHRWD50d+s3LPD5erOmmYJHkZ0dpiXhmcJFRDgAATRzg6mIA2FhyxxMP9?= =?us-ascii?q?akh5/i4e6kT+qhRS1uJiLwP/XXvHpAe0djc0T4CSLB9M4QFG40faL9Ce7v5pEC?= =?us-ascii?q?5C5ZChqhKCKnCAZwtUF24JQlKLC0rlPraw+dnK6/KYCfamL/vSfbWOrvRTV+2S?= =?us-ascii?q?yZOhyIdm+iyDNsGIPnhiFPA0wFZMXXVjF8TegTUPRDQdlzjRYM6DuBe85ip3o9?= =?us-ascii?q?i58PTxQg3v/ZOPBqBcMdVu4RC2mruDN+CRhCZ/MzlY0I8DxX7Sx7gbxlISjDtu?= =?us-ascii?q?dza1G7QaqSHNVL7QmrNQDxMDcyN8KtBH4Lw63glMJc7bjcj41r9mgfErFVhJT1?= =?us-ascii?q?vhmtumZcYSOWGyKEvHBFqXNLSBPTDE2Nr4baS4Sb1Rl+VUqwawtSyAE0D9IjuP?= =?us-ascii?q?jSLpWA6rMeFNiiGbIRNftZqhfRdtE2jjUcnmZge1MdBtkT022ro0hnXQOW4bKz?= =?us-ascii?q?h8fFtHrqeM4iNAnvV/B2tB42J+LeaehSaW9ebYJYgNsfZwGSR7jfxa7241y7RL?= =?us-ascii?q?9yFIXvp1lzXOrtR2uVGpjvGPyiZ7UBpJsjtEn4OLvUplOaXf7ZRPRGjL8wkM7W?= =?us-ascii?q?qKDRQGvdxlCsfgu6pI0NjAiLrzKCte89LT5cYTHcfUJ9iZMHU/KhfpHybUAxUD?= =?us-ascii?q?TT6uL27fhkhdn+qV9nyatJQ6rYLsmJUWQL9BSFM1Du8aClhiHNEaPJd3WTYkna?= =?us-ascii?q?SBjM4P5Huxsh/RS95AvpDASP2SAu7iJyqejblBexQH26j4LZgJOo39xUNidkFw?= =?us-ascii?q?nJ7WFErIQdBNviphYxc3oERN9HhxUHY+20fiagOj7n8cC+K0ngI2igt5ZOQi6i?= =?us-ascii?q?3g41EpKVrWvCEwilU+mc35gTCNdz78NKawXYdKCyXqs0g+LJb7TBhpbQ2onU1p?= =?us-ascii?q?LzDER6pPgLtmcGBkkg7cuZ9UFv5bQqxIehgQxeuYZ/8wy1RTtj2nxVNb5evCEZ?= =?us-ascii?q?ZikhUlfoSor39b2AJja8U1JbDKK6pP1VhQhaOOsjWu1u8v3A8UP1wN/3+KeC4U?= =?us-ascii?q?pEwIMaErJzC28ex39wONgSFDd3QMV/cxuf1q91k9NPmHzyLuy75DMF6+NuyFI6?= =?us-ascii?q?OfpWfAidaCQkks2UMQi0lF4b923N8+fEqTUUAvyqaeGAoNNcrDMgxaddRd9GLU?= =?us-ascii?q?fSqUtuXN2511NZ2nFu/0Ve+OqLoUgkW8EQk0BYsM8MUBEYS30EzDN8jnNqQFyR?= =?us-ascii?q?Ij5QTwOlqKEOlJeAiKkDcbo8Cz1pl30pdBJjsFG2VyLT235qrLpg8tmPeMQcw2?= =?us-ascii?q?bWkAUYsLLHI5QtO6ljVCv3taDzm3z/gZxxKY4z/4uyTQCiPzb8B6aPeIYhNsC9?= =?us-ascii?q?G3+TIl/6iwl1HX7o3UJ3vmOtR6pt/P9eQaqo6JC/NOU7ZyrlzclJNeR3y2VG7P?= =?us-ascii?q?CsW4KILsZIkpd9D0DWy6UlOngTIvU8jxJMqtLrSPgQzwQYZUt5Ob0y4lNc68ET?= =?us-ascii?q?ETABhwp+ce5K5mYg0DeZU7awbytwsiL6y/PBuY0tK2Tma2NzRWS/hfzeOnZ71Y?= =?us-ascii?q?1Ccjcui6yH48QZ4g1Om37VQBRJcUgRHC3fyjfZVRUTDvGnxBfAXCvSk5l3JhN+?= =?us-ascii?q?koxOc/3BPIvEITMzCMbOxmdHZIv9ciClOOOX92EHY3R0eAjYrf5Q6hx6wS/ypY?= =?us-ascii?q?n9ZTze1FsHj/s4TCbzKtWK2ks47avzAmbdc4v617KZbjLdeetJPCgjzfS4HdvR?= =?us-ascii?q?eBUC67C/VVhMBfICdYQflOnmElP9YJtJFa5kowTMg+IaVDCKcxprywbzprEzIS?= =?us-ascii?q?xzcDV4ycxDwCnvu827zCmxiLbpsiNgcJv49fjdsDTSF2eDgeq7W5V4TWjWOETX?= =?us-ascii?q?ILIAgL5wRW+A0AjpNwfvzi4IfQQ59M1j9Wo/ZwUiTVE5ll7Eb0RX+Njlj5Uvqh?= =?us-ascii?q?lfal3QVIzPLjytMbQgJwCVBBx+ZKkUslMKt3K68RvoHWsj+Ickf6vHn1xuW/OV?= =?us-ascii?q?df09HZeVrjAYXZsmr8VzET9mcPRY9T0n3fE4odkxZhYqYxuFpMOJymelr55zE8?= =?us-ascii?q?24tpHaO3Wtywylk5qnYGQyOqE9tfBOF8rFLYRiFqY5CxpJXiIZVSTXda+IeBpF?= =?us-ascii?q?dBjEVtLym5xIJGK85X+D4MWyNArC6BvNuoUsJDx9F5D5sNItd5tHf9HKJEOJeR?= =?us-ascii?q?o30qtLzg0GXZ+zUmvFe82jqzB7eyT/hF8G0GBgUpO2Oep1EvDuQ26Wfd6FXNsl?= =?us-ascii?q?Fy/+pAB7iPkV9+oC1hEZ9UHDpJ026qL0hrRnlcr+paMLjVc9BbQ/Qqax6jIQAx?= =?us-ascii?q?Ff4n30yM/EF7h3T5bjdztgRE5S/SQRM4VS4PgrfigTcesN2oOScGS5JUajUsdz?= =?us-ascii?q?3KKxiGmSBRphpfaFpnW5EYAtZE57EUxpFY/szcRkawMSsFRgBtNhok0fpDkk5O?= =?us-ascii?q?qEqYeTrHAgquafbCqRx3fcCfrc6vMPT5/BlIioLhsOAk6aoDXWeqmQuzTtDCt4?= =?us-ascii?q?X8rMGFtlOSdKfkNO2xeWPBTD/JjR2rmbcoE5zK8DPJPApdNZZ61WIuYYL9Bm7T?= =?us-ascii?q?IRRGO6UbKlJbVa9gc9VJuORaaNJ/dakU56BtHgqHSQ3rGIOxtvlKNFHTRS7RLy?= =?us-ascii?q?+Z6OywvZrT7aDBSejnfsGMxXHHTLxsM5hn9zb7AKnl0ZVC+kXox/hh7EV6Rkba?= =?us-ascii?q?MyqZttTuOhsL5NW+dkvlppAmBj3WD4tsnHfv201NedEaTDGt8JQd1JxW8m3wSf?= =?us-ascii?q?5i3kj1ruJS66Fu6ZMr7LBx1ce0OaDSJOxAsUB5HxeUBh9l9ok2DWh7QGBRfPEe?= =?us-ascii?q?JOnNcqQekM/htfr7F6oJ5x2J4+ZZc8fIJ1ndmsmjDTGRUQREnBwdqTEAMwScy+?= =?us-ascii?q?WIm7RzSca4v+j2xlwi416iLh4c1r9t4Z2I+q2SpO/YdxHR16QLWrD2RsPvqbQh?= =?us-ascii?q?o1+S5ec6m7EQZ2N4eBCnEOwBVs4H3Gjg06EqzSUoE8zdA7Ls4vlDV2g2njj4gZ?= =?us-ascii?q?ByA00WGu8IHbqM5YlRg2E4lPbCO9ILdKBNgHyDFRm+Er8N0XSr8TeYIHF5ghHS?= =?us-ascii?q?1BH9WWGz40XsrS9/WivMy83sklROW7myGEdSWzapOU5kvzOOJgXossH3tb4y7E?= =?us-ascii?q?EsPWzurMiNm3e5OLNLA83/I8SRISsuq1IRgp0xXNuv1p0FFtemPNce6nd+buDZ?= =?us-ascii?q?62+xlS9OvbtHjZLE4s6J4vXXAWWgj6qCprWLwDBV0Xk4vVc66ty6N/HO4dOKQ+?= =?us-ascii?q?6y2GYKUyd/oRbBUAKpqrzGtVAbJ1aH0EDRmIwFJttZx2U31ln65Og/R9I+7ANe?= =?us-ascii?q?FofcaPMFoTD8IiD0zUyeY9IwUSmeyCBXE0nwEVR3F6kwwmXwvNjGlX3I4V0nWp?= =?us-ascii?q?Fwd1D7hRxwF4g3NVgi6FwJzSoYDQgMaRebAaqzBUv5LIsLS04DaQiG3LegYKs3?= =?us-ascii?q?21N8wq+37u/JceN8H7YNNupajgOWmFhbAZcWvK0FTbJyZVBS6anXphL4BIj/Rf?= =?us-ascii?q?jmkngwOuOpTcBG68wZsGEi4gmnTRq69ZhD96obiIyPdqNcZJjMuN5z70Jg5TER?= =?us-ascii?q?cixAmxd/gA2+UeAHvODs+MTbsJuy5eaqVaYtQfkX+AYwB2R6jpvwj04sodfL2O?= =?us-ascii?q?hCUIHVj5rw8BxVKX6QpInaywV8KfYJK4+zfrZg9nAHKjMbJ30QPduZdeM84y5r?= =?us-ascii?q?MDXc/VBCBN0DZc8ANsrXhQ9UklHpWK1U9sfDG1+ZCp18eNo04Gfs0zA674c8Xf?= =?us-ascii?q?j85zOsIpDf9V5NNetZjCpwjNLCuPQVwf3KBScM4HmZcBZ0zTmAy5mMF/bw5f+D?= =?us-ascii?q?yMzQV14dAiE2VJpSKySY9gy6XOq1k4/pXRmO5s/0mpI+e1qaRmatk6QdrqZMDe?= =?us-ascii?q?lAhz3j3jdECoD6m/KVstSr6GtNtV1LCZ1z4gPBGKVeOJV7JBv5m9KzRkdmGivw?= =?us-ascii?q?ZMHUdxQpuOqMxecA+eZ+OFXkZY8dPB0Ez6j26X1PTgthULT2pEqWXfoNZNt6T/?= =?us-ascii?q?PJtmxV6Zh+JK8LJledooLloyxVp1A3Dw8paaMwoSZBdkbUhg1VRrz4uLgehQsA?= =?us-ascii?q?SdR5o1NDGXqsOGIi4DrKTatVg7OLCPML7jWTTrcDU0FpMiNiXRy12I9he6aynf?= =?us-ascii?q?xdtGNJgD99quAw0zN6XBu8pTHsp6UV1DIv5r64sikBuXtCTumZiCfHF1FDzPUM?= =?us-ascii?q?jacBBHfv8li8b2cZbIry+rZrP8Lg+pc9434nexUsYzUGXfi8CyH3l66IB4uPsN?= =?us-ascii?q?RAhB6CpsrDdrqzLSkIObQ71x3jW3Z80g/EnBZr62sHWDOg48E4JI+lI8Yq2jKo?= =?us-ascii?q?GXTHdFYL+q5Jv9f+tUUQTOcvdF1vz2Nt0smBRi0QS83CAGk1jg0+ZmVCbp1P8x?= =?us-ascii?q?gaF7MngjyQpKlJ4hkUYCvIEoSi4oTQn8DI2Xk7Tdtw2m3WpqmFho4333xkmtN0?= =?us-ascii?q?6DWOuHcTd+HDTc9sA2bz2Z1byePjZvWhqOYHR5V6yL65Sv8NLtGj+Xeq2JVtQk?= =?us-ascii?q?Klx6oeEEC/MOIYwrfbTjqqSWyfWeSQaWSMmCw5MkHq7xmyMlI3cNtKr1M6Muba?= =?us-ascii?q?hJ5TiQPhUb1wRiiLq17U1mojPv0Gdw4svoeoZRAKRvYLZ+eAPegu3OE+CFwUYn?= =?us-ascii?q?/GGSt2DOG3vkCpnIh/IHhg+kL6YeLs8g/6KteSHAcLEZLCpJ5r5fO6Xn6BOWNn?= =?us-ascii?q?zBBqPkl09+feF0w2tu9YcpaRgcbfis9+0e4Ea/dtKzMytsQUmoJ55omeyN2Kfg?= =?us-ascii?q?3JzpbuOdHVpeCVA+Hez0QvYWxaTrsZbh/254okOt41QbvTEqVFvR4EH6g1XIQh?= =?us-ascii?q?N3vt9KFzNA5zdw/RZLe3gsntve+LZIFbp3zR7lI2MijcvQcPyvqqQgxnd5qqnW?= =?us-ascii?q?n9IIgsRjJdqN1gEgBpE5VJG8MctAenGJqUmKani9+t5UN1pfIFvbD3CvDQ29Sz?= =?us-ascii?q?x59xUIRC5UyXIDbRA7FmglxijuS2mPjAyJfwCcTmedMKT+V7R2nFarjdHoqhNj?= =?us-ascii?q?2OIMX8e1Vd876d1rJ5XQ+dZCfjX6qJrCekLulr4V0nyoxke+re1DIt4K/f2Nvz?= =?us-ascii?q?f2FUuDyurH+INJta6VzFG/beXxZKRvaf92ZlB6IXZ5Pu9OgSKdwi3MSc4w5r4T?= =?us-ascii?q?RCzMuFI6+hrkrW1UJgbp/bKUrp2zojWYYUOhi/NlEsgWDBoHTHHXtcNtSkKdVq?= =?us-ascii?q?gNuNAB3t/1NxmWAxaWFfAWfoQNaROXQB282gfgGK8xhLD9kble6tZUE4rrGySf?= =?us-ascii?q?VvOphdnuWqsKsInM1xKyHLXsdaJD3QLL5qMTpNFOXAukYnbgQCs7crRoc/fYKO?= =?us-ascii?q?L18fMEec1SPyyhPP0Un1d9yqyaaILz8a8nFGz7LezThMvBK0ufeDjc3lV7DVdp?= =?us-ascii?q?b2XOTdMCA9TDGVWSwyEVq1+Vejo/cEp+SXIWMeolASfyKTBwkfqK9zrdjQEGDT?= =?us-ascii?q?g/NsfIUQi/2BWCD/Vjd4lKwsCSZPrk+MXvUDGRPRb3/7j2pWoBaiKeNU/XL5c7?= =?us-ascii?q?2YwbJYW+gXAotXbv2UWNrZeelYJzgyjDkZPvizf8HEpbYjzl3IVXcZE7XP9FCG?= =?us-ascii?q?SU6ZWOCTxzLqXYUTuIg5oTQo+tPWniBpF6TIPrCfpyOh84KiiyaYo+LeXHE3Y0?= =?us-ascii?q?MpmOICHHWBwB5YJWEGEd4Vu0btTbWbakZR0nIpleJu2xgReAR8Un1uzmdanPCj?= =?us-ascii?q?Fc1FUVQUln+hQOUabFBrCzM95UCK7RfpbtwauMDcWWte+6ASSYoZNvYo84jXOL?= =?us-ascii?q?YKzPYvwj1mvDQwsz+BAFNFkgKF763QEbp+xr1H4mk45et2XkCUQz7EdGjI0I+m?= =?us-ascii?q?BNxOxSt0pnDkzcXUtPh3NLRGv4F5HEsKASVuK9DG8zBBVH371QqxshugAjSRPi?= =?us-ascii?q?gZ4DcKJCwCcOZ51el7vwjUdtzZ80Ofq7ohqFe3CQaMEre02ptLCsft1QijbClE?= =?us-ascii?q?byikF55xqvZXiNkdf7krZY6gDFDdfUDCCVeDtiQN8gX6iqi6BspNhGMFm+MjL8?= =?us-ascii?q?+6cZMNCIz/3Tp/x39TjLsIynaKSofZZ5b+78VjQ3AJMYKmYXy3cNTOJTqk56NL?= =?us-ascii?q?6YsnC0vHMLZSB2lcqZNj0z6yYg=3D=3D?= X-IPAS-Result: =?us-ascii?q?A2HqBAA0yFpY/wHyM5BdHAEBBAEBCgEBFwEBBAEBCgEBgwo?= =?us-ascii?q?BAQEBAR9cgQiOQ6x3IwaHXVMBAQEBAQEBAQIBAl8ogjMaDT0QAQEBAQEBAQEBA?= =?us-ascii?q?gEBHwEBAQEBASMCDRhGBgECJBMUIA4DCQEBFykICAMBLRURDgsFBBICBIhLBAE?= =?us-ascii?q?Jqh48KgKDaIZwCwEBASSGNoYogTSBDxEBhX0BBIhlkhKBeoRYgxKHSIICiESGG?= =?us-ascii?q?Id5ijpXaB9Rg2UcgV5xAQEBAQGGJYIuAQEB?= Received: from unknown (HELO tarius.tycho.ncsc.mil) ([144.51.242.1]) by emsm-gh1-uea11.nsa.gov with ESMTP; 21 Dec 2016 18:23:54 +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 uBLINoNB021569; Wed, 21 Dec 2016 13:23:51 -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 uBLIMOs6034192 for ; Wed, 21 Dec 2016 13:22:24 -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 uBLIMCXo021001 for ; Wed, 21 Dec 2016 13:22:24 -0500 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A1AzAAAeyFpYhyIeaIFdHAEBBAEBCgEBgzUBAQEBAXuBCI5DqGKEMwuHXVMBAgEBAQEBAhMBAQEKCwkJHYUZBidiUVcZCRKIUQQBCaoePIQUhyKGNoYogTSHHgWIZZISgXqEWIMSh0iCAo5ch3mKOoFdhDYcgV5xAQEBAQGIUwEBAQ X-IPAS-Result: A1AzAAAeyFpYhyIeaIFdHAEBBAEBCgEBgzUBAQEBAXuBCI5DqGKEMwuHXVMBAgEBAQEBAhMBAQEKCwkJHYUZBidiUVcZCRKIUQQBCaoePIQUhyKGNoYogTSHHgWIZZISgXqEWIMSh0iCAo5ch3mKOoFdhDYcgV5xAQEBAQGIUwEBAQ X-IronPort-AV: E=Sophos;i="5.33,384,1477972800"; d="scan'208";a="5887169" 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; 21 Dec 2016 13:22:23 -0500 IronPort-PHdr: =?us-ascii?q?9a23=3AqCziXhUhc7rJ91TpbcoPnG0WMv3V8LGtZVwlr6E/?= =?us-ascii?q?grcLSJyIuqrYbBCDt8tkgFKBZ4jH8fUM07OQ6PG7Hzxaqsfe+Fk5M7V0Hycfjs?= =?us-ascii?q?sXmwFySOWkMmbcaMDQUiohAc5ZX0Vk9XzoeWJcGcL5ekGA6ibqtW1aFRrwLxd6?= =?us-ascii?q?KfroEYDOkcu3y/qy+5rOaAlUmTaxe71/IRG4oAnLtcQan4RuJ6IzxxDUvnZGZu?= =?us-ascii?q?NayH9yK1mOhRj8/MCw/JBi8yRUpf0s8tNLXLv5caolU7FWFSwqPG8p6sLlsxnD?= =?us-ascii?q?VhaP6WAHUmoKiBpIAhPK4w/8U5zsryb1rOt92C2dPc3rUbA5XCmp4ql3RBP0ji?= =?us-ascii?q?oMKjg0+3zVhMNtlqJWuBKvqQJizYDaY4+bM/hxfq3GcN8GWWZMRNpdWjZdDo+g?= =?us-ascii?q?aYYEEuoPPfxfr4n4v1YAtRq+ChWrBOPr0DBInWL906490+QmCgHGxxErEtUIsH?= =?us-ascii?q?TVsNr1M6MSXvquzKXSzDXDaPRW2Szm6IXTdxAsrv6NUah3ccrLxkkiDgXIhUie?= =?us-ascii?q?p4ziOjOazOUNs26D4upvS+2vjXInqwZ2ojS1wccskIbJipoPxVDC6Cp12oE1Jc?= =?us-ascii?q?e3SEN9fNWqE4NQujmHO4doRs4uWXxktDo1x7Ect5O3YDIGxZooyhLHafGKcZKE?= =?us-ascii?q?7g/tWeufOzt0mm5pdbOlixu870StzPD3WNOu31ZQtCVFl8HBtnAT2BzX7ciKUv?= =?us-ascii?q?59/0i81TqVzwDT7eVEIEAolaXFN5EhwrgwlpsKsUTeACD6gkL2jLWZdkk8++io?= =?us-ascii?q?7froYqn+q5OBKYN5jhvyPrkylsGwG+g1PBQCU3KV9OmzzLHj+Ff2QLROjv04iK?= =?us-ascii?q?nZt5XaKNwGqKClHgFZzp4u6w2xAjmnztQVhXsIIl1ddRKCgIXoNEvCIPfiDfew?= =?us-ascii?q?m1msljZryOzBPr3lGJrNNWLPkLbmfbZ68E5c0xE+wstY55JJDLEOPOz8WlTruN?= =?us-ascii?q?zdARI4PBa4w+H9CNVyzo8eQ36AAreFMKPOtl+F/vkvLPeIZI8Uvjb9Nvck6uXy?= =?us-ascii?q?jX45hVAdfa6p0YERaHCjBPtqOUqZYX3ygoRJLWBfpQc6Ter3mHWeQDVTYDC0RK?= =?us-ascii?q?t66TYlW6y8CoKWYIGmh7iIx2+aGZpNfSgSDFGHFnPhbMOFXPAXcwqXft8nlSYL?= =?us-ascii?q?A+vyA7Q93A2j4Vepg4FsKfDZr3UV?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0GOAADyxlpYhyIeaIFdHAEBBAEBCgEBF?= =?us-ascii?q?wEBBAEBCgEBgwoBAQEBAXuBCI5DqGKEMwuHXVMBAQEBAQEBAQIBAhABAQEKCwk?= =?us-ascii?q?JHTCCMxiCHgYnYlFXGQkSiFEEAQmqJDyEFIcihjaGKIE0hx4FiGWSEoF6hFiDE?= =?us-ascii?q?odIggKOXId5ijqBXoQ2HIFecQEBAQEBiFMBAQE?= X-IPAS-Result: =?us-ascii?q?A0GOAADyxlpYhyIeaIFdHAEBBAEBCgEBFwEBBAEBCgEBgwo?= =?us-ascii?q?BAQEBAXuBCI5DqGKEMwuHXVMBAQEBAQEBAQIBAhABAQEKCwkJHTCCMxiCHgYnY?= =?us-ascii?q?lFXGQkSiFEEAQmqJDyEFIcihjaGKIE0hx4FiGWSEoF6hFiDEodIggKOXId5ijq?= =?us-ascii?q?BXoQ2HIFecQEBAQEBiFMBAQE?= X-IronPort-AV: E=Sophos;i="5.33,384,1477958400"; d="scan'208";a="1768039" Received: from mx1.polytechnique.org ([129.104.30.34]) by emsm-gh1-uea11.nsa.gov with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 21 Dec 2016 18:22:15 +0000 Received: from localhost.localdomain (32.206.133.77.rev.sfr.net [77.133.206.32]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id D569C5647EF for ; Wed, 21 Dec 2016 19:22:13 +0100 (CET) From: Nicolas Iooss To: selinux@tycho.nsa.gov Subject: [PATCH v2 6/7] libsemanage: genhomedircon: drop ustr dependency Date: Wed, 21 Dec 2016 19:21:03 +0100 Message-Id: <20161221182104.16967-7-nicolas.iooss@m4x.org> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20161221182104.16967-1-nicolas.iooss@m4x.org> References: <20161221182104.16967-1-nicolas.iooss@m4x.org> X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Wed Dec 21 19:22:14 2016 +0100 (CET)) X-Org-Mail: nicolas.iooss.2010@polytechnique.org 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 ustr library uses old (pre-C99) "extern inline" semantic. This makes it incompatible with recent versions of gcc and clang, which default to C99 standard. Distributions have shipped patched versions of this library to fix issues (e.g. Gentoo package uses this patch: https://gitweb.gentoo.org/repo/gentoo.git/tree/dev-libs/ustr/files/ustr-1.0.4-gcc_5-check.patch?id=7dea6f8820f36bf389e6315044bea7507553bed0 ) but there is no upstream solution to make ustr compatible with C99 standard. The git tree of ustr (http://www.and.org/ustr/ustr.git) has not been updated since 2008 and the developer of this project did not reply to emails. Therefore update genhomedircon implementation in order to no longer rely on ustr library. Signed-off-by: Nicolas Iooss --- libsemanage/src/genhomedircon.c | 154 ++++++++++++++++++++-------------------- 1 file changed, 77 insertions(+), 77 deletions(-) diff --git a/libsemanage/src/genhomedircon.c b/libsemanage/src/genhomedircon.c index 5e9d7224a06e..7ceeafb7b5d9 100644 --- a/libsemanage/src/genhomedircon.c +++ b/libsemanage/src/genhomedircon.c @@ -34,9 +34,9 @@ #include "utilities.h" #include "genhomedircon.h" -#include #include +#include #include #include #include @@ -239,46 +239,39 @@ static int fcontext_matches(const semanage_fcontext_t *fcontext, void *varg) { const char *oexpr = semanage_fcontext_get_expr(fcontext); fc_match_handle_t *handp = varg; - struct Ustr *expr; + char *expr = NULL; regex_t re; int type, retval = -1; + size_t len; /* Only match ALL or DIR */ type = semanage_fcontext_get_type(fcontext); if (type != SEMANAGE_FCONTEXT_ALL && type != SEMANAGE_FCONTEXT_ALL) return 0; - /* Convert oexpr into a Ustr and anchor it at the beginning */ - expr = ustr_dup_cstr("^"); - if (expr == USTR_NULL) - goto done; - if (!ustr_add_cstr(&expr, oexpr)) - goto done; - - /* Strip off trailing ".+" or ".*" */ - if (ustr_cmp_suffix_cstr_eq(expr, ".+") || - ustr_cmp_suffix_cstr_eq(expr, ".*")) { - if (!ustr_del(&expr, 2)) - goto done; - } - - /* Strip off trailing "(/.*)?" */ - if (ustr_cmp_suffix_cstr_eq(expr, "(/.*)?")) { - if (!ustr_del(&expr, 6)) - goto done; - } - - if (ustr_cmp_suffix_cstr_eq(expr, "/")) { - if (!ustr_del(&expr, 1)) - goto done; - } - - /* Append pattern to eat up trailing slashes */ - if (!ustr_add_cstr(&expr, "/*$")) - goto done; + len = strlen(oexpr); + /* Define a macro to strip a literal string from the end of oexpr */ +#define rstrip_oexpr_len(cstr, cstrlen) \ + do { \ + if (len >= (cstrlen) && !strncmp(oexpr + len - (cstrlen), (cstr), (cstrlen))) \ + len -= (cstrlen); \ + } while (0) +#define rstrip_oexpr(cstr) rstrip_oexpr_len(cstr, sizeof(cstr) - 1) + + rstrip_oexpr(".+"); + rstrip_oexpr(".*"); + rstrip_oexpr("(/.*)?"); + rstrip_oexpr("/"); + +#undef rstrip_oexpr_len +#undef rstrip_oexpr + + /* Anchor oexpr at the beginning and append pattern to eat up trailing slashes */ + if (asprintf(&expr, "^%.*s/*$", (int)len, oexpr) < 0) + return -1; /* Check dir against expr */ - if (regcomp(&re, ustr_cstr(expr), REG_EXTENDED) != 0) + if (regcomp(&re, expr, REG_EXTENDED) != 0) goto done; if (regexec(&re, handp->dir, 0, NULL, 0) == 0) handp->matched = 1; @@ -287,7 +280,7 @@ static int fcontext_matches(const semanage_fcontext_t *fcontext, void *varg) retval = 0; done: - ustr_free(expr); + free(expr); return retval; } @@ -523,44 +516,50 @@ static semanage_list_t *make_template(genhomedircon_settings_t * s, return template_data; } -static Ustr *replace_all(const char *str, const replacement_pair_t * repl) +static char *replace_all(const char *str, const replacement_pair_t * repl) { - Ustr *retval = USTR_NULL; + char *retval, *retval2; int i; if (!str || !repl) - goto done; - if (!(retval = ustr_dup_cstr(str))) - goto done; + return NULL; - for (i = 0; repl[i].search_for; i++) { - ustr_replace_cstr(&retval, repl[i].search_for, - repl[i].replace_with, 0); + retval = strdup(str); + for (i = 0; retval != NULL && repl[i].search_for; i++) { + retval2 = semanage_str_replace(repl[i].search_for, + repl[i].replace_with, retval, 0); + free(retval); + retval = retval2; } - if (ustr_enomem(retval)) - ustr_sc_free(&retval); - - done: return retval; } -static const char * extract_context(Ustr *line) +static const char *extract_context(const char *line) { - const char whitespace[] = " \t\n"; - size_t off, len; - - /* check for trailing whitespace */ - off = ustr_spn_chrs_rev(line, 0, whitespace, strlen(whitespace)); - - /* find the length of the last field in line */ - len = ustr_cspn_chrs_rev(line, off, whitespace, strlen(whitespace)); - - if (len == 0) + const char *p = line; + size_t off; + + off = strlen(p); + p += off; + /* consider trailing whitespaces */ + while (off > 0) { + p--; + off--; + if (!isspace(*p)) + break; + } + if (off == 0) return NULL; - return ustr_cstr(line) + ustr_len(line) - (len + off); + + /* find the last field in line */ + while (off > 0 && !isspace(*(p - 1))) { + p--; + off--; + } + return p; } -static int check_line(genhomedircon_settings_t * s, Ustr *line) +static int check_line(genhomedircon_settings_t * s, const char *line) { sepol_context_t *ctx_record = NULL; const char *ctx_str; @@ -584,22 +583,22 @@ static int write_replacements(genhomedircon_settings_t * s, FILE * out, const semanage_list_t * tpl, const replacement_pair_t *repl) { - Ustr *line = USTR_NULL; + char *line; for (; tpl; tpl = tpl->next) { line = replace_all(tpl->data, repl); if (!line) goto fail; if (check_line(s, line) == STATUS_SUCCESS) { - if (!ustr_io_putfileline(&line, out)) + if (fprintf(out, "%s\n", line) < 0) goto fail; } - ustr_sc_free(&line); + free(line); } return STATUS_SUCCESS; fail: - ustr_sc_free(&line); + free(line); return STATUS_ERR; } @@ -607,7 +606,7 @@ static int write_contexts(genhomedircon_settings_t *s, FILE *out, semanage_list_t *tpl, const replacement_pair_t *repl, const genhomedircon_user_entry_t *user) { - Ustr *line = USTR_NULL; + char *line, *temp; sepol_context_t *context = NULL; char *new_context_str = NULL; @@ -624,10 +623,10 @@ static int write_contexts(genhomedircon_settings_t *s, FILE *out, if (strcmp(old_context_str, CONTEXT_NONE) == 0) { if (check_line(s, line) == STATUS_SUCCESS && - !ustr_io_putfileline(&line, out)) { + fprintf(out, "%s\n", line) < 0) { goto fail; } - + free(line); continue; } @@ -657,25 +656,27 @@ static int write_contexts(genhomedircon_settings_t *s, FILE *out, goto fail; } - if (!ustr_replace_cstr(&line, old_context_str, - new_context_str, 1)) { + temp = semanage_str_replace(old_context_str, new_context_str, + line, 1); + if (!temp) { goto fail; } + free(line); + line = temp; if (check_line(s, line) == STATUS_SUCCESS) { - if (!ustr_io_putfileline(&line, out)) { + if (fprintf(out, "%s\n", line) < 0) goto fail; - } } - ustr_sc_free(&line); + free(line); sepol_context_free(context); free(new_context_str); } return STATUS_SUCCESS; fail: - ustr_sc_free(&line); + free(line); sepol_context_free(context); free(new_context_str); return STATUS_ERR; @@ -1288,20 +1289,19 @@ static int write_context_file(genhomedircon_settings_t * s, FILE * out) } for (h = homedirs; h; h = h->next) { - Ustr *temp = ustr_dup_cstr(h->data); + char *temp = NULL; - if (!temp || !ustr_add_cstr(&temp, "/" FALLBACK_NAME)) { - ustr_sc_free(&temp); + if (asprintf(&temp, "%s/%s", h->data, FALLBACK_NAME) < 0) { retval = STATUS_ERR; goto done; } free(s->fallback->home); - s->fallback->home = (char*) ustr_cstr(temp); + s->fallback->home = temp; if (write_home_dir_context(s, out, homedir_context_tpl, s->fallback) != STATUS_SUCCESS) { - ustr_sc_free(&temp); + free(temp); s->fallback->home = NULL; retval = STATUS_ERR; goto done; @@ -1309,13 +1309,13 @@ static int write_context_file(genhomedircon_settings_t * s, FILE * out) if (write_home_root_context(s, out, homeroot_context_tpl, h->data) != STATUS_SUCCESS) { - ustr_sc_free(&temp); + free(temp); s->fallback->home = NULL; retval = STATUS_ERR; goto done; } - ustr_sc_free(&temp); + free(temp); s->fallback->home = NULL; } }