From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 01525C433FE for ; Fri, 4 Mar 2022 19:14:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229448AbiCDTPI (ORCPT ); Fri, 4 Mar 2022 14:15:08 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50708 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229818AbiCDTPD (ORCPT ); Fri, 4 Mar 2022 14:15:03 -0500 Received: from sonic304-28.consmr.mail.ne1.yahoo.com (sonic304-28.consmr.mail.ne1.yahoo.com [66.163.191.154]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 038261EDA20 for ; Fri, 4 Mar 2022 11:14:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646421248; bh=ZzAkbJEgcCl/wlvhYhWz1o5OOjhPur/+vXH4B7YIX8k=; h=Date:Subject:To:Cc:References:From:In-Reply-To:From:Subject:Reply-To; b=IxfEmW1UO0wqgcatdjdhdBZi1eNRMvcV3YJn4xf8sPAX10PCgSdzZHI4oToHhtU8Sk1+EHkTdAkMnML+hqFf5eKMozFiTLIZ1GzK5ul5x+ij85AsBuh0ijM0IdPj7lkpCh1lGRWPvPkZJ6B5bp1g26SGSsZT4gTryC5Y7F1HB6gZA0SLCS52Qzpo7xoq02tC6XPZnAVoAUnfMrOgBE3V2Z7c8U2b0b8qllUvslMp6xgzDqKHTAiwg1XNNk3DGtHG1/n7lBPN4+BbbDuk1tWRQs8PmRJVLJMZSLOUg+1bdXqY693uRW+ZRmK172PoFT7MS02wOGY6IhRyQQKqy/rUgA== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646421248; bh=IxcbM8anrb8CxsjVPQr1+oyTq9Blb7EOeyIdSaXCal9=; h=X-Sonic-MF:Date:Subject:To:From:From:Subject; b=R9OqqfxeLV6Bbiw8wm38xk83JMVH+BwH7Vc4uQI0WLLJ0iaxmwv624CoHNQ0oRYUBgk0WdD0ErNOEzt/FrjK/yDBa4Y75ckr492f6a24FLFe9orG09h1eh5lT0FRNN3BxMUbhsZXSgN2Se28WoIcILKzAH6LjX3VArS7NSraNt8rDQRrVkZ8qkfhwd+/OPScgVuNs25O/KdF/yswTLzM/k/IQndyr90UNti5yJlXTdydA3FTI2w6kGQlL5tPGCqPLfFy8a9vVdpQH8uycbvp2J4PNjcC9It99C9YcZeNtX9MgOhdM73tB0xHuGZcj2dGkxgeL8OKM+tJhVLS4FjxkA== X-YMail-OSG: cI7xli0VM1liIcdv9QILAq_ayt9hBVP_xatOp3mi_yt9t_imGXfryz_oKHbrJF0 A8pCxVNNCSrN9WlcffNIK8nnqevSoc15QJ_9bbe3mWGJXMzB5EW1ye_iaXjKepr6t7dbvO.yGd7z dMKEpOPpP6LeMjjqQfKtzH5EYWuFZhovsD2nnToPFfwDP5toXnBX0WeKjcM7nN3ssU4JU9wTqxPB EfITzHImBlZ_7iAafU4pMpGOVvzEf6PK4Y_g4R.52XT.WiPKSDURqRK37yeC_AljrEKFDsxw3k0K y6t1tTRlIZJajMDnuJBKVHOTCZZbG5CADYzT9tM.SDuYUS6yQzfA1R2EV3b_Tct4q_EijRpKcC.Z jsaRz1JRLHXK7QTdLfzCKWy7ZRgTA4D1Gi2vwKWRvQgks8.i9kKTA8OlXNIZ_lhVrMbiCqO4lkyB VHSAYgxeX_AFJbtyf6fp7mnOzoLpUBvJ9rpiNZmaO8cSpbwrcTvZpsrE6Zv17TXC2AoKiBMSwQ8g fi1ZcMYW1OmteSFFBKzxedC7sqsCpdrUW0AiAakgCzJsCHBuVtaYrSopU8gnjxB743Vt257i2.E6 HB5qRsBud4xSc_KrxMwpQ8vbmql0ol7ALPHF4aWUzoZ.z2HwumYCMfmyG7ymBTvxuox5GheldIm_ JlzN.36Y0A8rA3ewl0HTfcX9W1PsqP63Msocsbz9qOJL63Y2XXSCTC.zIK.Iv1lY7vagXxRcaLn4 0XoKQaZ4btJWKxnVM4dSqR8jlXbFw5N_Av0DMjiddpz0SJI2p7Z8mn23zS3NkfIuiFW7Z9KRcPtF f4mtgPhutzOWhg37G1pxysJxcXjbmk6kn1VuhFtvi5BBNktiUBjZQpT3qB0EHqywWv1LVcczu7W9 E5KprFEZsWz.dcZeGx2dz8LhYquQL4frDrhSNWGciUC_pchcylfxP_CxnoeiLvwIjEqj7EjcTf3u NAQPn4oIv1Hbda7UlYqZpkrr81kPHouv1KDPXOSqnVlSLFxZiP_jaNHkEXo0q7BhnyfahIRabEP4 9jXtCq53nziADtHpJLpixoozoNMFe0ymQGFSACzLHKbX7DGJVGQ5YgocaWmtG3sARmN1rK6sdqc7 fBdnNMsDGnWLQBv.hINkP4tTI9u.tFVY92KgSTrgNkjNS3GAs2q1nw2R69wj42XJ.M7e1lb3iJ9e DxBUB7azGeX4PmqhK5jcu7EMaCcnBTjU8tXhdG.XQ3gA5klF1FP4PeFnTYSj6FRGMKXjxpHZsQfp S4q87QKyoaBxN5zUfW6I2ji_xco2YSOP968D28RBfD8ZEkd7TFR2KPkq8YCg71sjqqXqfrFdstO1 tmu27QJLkAUraZNr5B1bY2AkdR_HxdGJabJGyKCwJorYdQNOFHkvB.tiCeNsXjoHaAkInjTuLDhQ 6X99YHv4kZBvptRIa1xSX9vPKsY.RY716pyyWRSWFBk3jx8q9Fcf4kGvGNwrDyxOWuz80LHkc.W8 CcFQltL4f3x8GCr5U9XqYumkw03D4APL4vsMufDVin7bauRzBR5XKesu4IM4vHqcsf_WeFajSPTq _rYtE.TYoTot_pOg9UBDoo6pVbC7CZxDe3eOy4v9fFotEBmxmki6plh1v.wXeQVY3fiv.VbwCfCI DKHeje1SzjF6C6h5v6_DX5.toY5m72b74fHlXQ3R63jswhUh9Hvftuaji4csrTRFXZ.7eqUHuDmw BjOLxwMe876fvznH29IrTbiO1JoKFPCFQrO_49DGj58oHCGXy2CczI4Icr5slqn0SwYaCNBc4RTq 8rYxYbPG2lgOr23vJaD3KbNv2FMemMpSmTIvt6YGVKEt1WBNAjI89G68UChS0uWXsEd99uSy1twG 2.sR4Gt2oeY4D7a3nL2sEURTslU20wUN2g_ShsNTI668I.ngYGqgWLvh1Too5YhLiN51OJgQlCkg hEClX31yBkN5LRyRmC9JfTWNTff.HkU3AVhXKk86Aitg6yTmsPdn7bDlWrpsSF9UR12buiUuh3y7 1cHNUDwm_h9WSMFqK3X2N7ZKzJFahXThWf9N4tDzC98DkCLHsH484PwaK5Uzx_an0KvCZVbBCM3I 6tgi2j2p1ZniRqdRVKV0ZqzQim1lvb_qQiaxOu0QDU2kG3izUksBChAUuMRuWrF42kyRzaMBVnR0 94AzCqios7dTVBWN8oL3qwl4tefzjmUhLbXNvXj2rO.cS4Mz0z3..cADJaz_y9QS9FJk8xvGfQFg lVSgfQAuscMe2RYftHEnDkNHmIbU- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic304.consmr.mail.ne1.yahoo.com with HTTP; Fri, 4 Mar 2022 19:14:08 +0000 Received: by kubenode527.mail-prod1.omega.gq1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID 6349d18b7d068fc7f89c0919771ca5a0; Fri, 04 Mar 2022 19:14:06 +0000 (UTC) Message-ID: <273f4a9c-f96a-e051-5f5e-82310a15e234@schaufler-ca.com> Date: Fri, 4 Mar 2022 11:14:05 -0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Thunderbird/91.6.1 Subject: Re: [PATCH v32 03/28] LSM: Add the lsmblob data structure. Content-Language: en-US To: =?UTF-8?Q?Micka=c3=abl_Sala=c3=bcn?= , casey.schaufler@intel.com, jmorris@namei.org, linux-security-module@vger.kernel.org, selinux@vger.kernel.org Cc: linux-audit@redhat.com, keescook@chromium.org, john.johansen@canonical.com, penguin-kernel@i-love.sakura.ne.jp, paul@paul-moore.com, sds@tycho.nsa.gov, linux-kernel@vger.kernel.org, Casey Schaufler References: <20220202235323.23929-1-casey@schaufler-ca.com> <20220202235323.23929-4-casey@schaufler-ca.com> From: Casey Schaufler In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Mailer: WebService/1.1.19797 mail.backend.jedi.jws.acl:role.jedi.acl.token.atz.jws.hermes.yahoo Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 3/4/2022 2:48 AM, Mickaël Salaün wrote: > > On 03/02/2022 00:52, Casey Schaufler wrote: >> When more than one security module is exporting data to >> audit and networking sub-systems a single 32 bit integer >> is no longer sufficient to represent the data. Add a >> structure to be used instead. >> >> The lsmblob structure is currently an array of >> u32 "secids". There is an entry for each of the >> security modules built into the system that would >> use secids if active. The system assigns the module >> a "slot" when it registers hooks. If modules are >> compiled in but not registered there will be unused >> slots. >> >> A new lsm_id structure, which contains the name >> of the LSM and its slot number, is created. There >> is an instance for each LSM, which assigns the name >> and passes it to the infrastructure to set the slot. >> >> The audit rules data is expanded to use an array of >> security module data rather than a single instance. >> A new structure audit_lsm_rules is defined to avoid the >> confusion which commonly accompanies the use of >> void ** parameters. >> >> Signed-off-by: Casey Schaufler > > Reviewed-by: Mickaël Salaün > > > Minor fixes: Thank you. I will incorporate these changes. > > >> --- >>   include/linux/audit.h        | 10 ++++- >>   include/linux/lsm_hooks.h    | 12 +++++- >>   include/linux/security.h     | 74 +++++++++++++++++++++++++++++--- >>   kernel/auditfilter.c         | 23 +++++----- >>   kernel/auditsc.c             | 17 +++----- >>   security/apparmor/lsm.c      |  7 ++- >>   security/bpf/hooks.c         | 12 +++++- >>   security/commoncap.c         |  7 ++- >>   security/landlock/cred.c     |  2 +- >>   security/landlock/fs.c       |  2 +- >>   security/landlock/ptrace.c   |  2 +- >>   security/landlock/setup.c    |  5 +++ >>   security/landlock/setup.h    |  1 + >>   security/loadpin/loadpin.c   |  8 +++- >>   security/lockdown/lockdown.c |  7 ++- >>   security/safesetid/lsm.c     |  8 +++- >>   security/security.c          | 82 ++++++++++++++++++++++++++++++------ >>   security/selinux/hooks.c     |  8 +++- >>   security/smack/smack_lsm.c   |  7 ++- >>   security/tomoyo/tomoyo.c     |  8 +++- >>   security/yama/yama_lsm.c     |  7 ++- >>   21 files changed, 253 insertions(+), 56 deletions(-) >> >> diff --git a/include/linux/audit.h b/include/linux/audit.h >> index d06134ac6245..14849d5f84b4 100644 >> --- a/include/linux/audit.h >> +++ b/include/linux/audit.h >> @@ -11,6 +11,7 @@ >>     #include >>   #include >> +#include >>   #include >>   #include >>   #include >> @@ -59,6 +60,10 @@ struct audit_krule { >>   /* Flag to indicate legacy AUDIT_LOGINUID unset usage */ >>   #define AUDIT_LOGINUID_LEGACY        0x1 >>   +struct audit_lsm_rules { >> +    void    *rule[LSMBLOB_ENTRIES]; >> +}; >> + >>   struct audit_field { >>       u32                type; >>       union { >> @@ -66,8 +71,9 @@ struct audit_field { >>           kuid_t            uid; >>           kgid_t            gid; >>           struct { >> -            char        *lsm_str; >> -            void        *lsm_rule; >> +            bool            lsm_isset; >> +            char            *lsm_str; >> +            struct audit_lsm_rules    lsm_rules; >>           }; >>       }; >>       u32                op; >> diff --git a/include/linux/lsm_hooks.h b/include/linux/lsm_hooks.h >> index 129d99c6f9ed..2c2d0ef59a41 100644 >> --- a/include/linux/lsm_hooks.h >> +++ b/include/linux/lsm_hooks.h >> @@ -1582,6 +1582,14 @@ struct security_hook_heads { >>       #undef LSM_HOOK >>   } __randomize_layout; >>   +/* >> + * Information that identifies a security module. >> + */ >> +struct lsm_id { >> +    const char    *lsm;    /* Name of the LSM */ >> +    int        slot;    /* Slot in lsmblob if one is allocated */ >> +}; >> + >>   /* >>    * Security module hook list structure. >>    * For use with generic list macros for common operations. >> @@ -1590,7 +1598,7 @@ struct security_hook_list { >>       struct hlist_node        list; >>       struct hlist_head        *head; >>       union security_list_options    hook; >> -    char                *lsm; >> +    struct lsm_id            *lsmid; >>   } __randomize_layout; >>     /* >> @@ -1626,7 +1634,7 @@ extern struct security_hook_heads security_hook_heads; >>   extern char *lsm_names; >>     extern void security_add_hooks(struct security_hook_list *hooks, int count, >> -                char *lsm); >> +                   struct lsm_id *lsmid); >>     #define LSM_FLAG_LEGACY_MAJOR    BIT(0) >>   #define LSM_FLAG_EXCLUSIVE    BIT(1) >> diff --git a/include/linux/security.h b/include/linux/security.h >> index 33e0f2e659df..1a7e5bf36a82 100644 >> --- a/include/linux/security.h >> +++ b/include/linux/security.h >> @@ -39,6 +39,7 @@ struct kernel_siginfo; >>   struct sembuf; >>   struct kern_ipc_perm; >>   struct audit_context; >> +struct audit_lsm_rules; >>   struct super_block; >>   struct inode; >>   struct dentry; >> @@ -134,6 +135,65 @@ enum lockdown_reason { >>     extern const char *const lockdown_reasons[LOCKDOWN_CONFIDENTIALITY_MAX+1]; >>   +/* >> + * Data exported by the security modules >> + * >> + * Any LSM that provides secid or secctx based hooks must be included. >> + */ >> +#define LSMBLOB_ENTRIES ( \ >> +    (IS_ENABLED(CONFIG_SECURITY_SELINUX) ? 1 : 0) + \ >> +    (IS_ENABLED(CONFIG_SECURITY_SMACK) ? 1 : 0) + \ >> +    (IS_ENABLED(CONFIG_SECURITY_APPARMOR) ? 1 : 0) + \ >> +    (IS_ENABLED(CONFIG_BPF_LSM) ? 1 : 0)) >> + >> +struct lsmblob { >> +    u32     secid[LSMBLOB_ENTRIES]; >> +}; >> + >> +#define LSMBLOB_INVALID        -1    /* Not a valid LSM slot number */ >> +#define LSMBLOB_NEEDED        -2    /* Slot requested on initialization */ >> +#define LSMBLOB_NOT_NEEDED    -3    /* Slot not requested */ >> + >> +/** >> + * lsmblob_init - initialize an lsmblob structure >> + * @blob: Pointer to the data to initialize >> + * @secid: The initial secid value >> + * >> + * Set all secid for all modules to the specified value. >> + */ >> +static inline void lsmblob_init(struct lsmblob *blob, u32 secid) >> +{ >> +    int i; >> + >> +    for (i = 0; i < LSMBLOB_ENTRIES; i++) >> +        blob->secid[i] = secid; >> +} >> + >> +/** >> + * lsmblob_is_set - report if there is an value in the lsmblob > > *a* value > > >> + * @blob: Pointer to the exported LSM data >> + * >> + * Returns true if there is a secid set, false otherwise >> + */ >> +static inline bool lsmblob_is_set(struct lsmblob *blob) >> +{ >> +    struct lsmblob empty = {}; > > const struct lsmblob empty = {}; > >> + >> +    return !!memcmp(blob, &empty, sizeof(*blob)); >> +} >> + >> +/** >> + * lsmblob_equal - report if the two lsmblob's are equal >> + * @bloba: Pointer to one LSM data >> + * @blobb: Pointer to the other LSM data >> + * >> + * Returns true if all entries in the two are equal, false otherwise >> + */ >> +static inline bool lsmblob_equal(struct lsmblob *bloba, struct lsmblob *blobb) > > const struct lsmblob *bloba, const struct lsmblob *blobb > > >> +{ >> +    return !memcmp(bloba, blobb, sizeof(*bloba)); >> +} >> + >>   /* These functions are in security/commoncap.c */ >>   extern int cap_capable(const struct cred *cred, struct user_namespace *ns, >>                  int cap, unsigned int opts); >> @@ -1879,15 +1939,17 @@ static inline int security_key_getsecurity(struct key *key, char **_buffer) >>     #ifdef CONFIG_AUDIT >>   #ifdef CONFIG_SECURITY >> -int security_audit_rule_init(u32 field, u32 op, char *rulestr, void **lsmrule); >> +int security_audit_rule_init(u32 field, u32 op, char *rulestr, >> +                 struct audit_lsm_rules *lsmrules); >>   int security_audit_rule_known(struct audit_krule *krule); >> -int security_audit_rule_match(u32 secid, u32 field, u32 op, void *lsmrule); >> -void security_audit_rule_free(void *lsmrule); >> +int security_audit_rule_match(u32 secid, u32 field, u32 op, >> +                  struct audit_lsm_rules *lsmrules); >> +void security_audit_rule_free(struct audit_lsm_rules *lsmrules); >>     #else >>     static inline int security_audit_rule_init(u32 field, u32 op, char *rulestr, >> -                       void **lsmrule) >> +                       struct audit_lsm_rules *lsmrules) >>   { >>       return 0; >>   } >> @@ -1898,12 +1960,12 @@ static inline int security_audit_rule_known(struct audit_krule *krule) >>   } >>     static inline int security_audit_rule_match(u32 secid, u32 field, u32 op, >> -                        void *lsmrule) >> +                        struct audit_lsm_rules *lsmrules) >>   { >>       return 0; >>   } >>   -static inline void security_audit_rule_free(void *lsmrule) >> +static inline void security_audit_rule_free(struct audit_lsm_rules *lsmrules) >>   { } >>     #endif /* CONFIG_SECURITY */ >> diff --git a/kernel/auditfilter.c b/kernel/auditfilter.c >> index 42d99896e7a6..de75bd6ad866 100644 >> --- a/kernel/auditfilter.c >> +++ b/kernel/auditfilter.c >> @@ -76,7 +76,7 @@ static void audit_free_lsm_field(struct audit_field *f) >>       case AUDIT_OBJ_LEV_LOW: >>       case AUDIT_OBJ_LEV_HIGH: >>           kfree(f->lsm_str); >> -        security_audit_rule_free(f->lsm_rule); >> +        security_audit_rule_free(&f->lsm_rules); >>       } >>   } >>   @@ -529,7 +529,7 @@ static struct audit_entry *audit_data_to_entry(struct audit_rule_data *data, >>               entry->rule.buflen += f_val; >>               f->lsm_str = str; >>               err = security_audit_rule_init(f->type, f->op, str, >> -                               (void **)&f->lsm_rule); >> +                               &f->lsm_rules); >>               /* Keep currently invalid fields around in case they >>                * become valid after a policy reload. */ >>               if (err == -EINVAL) { >> @@ -782,7 +782,7 @@ static int audit_compare_rule(struct audit_krule *a, struct audit_krule *b) >>       return 0; >>   } >>   -/* Duplicate LSM field information.  The lsm_rule is opaque, so must be >> +/* Duplicate LSM field information.  The lsm_rules is opaque, so must be >>    * re-initialized. */ >>   static inline int audit_dupe_lsm_field(struct audit_field *df, >>                          struct audit_field *sf) >> @@ -796,9 +796,9 @@ static inline int audit_dupe_lsm_field(struct audit_field *df, >>           return -ENOMEM; >>       df->lsm_str = lsm_str; >>   -    /* our own (refreshed) copy of lsm_rule */ >> +    /* our own (refreshed) copy of lsm_rules */ >>       ret = security_audit_rule_init(df->type, df->op, df->lsm_str, >> -                       (void **)&df->lsm_rule); >> +                       &df->lsm_rules); >>       /* Keep currently invalid fields around in case they >>        * become valid after a policy reload. */ >>       if (ret == -EINVAL) { >> @@ -850,7 +850,7 @@ struct audit_entry *audit_dupe_rule(struct audit_krule *old) >>       new->tree = old->tree; >>       memcpy(new->fields, old->fields, sizeof(struct audit_field) * fcount); >>   -    /* deep copy this information, updating the lsm_rule fields, because >> +    /* deep copy this information, updating the lsm_rules fields, because >>        * the originals will all be freed when the old rule is freed. */ >>       for (i = 0; i < fcount; i++) { >>           switch (new->fields[i].type) { >> @@ -1367,10 +1367,11 @@ int audit_filter(int msgtype, unsigned int listtype) >>               case AUDIT_SUBJ_TYPE: >>               case AUDIT_SUBJ_SEN: >>               case AUDIT_SUBJ_CLR: >> -                if (f->lsm_rule) { >> +                if (f->lsm_str) { >>                       security_current_getsecid_subj(&sid); >>                       result = security_audit_rule_match(sid, >> -                           f->type, f->op, f->lsm_rule); >> +                           f->type, f->op, >> +                           &f->lsm_rules); >>                   } >>                   break; >>               case AUDIT_EXE: >> @@ -1397,7 +1398,7 @@ int audit_filter(int msgtype, unsigned int listtype) >>       return ret; >>   } >>   -static int update_lsm_rule(struct audit_krule *r) >> +static int update_lsm_rules(struct audit_krule *r) >>   { >>       struct audit_entry *entry = container_of(r, struct audit_entry, rule); >>       struct audit_entry *nentry; >> @@ -1429,7 +1430,7 @@ static int update_lsm_rule(struct audit_krule *r) >>       return err; >>   } >>   -/* This function will re-initialize the lsm_rule field of all applicable rules. >> +/* This function will re-initialize the lsm_rules field of all applicable rules. >>    * It will traverse the filter lists serarching for rules that contain LSM >>    * specific filter fields.  When such a rule is found, it is copied, the >>    * LSM field is re-initialized, and the old rule is replaced with the >> @@ -1444,7 +1445,7 @@ int audit_update_lsm_rules(void) >>         for (i = 0; i < AUDIT_NR_FILTERS; i++) { >>           list_for_each_entry_safe(r, n, &audit_rules_list[i], list) { >> -            int res = update_lsm_rule(r); >> +            int res = update_lsm_rules(r); >>               if (!err) >>                   err = res; >>           } >> diff --git a/kernel/auditsc.c b/kernel/auditsc.c >> index fce5d43a933f..f1c26a322f9d 100644 >> --- a/kernel/auditsc.c >> +++ b/kernel/auditsc.c >> @@ -664,7 +664,7 @@ static int audit_filter_rules(struct task_struct *tsk, >>                  match for now to avoid losing information that >>                  may be wanted.   An error message will also be >>                  logged upon error */ >> -            if (f->lsm_rule) { >> +            if (f->lsm_str) { >>                   if (need_sid) { >>                       /* @tsk should always be equal to >>                        * @current with the exception of >> @@ -679,8 +679,7 @@ static int audit_filter_rules(struct task_struct *tsk, >>                       need_sid = 0; >>                   } >>                   result = security_audit_rule_match(sid, f->type, >> -                                   f->op, >> -                                   f->lsm_rule); >> +                            f->op, &f->lsm_rules); >>               } >>               break; >>           case AUDIT_OBJ_USER: >> @@ -690,21 +689,19 @@ static int audit_filter_rules(struct task_struct *tsk, >>           case AUDIT_OBJ_LEV_HIGH: >>               /* The above note for AUDIT_SUBJ_USER...AUDIT_SUBJ_CLR >>                  also applies here */ >> -            if (f->lsm_rule) { >> +            if (f->lsm_str) { >>                   /* Find files that match */ >>                   if (name) { >>                       result = security_audit_rule_match( >>                                   name->osid, >>                                   f->type, >>                                   f->op, >> -                                f->lsm_rule); >> +                                &f->lsm_rules); >>                   } else if (ctx) { >>                       list_for_each_entry(n, &ctx->names_list, list) { >>                           if (security_audit_rule_match( >> -                                n->osid, >> -                                f->type, >> -                                f->op, >> -                                f->lsm_rule)) { >> +                            n->osid, f->type, f->op, >> +                            &f->lsm_rules)) { >>                               ++result; >>                               break; >>                           } >> @@ -715,7 +712,7 @@ static int audit_filter_rules(struct task_struct *tsk, >>                       break; >>                   if (security_audit_rule_match(ctx->ipc.osid, >>                                     f->type, f->op, >> -                                  f->lsm_rule)) >> +                                  &f->lsm_rules)) >>                       ++result; >>               } >>               break; >> diff --git a/security/apparmor/lsm.c b/security/apparmor/lsm.c >> index be8976c407f4..1e53fea61335 100644 >> --- a/security/apparmor/lsm.c >> +++ b/security/apparmor/lsm.c >> @@ -1168,6 +1168,11 @@ struct lsm_blob_sizes apparmor_blob_sizes __lsm_ro_after_init = { >>       .lbs_sock = sizeof(struct aa_sk_ctx), >>   }; >>   +static struct lsm_id apparmor_lsmid __lsm_ro_after_init = { >> +    .lsm  = "apparmor", >> +    .slot = LSMBLOB_NEEDED >> +}; >> + >>   static struct security_hook_list apparmor_hooks[] __lsm_ro_after_init = { >>       LSM_HOOK_INIT(ptrace_access_check, apparmor_ptrace_access_check), >>       LSM_HOOK_INIT(ptrace_traceme, apparmor_ptrace_traceme), >> @@ -1853,7 +1858,7 @@ static int __init apparmor_init(void) >>           goto buffers_out; >>       } >>       security_add_hooks(apparmor_hooks, ARRAY_SIZE(apparmor_hooks), >> -                "apparmor"); >> +                &apparmor_lsmid); >>         /* Report that AppArmor successfully initialized */ >>       apparmor_initialized = 1; >> diff --git a/security/bpf/hooks.c b/security/bpf/hooks.c >> index e5971fa74fd7..7a58fe9ab8c4 100644 >> --- a/security/bpf/hooks.c >> +++ b/security/bpf/hooks.c >> @@ -15,9 +15,19 @@ static struct security_hook_list bpf_lsm_hooks[] __lsm_ro_after_init = { >>       LSM_HOOK_INIT(task_free, bpf_task_storage_free), >>   }; >>   +/* >> + * slot has to be LSMBLOB_NEEDED because some of the hooks >> + * supplied by this module require a slot. >> + */ >> +struct lsm_id bpf_lsmid __lsm_ro_after_init = { >> +    .lsm = "bpf", >> +    .slot = LSMBLOB_NEEDED >> +}; >> + >>   static int __init bpf_lsm_init(void) >>   { >> -    security_add_hooks(bpf_lsm_hooks, ARRAY_SIZE(bpf_lsm_hooks), "bpf"); >> +    security_add_hooks(bpf_lsm_hooks, ARRAY_SIZE(bpf_lsm_hooks), >> +               &bpf_lsmid); >>       pr_info("LSM support for eBPF active\n"); >>       return 0; >>   } >> diff --git a/security/commoncap.c b/security/commoncap.c >> index 5fc8986c3c77..c94ec46e07ac 100644 >> --- a/security/commoncap.c >> +++ b/security/commoncap.c >> @@ -1446,6 +1446,11 @@ int cap_mmap_file(struct file *file, unsigned long reqprot, >>     #ifdef CONFIG_SECURITY >>   +static struct lsm_id capability_lsmid __lsm_ro_after_init = { >> +    .lsm  = "capability", >> +    .slot = LSMBLOB_NOT_NEEDED >> +}; >> + >>   static struct security_hook_list capability_hooks[] __lsm_ro_after_init = { >>       LSM_HOOK_INIT(capable, cap_capable), >>       LSM_HOOK_INIT(settime, cap_settime), >> @@ -1470,7 +1475,7 @@ static struct security_hook_list capability_hooks[] __lsm_ro_after_init = { >>   static int __init capability_init(void) >>   { >>       security_add_hooks(capability_hooks, ARRAY_SIZE(capability_hooks), >> -                "capability"); >> +               &capability_lsmid); >>       return 0; >>   } >>   diff --git a/security/landlock/cred.c b/security/landlock/cred.c >> index 6725af24c684..56b121d65436 100644 >> --- a/security/landlock/cred.c >> +++ b/security/landlock/cred.c >> @@ -42,5 +42,5 @@ static struct security_hook_list landlock_hooks[] __lsm_ro_after_init = { >>   __init void landlock_add_cred_hooks(void) >>   { >>       security_add_hooks(landlock_hooks, ARRAY_SIZE(landlock_hooks), >> -            LANDLOCK_NAME); >> +            &landlock_lsmid); >>   } >> diff --git a/security/landlock/fs.c b/security/landlock/fs.c >> index 97b8e421f617..319e90e9290c 100644 >> --- a/security/landlock/fs.c >> +++ b/security/landlock/fs.c >> @@ -688,5 +688,5 @@ static struct security_hook_list landlock_hooks[] __lsm_ro_after_init = { >>   __init void landlock_add_fs_hooks(void) >>   { >>       security_add_hooks(landlock_hooks, ARRAY_SIZE(landlock_hooks), >> -            LANDLOCK_NAME); >> +            &landlock_lsmid); >>   } >> diff --git a/security/landlock/ptrace.c b/security/landlock/ptrace.c >> index f55b82446de2..54ccf55a077a 100644 >> --- a/security/landlock/ptrace.c >> +++ b/security/landlock/ptrace.c >> @@ -116,5 +116,5 @@ static struct security_hook_list landlock_hooks[] __lsm_ro_after_init = { >>   __init void landlock_add_ptrace_hooks(void) >>   { >>       security_add_hooks(landlock_hooks, ARRAY_SIZE(landlock_hooks), >> -            LANDLOCK_NAME); >> +            &landlock_lsmid); >>   } >> diff --git a/security/landlock/setup.c b/security/landlock/setup.c >> index f8e8e980454c..759e00b9436c 100644 >> --- a/security/landlock/setup.c >> +++ b/security/landlock/setup.c >> @@ -23,6 +23,11 @@ struct lsm_blob_sizes landlock_blob_sizes __lsm_ro_after_init = { >>       .lbs_superblock = sizeof(struct landlock_superblock_security), >>   }; >>   +struct lsm_id landlock_lsmid __lsm_ro_after_init = { >> +    .lsm = LANDLOCK_NAME, >> +    .slot = LSMBLOB_NOT_NEEDED, >> +}; >> + >>   static int __init landlock_init(void) >>   { >>       landlock_add_cred_hooks(); >> diff --git a/security/landlock/setup.h b/security/landlock/setup.h >> index 1daffab1ab4b..38bce5b172dc 100644 >> --- a/security/landlock/setup.h >> +++ b/security/landlock/setup.h >> @@ -14,5 +14,6 @@ >>   extern bool landlock_initialized; >>     extern struct lsm_blob_sizes landlock_blob_sizes; >> +extern struct lsm_id landlock_lsmid; >>     #endif /* _SECURITY_LANDLOCK_SETUP_H */ >> diff --git a/security/loadpin/loadpin.c b/security/loadpin/loadpin.c >> index b12f7d986b1e..b569f3bc170b 100644 >> --- a/security/loadpin/loadpin.c >> +++ b/security/loadpin/loadpin.c >> @@ -192,6 +192,11 @@ static int loadpin_load_data(enum kernel_load_data_id id, bool contents) >>       return loadpin_read_file(NULL, (enum kernel_read_file_id) id, contents); >>   } >>   +static struct lsm_id loadpin_lsmid __lsm_ro_after_init = { >> +    .lsm  = "loadpin", >> +    .slot = LSMBLOB_NOT_NEEDED >> +}; >> + >>   static struct security_hook_list loadpin_hooks[] __lsm_ro_after_init = { >>       LSM_HOOK_INIT(sb_free_security, loadpin_sb_free_security), >>       LSM_HOOK_INIT(kernel_read_file, loadpin_read_file), >> @@ -239,7 +244,8 @@ static int __init loadpin_init(void) >>       pr_info("ready to pin (currently %senforcing)\n", >>           enforce ? "" : "not "); >>       parse_exclude(); >> -    security_add_hooks(loadpin_hooks, ARRAY_SIZE(loadpin_hooks), "loadpin"); >> +    security_add_hooks(loadpin_hooks, ARRAY_SIZE(loadpin_hooks), >> +               &loadpin_lsmid); >>       return 0; >>   } >>   diff --git a/security/lockdown/lockdown.c b/security/lockdown/lockdown.c >> index 87cbdc64d272..4e24ea3f7b7e 100644 >> --- a/security/lockdown/lockdown.c >> +++ b/security/lockdown/lockdown.c >> @@ -75,6 +75,11 @@ static struct security_hook_list lockdown_hooks[] __lsm_ro_after_init = { >>       LSM_HOOK_INIT(locked_down, lockdown_is_locked_down), >>   }; >>   +static struct lsm_id lockdown_lsmid __lsm_ro_after_init = { >> +    .lsm = "lockdown", >> +    .slot = LSMBLOB_NOT_NEEDED >> +}; >> + >>   static int __init lockdown_lsm_init(void) >>   { >>   #if defined(CONFIG_LOCK_DOWN_KERNEL_FORCE_INTEGRITY) >> @@ -83,7 +88,7 @@ static int __init lockdown_lsm_init(void) >>       lock_kernel_down("Kernel configuration", LOCKDOWN_CONFIDENTIALITY_MAX); >>   #endif >>       security_add_hooks(lockdown_hooks, ARRAY_SIZE(lockdown_hooks), >> -               "lockdown"); >> +               &lockdown_lsmid); >>       return 0; >>   } >>   diff --git a/security/safesetid/lsm.c b/security/safesetid/lsm.c >> index 963f4ad9cb66..0c368950dc14 100644 >> --- a/security/safesetid/lsm.c >> +++ b/security/safesetid/lsm.c >> @@ -241,6 +241,11 @@ static int safesetid_task_fix_setgid(struct cred *new, >>       return -EACCES; >>   } >>   +static struct lsm_id safesetid_lsmid __lsm_ro_after_init = { >> +    .lsm  = "safesetid", >> +    .slot = LSMBLOB_NOT_NEEDED >> +}; >> + >>   static struct security_hook_list safesetid_security_hooks[] = { >>       LSM_HOOK_INIT(task_fix_setuid, safesetid_task_fix_setuid), >>       LSM_HOOK_INIT(task_fix_setgid, safesetid_task_fix_setgid), >> @@ -250,7 +255,8 @@ static struct security_hook_list safesetid_security_hooks[] = { >>   static int __init safesetid_security_init(void) >>   { >>       security_add_hooks(safesetid_security_hooks, >> -               ARRAY_SIZE(safesetid_security_hooks), "safesetid"); >> +               ARRAY_SIZE(safesetid_security_hooks), >> +               &safesetid_lsmid); >>         /* Report that SafeSetID successfully initialized */ >>       safesetid_initialized = 1; >> diff --git a/security/security.c b/security/security.c >> index f2d4b20613c8..2bf21c726ba0 100644 >> --- a/security/security.c >> +++ b/security/security.c >> @@ -345,6 +345,7 @@ static void __init ordered_lsm_init(void) >>       init_debug("sock blob size       = %d\n", blob_sizes.lbs_sock); >>       init_debug("superblock blob size = %d\n", blob_sizes.lbs_superblock); >>       init_debug("task blob size       = %d\n", blob_sizes.lbs_task); >> +    init_debug("lsmblob size         = %zu\n", sizeof(struct lsmblob)); >>         /* >>        * Create any kmem_caches needed for blobs >> @@ -472,21 +473,38 @@ static int lsm_append(const char *new, char **result) >>       return 0; >>   } >>   +/* >> + * Current index to use while initializing the lsmblob secid list. >> + */ >> +static int lsm_slot __lsm_ro_after_init; >> + >>   /** >>    * security_add_hooks - Add a modules hooks to the hook lists. >>    * @hooks: the hooks to add >>    * @count: the number of hooks to add >> - * @lsm: the name of the security module >> + * @lsmid: the identification information for the security module >>    * >>    * Each LSM has to register its hooks with the infrastructure. >> + * If the LSM is using hooks that export secids allocate a slot >> + * for it in the lsmblob. >>    */ >>   void __init security_add_hooks(struct security_hook_list *hooks, int count, >> -                char *lsm) >> +                   struct lsm_id *lsmid) >>   { >>       int i; >>   +    WARN_ON(!lsmid->slot || !lsmid->lsm); >> + >> +    if (lsmid->slot == LSMBLOB_NEEDED) { >> +        if (lsm_slot >= LSMBLOB_ENTRIES) >> +            panic("%s Too many LSMs registered.\n", __func__); >> +        lsmid->slot = lsm_slot++; >> +        init_debug("%s assigned lsmblob slot %d\n", lsmid->lsm, >> +               lsmid->slot); >> +    } >> + >>       for (i = 0; i < count; i++) { >> -        hooks[i].lsm = lsm; >> +        hooks[i].lsmid = lsmid; >>           hlist_add_tail_rcu(&hooks[i].list, hooks[i].head); >>       } >>   @@ -495,7 +513,7 @@ void __init security_add_hooks(struct security_hook_list *hooks, int count, >>        * and fix this up afterwards. >>        */ >>       if (slab_is_available()) { >> -        if (lsm_append(lsm, &lsm_names) < 0) >> +        if (lsm_append(lsmid->lsm, &lsm_names) < 0) >>               panic("%s - Cannot get early memory.\n", __func__); >>       } >>   } >> @@ -2075,7 +2093,7 @@ int security_getprocattr(struct task_struct *p, const char *lsm, char *name, >>       struct security_hook_list *hp; >>         hlist_for_each_entry(hp, &security_hook_heads.getprocattr, list) { >> -        if (lsm != NULL && strcmp(lsm, hp->lsm)) >> +        if (lsm != NULL && strcmp(lsm, hp->lsmid->lsm)) >>               continue; >>           return hp->hook.getprocattr(p, name, value); >>       } >> @@ -2088,7 +2106,7 @@ int security_setprocattr(const char *lsm, const char *name, void *value, >>       struct security_hook_list *hp; >>         hlist_for_each_entry(hp, &security_hook_heads.setprocattr, list) { >> -        if (lsm != NULL && strcmp(lsm, hp->lsm)) >> +        if (lsm != NULL && strcmp(lsm, hp->lsmid->lsm)) >>               continue; >>           return hp->hook.setprocattr(name, value, size); >>       } >> @@ -2579,9 +2597,27 @@ int security_key_getsecurity(struct key *key, char **_buffer) >>     #ifdef CONFIG_AUDIT >>   -int security_audit_rule_init(u32 field, u32 op, char *rulestr, void **lsmrule) >> +int security_audit_rule_init(u32 field, u32 op, char *rulestr, >> +                 struct audit_lsm_rules *lsmrules) >>   { >> -    return call_int_hook(audit_rule_init, 0, field, op, rulestr, lsmrule); >> +    struct security_hook_list *hp; >> +    bool one_is_good = false; >> +    int rc = 0; >> +    int trc; >> + >> +    hlist_for_each_entry(hp, &security_hook_heads.audit_rule_init, list) { >> +        if (WARN_ON(hp->lsmid->slot < 0 || hp->lsmid->slot >= lsm_slot)) >> +            continue; >> +        trc = hp->hook.audit_rule_init(field, op, rulestr, >> + &lsmrules->rule[hp->lsmid->slot]); >> +        if (trc == 0) >> +            one_is_good = true; >> +        else >> +            rc = trc; >> +    } >> +    if (one_is_good) >> +        return 0; >> +    return rc; >>   } >>     int security_audit_rule_known(struct audit_krule *krule) >> @@ -2589,14 +2625,36 @@ int security_audit_rule_known(struct audit_krule *krule) >>       return call_int_hook(audit_rule_known, 0, krule); >>   } >>   -void security_audit_rule_free(void *lsmrule) >> +void security_audit_rule_free(struct audit_lsm_rules *lsmrules) >>   { >> -    call_void_hook(audit_rule_free, lsmrule); >> +    struct security_hook_list *hp; >> + >> +    hlist_for_each_entry(hp, &security_hook_heads.audit_rule_free, list) { >> +        if (WARN_ON(hp->lsmid->slot < 0 || hp->lsmid->slot >= lsm_slot)) >> +            continue; >> +        if (lsmrules->rule[hp->lsmid->slot] == NULL) >> +            continue; >> + hp->hook.audit_rule_free(lsmrules->rule[hp->lsmid->slot]); >> +    } >>   } >>   -int security_audit_rule_match(u32 secid, u32 field, u32 op, void *lsmrule) >> +int security_audit_rule_match(u32 secid, u32 field, u32 op, >> +                  struct audit_lsm_rules *lsmrules) >>   { >> -    return call_int_hook(audit_rule_match, 0, secid, field, op, lsmrule); >> +    struct security_hook_list *hp; >> +    int rc; >> + >> +    hlist_for_each_entry(hp, &security_hook_heads.audit_rule_match, list) { >> +        if (WARN_ON(hp->lsmid->slot < 0 || hp->lsmid->slot >= lsm_slot)) >> +            continue; >> +        if (lsmrules->rule[hp->lsmid->slot] == NULL) >> +            continue; >> +        rc = hp->hook.audit_rule_match(secid, field, op, >> + &lsmrules->rule[hp->lsmid->slot]); >> +        if (rc) >> +            return rc; >> +    } >> +    return 0; >>   } >>   #endif /* CONFIG_AUDIT */ >>   diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c >> index dffde40d367e..d67bcd1aeaf5 100644 >> --- a/security/selinux/hooks.c >> +++ b/security/selinux/hooks.c >> @@ -7009,6 +7009,11 @@ static int selinux_uring_sqpoll(void) >>   } >>   #endif /* CONFIG_IO_URING */ >>   +static struct lsm_id selinux_lsmid __lsm_ro_after_init = { >> +    .lsm  = "selinux", >> +    .slot = LSMBLOB_NEEDED >> +}; >> + >>   /* >>    * IMPORTANT NOTE: When adding new hooks, please be careful to keep this order: >>    * 1. any hooks that don't belong to (2.) or (3.) below, >> @@ -7324,7 +7329,8 @@ static __init int selinux_init(void) >>         hashtab_cache_init(); >>   -    security_add_hooks(selinux_hooks, ARRAY_SIZE(selinux_hooks), "selinux"); >> +    security_add_hooks(selinux_hooks, ARRAY_SIZE(selinux_hooks), >> +               &selinux_lsmid); >>         if (avc_add_callback(selinux_netcache_avc_callback, AVC_CALLBACK_RESET)) >>           panic("SELinux: Unable to register AVC netcache callback\n"); >> diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c >> index d58b50006e79..ff832d47479f 100644 >> --- a/security/smack/smack_lsm.c >> +++ b/security/smack/smack_lsm.c >> @@ -4744,6 +4744,11 @@ struct lsm_blob_sizes smack_blob_sizes __lsm_ro_after_init = { >>       .lbs_superblock = sizeof(struct superblock_smack), >>   }; >>   +static struct lsm_id smack_lsmid __lsm_ro_after_init = { >> +    .lsm  = "smack", >> +    .slot = LSMBLOB_NEEDED >> +}; >> + >>   static struct security_hook_list smack_hooks[] __lsm_ro_after_init = { >>       LSM_HOOK_INIT(ptrace_access_check, smack_ptrace_access_check), >>       LSM_HOOK_INIT(ptrace_traceme, smack_ptrace_traceme), >> @@ -4947,7 +4952,7 @@ static __init int smack_init(void) >>       /* >>        * Register with LSM >>        */ >> -    security_add_hooks(smack_hooks, ARRAY_SIZE(smack_hooks), "smack"); >> +    security_add_hooks(smack_hooks, ARRAY_SIZE(smack_hooks), &smack_lsmid); >>       smack_enabled = 1; >>         pr_info("Smack:  Initializing.\n"); >> diff --git a/security/tomoyo/tomoyo.c b/security/tomoyo/tomoyo.c >> index b6a31901f289..e8f6bb9782c1 100644 >> --- a/security/tomoyo/tomoyo.c >> +++ b/security/tomoyo/tomoyo.c >> @@ -521,6 +521,11 @@ static void tomoyo_task_free(struct task_struct *task) >>       } >>   } >>   +static struct lsm_id tomoyo_lsmid __lsm_ro_after_init = { >> +    .lsm  = "tomoyo", >> +    .slot = LSMBLOB_NOT_NEEDED >> +}; >> + >>   /* >>    * tomoyo_security_ops is a "struct security_operations" which is used for >>    * registering TOMOYO. >> @@ -573,7 +578,8 @@ static int __init tomoyo_init(void) >>       struct tomoyo_task *s = tomoyo_task(current); >>         /* register ourselves with the security framework */ >> -    security_add_hooks(tomoyo_hooks, ARRAY_SIZE(tomoyo_hooks), "tomoyo"); >> +    security_add_hooks(tomoyo_hooks, ARRAY_SIZE(tomoyo_hooks), >> +               &tomoyo_lsmid); >>       pr_info("TOMOYO Linux initialized\n"); >>       s->domain_info = &tomoyo_kernel_domain; >>       atomic_inc(&tomoyo_kernel_domain.users); >> diff --git a/security/yama/yama_lsm.c b/security/yama/yama_lsm.c >> index 06e226166aab..a9639ea541f7 100644 >> --- a/security/yama/yama_lsm.c >> +++ b/security/yama/yama_lsm.c >> @@ -421,6 +421,11 @@ static int yama_ptrace_traceme(struct task_struct *parent) >>       return rc; >>   } >>   +static struct lsm_id yama_lsmid __lsm_ro_after_init = { >> +    .lsm  = "yama", >> +    .slot = LSMBLOB_NOT_NEEDED >> +}; >> + >>   static struct security_hook_list yama_hooks[] __lsm_ro_after_init = { >>       LSM_HOOK_INIT(ptrace_access_check, yama_ptrace_access_check), >>       LSM_HOOK_INIT(ptrace_traceme, yama_ptrace_traceme), >> @@ -477,7 +482,7 @@ static inline void yama_init_sysctl(void) { } >>   static int __init yama_init(void) >>   { >>       pr_info("Yama: becoming mindful.\n"); >> -    security_add_hooks(yama_hooks, ARRAY_SIZE(yama_hooks), "yama"); >> +    security_add_hooks(yama_hooks, ARRAY_SIZE(yama_hooks), &yama_lsmid); >>       yama_init_sysctl(); >>       return 0; >>   } From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 0C6B6C433F5 for ; Fri, 4 Mar 2022 19:15:30 +0000 (UTC) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-136-3n4rcGVJNHuPQlkPyktzUA-1; Fri, 04 Mar 2022 14:15:26 -0500 X-MC-Unique: 3n4rcGVJNHuPQlkPyktzUA-1 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id B1B741091DA0; Fri, 4 Mar 2022 19:15:21 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 0AAE510013C1; Fri, 4 Mar 2022 19:15:20 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 03D0C1809C98; Fri, 4 Mar 2022 19:15:18 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.rdu2.redhat.com [10.11.54.2]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 224JEBEv001891 for ; Fri, 4 Mar 2022 14:14:11 -0500 Received: by smtp.corp.redhat.com (Postfix) id 0A0BB404779D; Fri, 4 Mar 2022 19:14:11 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast04.extmail.prod.ext.rdu2.redhat.com [10.11.55.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 04A55404779C for ; Fri, 4 Mar 2022 19:14:11 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [207.211.31.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id D7775101CC63 for ; Fri, 4 Mar 2022 19:14:10 +0000 (UTC) Received: from sonic304-28.consmr.mail.ne1.yahoo.com (sonic304-28.consmr.mail.ne1.yahoo.com [66.163.191.154]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-231-Klkq80WsNF6vyVr6Y8j1OQ-1; Fri, 04 Mar 2022 14:14:09 -0500 X-MC-Unique: Klkq80WsNF6vyVr6Y8j1OQ-1 X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1646421248; bh=IxcbM8anrb8CxsjVPQr1+oyTq9Blb7EOeyIdSaXCal9=; h=X-Sonic-MF:Date:Subject:To:From:From:Subject; b=R9OqqfxeLV6Bbiw8wm38xk83JMVH+BwH7Vc4uQI0WLLJ0iaxmwv624CoHNQ0oRYUBgk0WdD0ErNOEzt/FrjK/yDBa4Y75ckr492f6a24FLFe9orG09h1eh5lT0FRNN3BxMUbhsZXSgN2Se28WoIcILKzAH6LjX3VArS7NSraNt8rDQRrVkZ8qkfhwd+/OPScgVuNs25O/KdF/yswTLzM/k/IQndyr90UNti5yJlXTdydA3FTI2w6kGQlL5tPGCqPLfFy8a9vVdpQH8uycbvp2J4PNjcC9It99C9YcZeNtX9MgOhdM73tB0xHuGZcj2dGkxgeL8OKM+tJhVLS4FjxkA== X-YMail-OSG: cI7xli0VM1liIcdv9QILAq_ayt9hBVP_xatOp3mi_yt9t_imGXfryz_oKHbrJF0 A8pCxVNNCSrN9WlcffNIK8nnqevSoc15QJ_9bbe3mWGJXMzB5EW1ye_iaXjKepr6t7dbvO.yGd7z dMKEpOPpP6LeMjjqQfKtzH5EYWuFZhovsD2nnToPFfwDP5toXnBX0WeKjcM7nN3ssU4JU9wTqxPB EfITzHImBlZ_7iAafU4pMpGOVvzEf6PK4Y_g4R.52XT.WiPKSDURqRK37yeC_AljrEKFDsxw3k0K y6t1tTRlIZJajMDnuJBKVHOTCZZbG5CADYzT9tM.SDuYUS6yQzfA1R2EV3b_Tct4q_EijRpKcC.Z jsaRz1JRLHXK7QTdLfzCKWy7ZRgTA4D1Gi2vwKWRvQgks8.i9kKTA8OlXNIZ_lhVrMbiCqO4lkyB VHSAYgxeX_AFJbtyf6fp7mnOzoLpUBvJ9rpiNZmaO8cSpbwrcTvZpsrE6Zv17TXC2AoKiBMSwQ8g fi1ZcMYW1OmteSFFBKzxedC7sqsCpdrUW0AiAakgCzJsCHBuVtaYrSopU8gnjxB743Vt257i2.E6 HB5qRsBud4xSc_KrxMwpQ8vbmql0ol7ALPHF4aWUzoZ.z2HwumYCMfmyG7ymBTvxuox5GheldIm_ JlzN.36Y0A8rA3ewl0HTfcX9W1PsqP63Msocsbz9qOJL63Y2XXSCTC.zIK.Iv1lY7vagXxRcaLn4 0XoKQaZ4btJWKxnVM4dSqR8jlXbFw5N_Av0DMjiddpz0SJI2p7Z8mn23zS3NkfIuiFW7Z9KRcPtF f4mtgPhutzOWhg37G1pxysJxcXjbmk6kn1VuhFtvi5BBNktiUBjZQpT3qB0EHqywWv1LVcczu7W9 E5KprFEZsWz.dcZeGx2dz8LhYquQL4frDrhSNWGciUC_pchcylfxP_CxnoeiLvwIjEqj7EjcTf3u NAQPn4oIv1Hbda7UlYqZpkrr81kPHouv1KDPXOSqnVlSLFxZiP_jaNHkEXo0q7BhnyfahIRabEP4 9jXtCq53nziADtHpJLpixoozoNMFe0ymQGFSACzLHKbX7DGJVGQ5YgocaWmtG3sARmN1rK6sdqc7 fBdnNMsDGnWLQBv.hINkP4tTI9u.tFVY92KgSTrgNkjNS3GAs2q1nw2R69wj42XJ.M7e1lb3iJ9e DxBUB7azGeX4PmqhK5jcu7EMaCcnBTjU8tXhdG.XQ3gA5klF1FP4PeFnTYSj6FRGMKXjxpHZsQfp S4q87QKyoaBxN5zUfW6I2ji_xco2YSOP968D28RBfD8ZEkd7TFR2KPkq8YCg71sjqqXqfrFdstO1 tmu27QJLkAUraZNr5B1bY2AkdR_HxdGJabJGyKCwJorYdQNOFHkvB.tiCeNsXjoHaAkInjTuLDhQ 6X99YHv4kZBvptRIa1xSX9vPKsY.RY716pyyWRSWFBk3jx8q9Fcf4kGvGNwrDyxOWuz80LHkc.W8 CcFQltL4f3x8GCr5U9XqYumkw03D4APL4vsMufDVin7bauRzBR5XKesu4IM4vHqcsf_WeFajSPTq _rYtE.TYoTot_pOg9UBDoo6pVbC7CZxDe3eOy4v9fFotEBmxmki6plh1v.wXeQVY3fiv.VbwCfCI DKHeje1SzjF6C6h5v6_DX5.toY5m72b74fHlXQ3R63jswhUh9Hvftuaji4csrTRFXZ.7eqUHuDmw BjOLxwMe876fvznH29IrTbiO1JoKFPCFQrO_49DGj58oHCGXy2CczI4Icr5slqn0SwYaCNBc4RTq 8rYxYbPG2lgOr23vJaD3KbNv2FMemMpSmTIvt6YGVKEt1WBNAjI89G68UChS0uWXsEd99uSy1twG 2.sR4Gt2oeY4D7a3nL2sEURTslU20wUN2g_ShsNTI668I.ngYGqgWLvh1Too5YhLiN51OJgQlCkg hEClX31yBkN5LRyRmC9JfTWNTff.HkU3AVhXKk86Aitg6yTmsPdn7bDlWrpsSF9UR12buiUuh3y7 1cHNUDwm_h9WSMFqK3X2N7ZKzJFahXThWf9N4tDzC98DkCLHsH484PwaK5Uzx_an0KvCZVbBCM3I 6tgi2j2p1ZniRqdRVKV0ZqzQim1lvb_qQiaxOu0QDU2kG3izUksBChAUuMRuWrF42kyRzaMBVnR0 94AzCqios7dTVBWN8oL3qwl4tefzjmUhLbXNvXj2rO.cS4Mz0z3..cADJaz_y9QS9FJk8xvGfQFg lVSgfQAuscMe2RYftHEnDkNHmIbU- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic304.consmr.mail.ne1.yahoo.com with HTTP; Fri, 4 Mar 2022 19:14:08 +0000 Received: by kubenode527.mail-prod1.omega.gq1.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID 6349d18b7d068fc7f89c0919771ca5a0; Fri, 04 Mar 2022 19:14:06 +0000 (UTC) Message-ID: <273f4a9c-f96a-e051-5f5e-82310a15e234@schaufler-ca.com> Date: Fri, 4 Mar 2022 11:14:05 -0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Thunderbird/91.6.1 Subject: Re: [PATCH v32 03/28] LSM: Add the lsmblob data structure. To: =?UTF-8?Q?Micka=c3=abl_Sala=c3=bcn?= , casey.schaufler@intel.com, jmorris@namei.org, linux-security-module@vger.kernel.org, selinux@vger.kernel.org References: <20220202235323.23929-1-casey@schaufler-ca.com> <20220202235323.23929-4-casey@schaufler-ca.com> From: Casey Schaufler In-Reply-To: X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Scanned-By: MIMEDefang 2.84 on 10.11.54.2 X-loop: linux-audit@redhat.com Cc: john.johansen@canonical.com, linux-kernel@vger.kernel.org, linux-audit@redhat.com, sds@tycho.nsa.gov X-BeenThere: linux-audit@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Linux Audit Discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: linux-audit-bounces@redhat.com Errors-To: linux-audit-bounces@redhat.com X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=linux-audit-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Language: en-US Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" T24gMy80LzIwMjIgMjo0OCBBTSwgTWlja2HDq2wgU2FsYcO8biB3cm90ZToKPgo+IE9uIDAzLzAy LzIwMjIgMDA6NTIsIENhc2V5IFNjaGF1ZmxlciB3cm90ZToKPj4gV2hlbiBtb3JlIHRoYW4gb25l IHNlY3VyaXR5IG1vZHVsZSBpcyBleHBvcnRpbmcgZGF0YSB0bwo+PiBhdWRpdCBhbmQgbmV0d29y a2luZyBzdWItc3lzdGVtcyBhIHNpbmdsZSAzMiBiaXQgaW50ZWdlcgo+PiBpcyBubyBsb25nZXIg c3VmZmljaWVudCB0byByZXByZXNlbnQgdGhlIGRhdGEuIEFkZCBhCj4+IHN0cnVjdHVyZSB0byBi ZSB1c2VkIGluc3RlYWQuCj4+Cj4+IFRoZSBsc21ibG9iIHN0cnVjdHVyZSBpcyBjdXJyZW50bHkg YW4gYXJyYXkgb2YKPj4gdTMyICJzZWNpZHMiLiBUaGVyZSBpcyBhbiBlbnRyeSBmb3IgZWFjaCBv ZiB0aGUKPj4gc2VjdXJpdHkgbW9kdWxlcyBidWlsdCBpbnRvIHRoZSBzeXN0ZW0gdGhhdCB3b3Vs ZAo+PiB1c2Ugc2VjaWRzIGlmIGFjdGl2ZS4gVGhlIHN5c3RlbSBhc3NpZ25zIHRoZSBtb2R1bGUK Pj4gYSAic2xvdCIgd2hlbiBpdCByZWdpc3RlcnMgaG9va3MuIElmIG1vZHVsZXMgYXJlCj4+IGNv bXBpbGVkIGluIGJ1dCBub3QgcmVnaXN0ZXJlZCB0aGVyZSB3aWxsIGJlIHVudXNlZAo+PiBzbG90 cy4KPj4KPj4gQSBuZXcgbHNtX2lkIHN0cnVjdHVyZSwgd2hpY2ggY29udGFpbnMgdGhlIG5hbWUK Pj4gb2YgdGhlIExTTSBhbmQgaXRzIHNsb3QgbnVtYmVyLCBpcyBjcmVhdGVkLiBUaGVyZQo+PiBp cyBhbiBpbnN0YW5jZSBmb3IgZWFjaCBMU00sIHdoaWNoIGFzc2lnbnMgdGhlIG5hbWUKPj4gYW5k IHBhc3NlcyBpdCB0byB0aGUgaW5mcmFzdHJ1Y3R1cmUgdG8gc2V0IHRoZSBzbG90Lgo+Pgo+PiBU aGUgYXVkaXQgcnVsZXMgZGF0YSBpcyBleHBhbmRlZCB0byB1c2UgYW4gYXJyYXkgb2YKPj4gc2Vj dXJpdHkgbW9kdWxlIGRhdGEgcmF0aGVyIHRoYW4gYSBzaW5nbGUgaW5zdGFuY2UuCj4+IEEgbmV3 IHN0cnVjdHVyZSBhdWRpdF9sc21fcnVsZXMgaXMgZGVmaW5lZCB0byBhdm9pZCB0aGUKPj4gY29u ZnVzaW9uIHdoaWNoIGNvbW1vbmx5IGFjY29tcGFuaWVzIHRoZSB1c2Ugb2YKPj4gdm9pZCAqKiBw YXJhbWV0ZXJzLgo+Pgo+PiBTaWduZWQtb2ZmLWJ5OiBDYXNleSBTY2hhdWZsZXIgPGNhc2V5QHNj aGF1Zmxlci1jYS5jb20+Cj4KPiBSZXZpZXdlZC1ieTogTWlja2HDq2wgU2FsYcO8biA8bWljQGxp bnV4Lm1pY3Jvc29mdC5jb20+Cj4KPgo+IE1pbm9yIGZpeGVzOgoKVGhhbmsgeW91LiBJIHdpbGwg aW5jb3Jwb3JhdGUgdGhlc2UgY2hhbmdlcy4KCj4KPgo+PiAtLS0KPj4gwqAgaW5jbHVkZS9saW51 eC9hdWRpdC5owqDCoMKgwqDCoMKgwqAgfCAxMCArKysrLQo+PiDCoCBpbmNsdWRlL2xpbnV4L2xz bV9ob29rcy5owqDCoMKgIHwgMTIgKysrKystCj4+IMKgIGluY2x1ZGUvbGludXgvc2VjdXJpdHku aMKgwqDCoMKgIHwgNzQgKysrKysrKysrKysrKysrKysrKysrKysrKysrKystLS0KPj4gwqAga2Vy bmVsL2F1ZGl0ZmlsdGVyLmPCoMKgwqDCoMKgwqDCoMKgIHwgMjMgKysrKystLS0tLQo+PiDCoCBr ZXJuZWwvYXVkaXRzYy5jwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHwgMTcgKysrLS0tLS0KPj4g wqAgc2VjdXJpdHkvYXBwYXJtb3IvbHNtLmPCoMKgwqDCoMKgIHzCoCA3ICsrLQo+PiDCoCBzZWN1 cml0eS9icGYvaG9va3MuY8KgwqDCoMKgwqDCoMKgwqAgfCAxMiArKysrKy0KPj4gwqAgc2VjdXJp dHkvY29tbW9uY2FwLmPCoMKgwqDCoMKgwqDCoMKgIHzCoCA3ICsrLQo+PiDCoCBzZWN1cml0eS9s YW5kbG9jay9jcmVkLmPCoMKgwqDCoCB8wqAgMiArLQo+PiDCoCBzZWN1cml0eS9sYW5kbG9jay9m cy5jwqDCoMKgwqDCoMKgIHzCoCAyICstCj4+IMKgIHNlY3VyaXR5L2xhbmRsb2NrL3B0cmFjZS5j wqDCoCB8wqAgMiArLQo+PiDCoCBzZWN1cml0eS9sYW5kbG9jay9zZXR1cC5jwqDCoMKgIHzCoCA1 ICsrKwo+PiDCoCBzZWN1cml0eS9sYW5kbG9jay9zZXR1cC5owqDCoMKgIHzCoCAxICsKPj4gwqAg c2VjdXJpdHkvbG9hZHBpbi9sb2FkcGluLmPCoMKgIHzCoCA4ICsrKy0KPj4gwqAgc2VjdXJpdHkv bG9ja2Rvd24vbG9ja2Rvd24uYyB8wqAgNyArKy0KPj4gwqAgc2VjdXJpdHkvc2FmZXNldGlkL2xz bS5jwqDCoMKgwqAgfMKgIDggKysrLQo+PiDCoCBzZWN1cml0eS9zZWN1cml0eS5jwqDCoMKgwqDC oMKgwqDCoMKgIHwgODIgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrLS0tLS0tCj4+IMKg IHNlY3VyaXR5L3NlbGludXgvaG9va3MuY8KgwqDCoMKgIHzCoCA4ICsrKy0KPj4gwqAgc2VjdXJp dHkvc21hY2svc21hY2tfbHNtLmPCoMKgIHzCoCA3ICsrLQo+PiDCoCBzZWN1cml0eS90b21veW8v dG9tb3lvLmPCoMKgwqDCoCB8wqAgOCArKystCj4+IMKgIHNlY3VyaXR5L3lhbWEveWFtYV9sc20u Y8KgwqDCoMKgIHzCoCA3ICsrLQo+PiDCoCAyMSBmaWxlcyBjaGFuZ2VkLCAyNTMgaW5zZXJ0aW9u cygrKSwgNTYgZGVsZXRpb25zKC0pCj4+Cj4+IGRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2F1 ZGl0LmggYi9pbmNsdWRlL2xpbnV4L2F1ZGl0LmgKPj4gaW5kZXggZDA2MTM0YWM2MjQ1Li4xNDg0 OWQ1Zjg0YjQgMTAwNjQ0Cj4+IC0tLSBhL2luY2x1ZGUvbGludXgvYXVkaXQuaAo+PiArKysgYi9p bmNsdWRlL2xpbnV4L2F1ZGl0LmgKPj4gQEAgLTExLDYgKzExLDcgQEAKPj4gwqAgwqAgI2luY2x1 ZGUgPGxpbnV4L3NjaGVkLmg+Cj4+IMKgICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KPj4gKyNp bmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgo+PiDCoCAjaW5jbHVkZSA8bGludXgvYXVkaXRfYXJj aC5oPgo+PiDCoCAjaW5jbHVkZSA8dWFwaS9saW51eC9hdWRpdC5oPgo+PiDCoCAjaW5jbHVkZSA8 dWFwaS9saW51eC9uZXRmaWx0ZXIvbmZfdGFibGVzLmg+Cj4+IEBAIC01OSw2ICs2MCwxMCBAQCBz dHJ1Y3QgYXVkaXRfa3J1bGUgewo+PiDCoCAvKiBGbGFnIHRvIGluZGljYXRlIGxlZ2FjeSBBVURJ VF9MT0dJTlVJRCB1bnNldCB1c2FnZSAqLwo+PiDCoCAjZGVmaW5lIEFVRElUX0xPR0lOVUlEX0xF R0FDWcKgwqDCoMKgwqDCoMKgIDB4MQo+PiDCoCArc3RydWN0IGF1ZGl0X2xzbV9ydWxlcyB7Cj4+ ICvCoMKgwqAgdm9pZMKgwqDCoCAqcnVsZVtMU01CTE9CX0VOVFJJRVNdOwo+PiArfTsKPj4gKwo+ PiDCoCBzdHJ1Y3QgYXVkaXRfZmllbGQgewo+PiDCoMKgwqDCoMKgIHUzMsKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCB0eXBlOwo+PiDCoMKgwqDCoMKgIHVuaW9uIHsKPj4gQEAgLTY2LDgg KzcxLDkgQEAgc3RydWN0IGF1ZGl0X2ZpZWxkIHsKPj4gwqDCoMKgwqDCoMKgwqDCoMKgIGt1aWRf dMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdWlkOwo+PiDCoMKgwqDCoMKgwqDCoMKgwqAga2dpZF90 wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBnaWQ7Cj4+IMKgwqDCoMKgwqDCoMKgwqDCoCBzdHJ1Y3Qg ewo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjaGFywqDCoMKgwqDCoMKgwqAgKmxzbV9zdHI7 Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHZvaWTCoMKgwqDCoMKgwqDCoCAqbHNtX3J1bGU7 Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJvb2zCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGxz bV9pc3NldDsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY2hhcsKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgKmxzbV9zdHI7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHN0cnVjdCBhdWRpdF9s c21fcnVsZXPCoMKgwqAgbHNtX3J1bGVzOwo+PiDCoMKgwqDCoMKgwqDCoMKgwqAgfTsKPj4gwqDC oMKgwqDCoCB9Owo+PiDCoMKgwqDCoMKgIHUzMsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBvcDsKPj4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbHNtX2hvb2tzLmggYi9pbmNsdWRl L2xpbnV4L2xzbV9ob29rcy5oCj4+IGluZGV4IDEyOWQ5OWM2ZjllZC4uMmMyZDBlZjU5YTQxIDEw MDY0NAo+PiAtLS0gYS9pbmNsdWRlL2xpbnV4L2xzbV9ob29rcy5oCj4+ICsrKyBiL2luY2x1ZGUv bGludXgvbHNtX2hvb2tzLmgKPj4gQEAgLTE1ODIsNiArMTU4MiwxNCBAQCBzdHJ1Y3Qgc2VjdXJp dHlfaG9va19oZWFkcyB7Cj4+IMKgwqDCoMKgwqAgI3VuZGVmIExTTV9IT09LCj4+IMKgIH0gX19y YW5kb21pemVfbGF5b3V0Owo+PiDCoCArLyoKPj4gKyAqIEluZm9ybWF0aW9uIHRoYXQgaWRlbnRp ZmllcyBhIHNlY3VyaXR5IG1vZHVsZS4KPj4gKyAqLwo+PiArc3RydWN0IGxzbV9pZCB7Cj4+ICvC oMKgwqAgY29uc3QgY2hhcsKgwqDCoCAqbHNtO8KgwqDCoCAvKiBOYW1lIG9mIHRoZSBMU00gKi8K Pj4gK8KgwqDCoCBpbnTCoMKgwqDCoMKgwqDCoCBzbG90O8KgwqDCoCAvKiBTbG90IGluIGxzbWJs b2IgaWYgb25lIGlzIGFsbG9jYXRlZCAqLwo+PiArfTsKPj4gKwo+PiDCoCAvKgo+PiDCoMKgICog U2VjdXJpdHkgbW9kdWxlIGhvb2sgbGlzdCBzdHJ1Y3R1cmUuCj4+IMKgwqAgKiBGb3IgdXNlIHdp dGggZ2VuZXJpYyBsaXN0IG1hY3JvcyBmb3IgY29tbW9uIG9wZXJhdGlvbnMuCj4+IEBAIC0xNTkw LDcgKzE1OTgsNyBAQCBzdHJ1Y3Qgc2VjdXJpdHlfaG9va19saXN0IHsKPj4gwqDCoMKgwqDCoCBz dHJ1Y3QgaGxpc3Rfbm9kZcKgwqDCoMKgwqDCoMKgIGxpc3Q7Cj4+IMKgwqDCoMKgwqAgc3RydWN0 IGhsaXN0X2hlYWTCoMKgwqDCoMKgwqDCoCAqaGVhZDsKPj4gwqDCoMKgwqDCoCB1bmlvbiBzZWN1 cml0eV9saXN0X29wdGlvbnPCoMKgwqAgaG9vazsKPj4gLcKgwqDCoCBjaGFywqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgICpsc207Cj4+ICvCoMKgwqAgc3RydWN0IGxzbV9pZMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgKmxzbWlkOwo+PiDCoCB9IF9fcmFuZG9taXplX2xheW91dDsKPj4gwqAg wqAgLyoKPj4gQEAgLTE2MjYsNyArMTYzNCw3IEBAIGV4dGVybiBzdHJ1Y3Qgc2VjdXJpdHlfaG9v a19oZWFkcyBzZWN1cml0eV9ob29rX2hlYWRzOwo+PiDCoCBleHRlcm4gY2hhciAqbHNtX25hbWVz Owo+PiDCoCDCoCBleHRlcm4gdm9pZCBzZWN1cml0eV9hZGRfaG9va3Moc3RydWN0IHNlY3VyaXR5 X2hvb2tfbGlzdCAqaG9va3MsIGludCBjb3VudCwKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBjaGFyICpsc20pOwo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIHN0cnVjdCBsc21faWQgKmxzbWlkKTsKPj4gwqAgwqAgI2RlZmluZSBMU01fRkxBR19MRUdB Q1lfTUFKT1LCoMKgwqAgQklUKDApCj4+IMKgICNkZWZpbmUgTFNNX0ZMQUdfRVhDTFVTSVZFwqDC oMKgIEJJVCgxKQo+PiBkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZWN1cml0eS5oIGIvaW5j bHVkZS9saW51eC9zZWN1cml0eS5oCj4+IGluZGV4IDMzZTBmMmU2NTlkZi4uMWE3ZTViZjM2YTgy IDEwMDY0NAo+PiAtLS0gYS9pbmNsdWRlL2xpbnV4L3NlY3VyaXR5LmgKPj4gKysrIGIvaW5jbHVk ZS9saW51eC9zZWN1cml0eS5oCj4+IEBAIC0zOSw2ICszOSw3IEBAIHN0cnVjdCBrZXJuZWxfc2ln aW5mbzsKPj4gwqAgc3RydWN0IHNlbWJ1ZjsKPj4gwqAgc3RydWN0IGtlcm5faXBjX3Blcm07Cj4+ IMKgIHN0cnVjdCBhdWRpdF9jb250ZXh0Owo+PiArc3RydWN0IGF1ZGl0X2xzbV9ydWxlczsKPj4g wqAgc3RydWN0IHN1cGVyX2Jsb2NrOwo+PiDCoCBzdHJ1Y3QgaW5vZGU7Cj4+IMKgIHN0cnVjdCBk ZW50cnk7Cj4+IEBAIC0xMzQsNiArMTM1LDY1IEBAIGVudW0gbG9ja2Rvd25fcmVhc29uIHsKPj4g wqAgwqAgZXh0ZXJuIGNvbnN0IGNoYXIgKmNvbnN0IGxvY2tkb3duX3JlYXNvbnNbTE9DS0RPV05f Q09ORklERU5USUFMSVRZX01BWCsxXTsKPj4gwqAgKy8qCj4+ICsgKiBEYXRhIGV4cG9ydGVkIGJ5 IHRoZSBzZWN1cml0eSBtb2R1bGVzCj4+ICsgKgo+PiArICogQW55IExTTSB0aGF0IHByb3ZpZGVz IHNlY2lkIG9yIHNlY2N0eCBiYXNlZCBob29rcyBtdXN0IGJlIGluY2x1ZGVkLgo+PiArICovCj4+ ICsjZGVmaW5lIExTTUJMT0JfRU5UUklFUyAoIFwKPj4gK8KgwqDCoCAoSVNfRU5BQkxFRChDT05G SUdfU0VDVVJJVFlfU0VMSU5VWCkgPyAxIDogMCkgKyBcCj4+ICvCoMKgwqAgKElTX0VOQUJMRUQo Q09ORklHX1NFQ1VSSVRZX1NNQUNLKSA/IDEgOiAwKSArIFwKPj4gK8KgwqDCoCAoSVNfRU5BQkxF RChDT05GSUdfU0VDVVJJVFlfQVBQQVJNT1IpID8gMSA6IDApICsgXAo+PiArwqDCoMKgIChJU19F TkFCTEVEKENPTkZJR19CUEZfTFNNKSA/IDEgOiAwKSkKPj4gKwo+PiArc3RydWN0IGxzbWJsb2Ig ewo+PiArwqDCoMKgIHUzMsKgwqDCoMKgIHNlY2lkW0xTTUJMT0JfRU5UUklFU107Cj4+ICt9Owo+ PiArCj4+ICsjZGVmaW5lIExTTUJMT0JfSU5WQUxJRMKgwqDCoMKgwqDCoMKgIC0xwqDCoMKgIC8q IE5vdCBhIHZhbGlkIExTTSBzbG90IG51bWJlciAqLwo+PiArI2RlZmluZSBMU01CTE9CX05FRURF RMKgwqDCoMKgwqDCoMKgIC0ywqDCoMKgIC8qIFNsb3QgcmVxdWVzdGVkIG9uIGluaXRpYWxpemF0 aW9uICovCj4+ICsjZGVmaW5lIExTTUJMT0JfTk9UX05FRURFRMKgwqDCoCAtM8KgwqDCoCAvKiBT bG90IG5vdCByZXF1ZXN0ZWQgKi8KPj4gKwo+PiArLyoqCj4+ICsgKiBsc21ibG9iX2luaXQgLSBp bml0aWFsaXplIGFuIGxzbWJsb2Igc3RydWN0dXJlCj4+ICsgKiBAYmxvYjogUG9pbnRlciB0byB0 aGUgZGF0YSB0byBpbml0aWFsaXplCj4+ICsgKiBAc2VjaWQ6IFRoZSBpbml0aWFsIHNlY2lkIHZh bHVlCj4+ICsgKgo+PiArICogU2V0IGFsbCBzZWNpZCBmb3IgYWxsIG1vZHVsZXMgdG8gdGhlIHNw ZWNpZmllZCB2YWx1ZS4KPj4gKyAqLwo+PiArc3RhdGljIGlubGluZSB2b2lkIGxzbWJsb2JfaW5p dChzdHJ1Y3QgbHNtYmxvYiAqYmxvYiwgdTMyIHNlY2lkKQo+PiArewo+PiArwqDCoMKgIGludCBp Owo+PiArCj4+ICvCoMKgwqAgZm9yIChpID0gMDsgaSA8IExTTUJMT0JfRU5UUklFUzsgaSsrKQo+ PiArwqDCoMKgwqDCoMKgwqAgYmxvYi0+c2VjaWRbaV0gPSBzZWNpZDsKPj4gK30KPj4gKwo+PiAr LyoqCj4+ICsgKiBsc21ibG9iX2lzX3NldCAtIHJlcG9ydCBpZiB0aGVyZSBpcyBhbiB2YWx1ZSBp biB0aGUgbHNtYmxvYgo+Cj4gKmEqIHZhbHVlCj4KPgo+PiArICogQGJsb2I6IFBvaW50ZXIgdG8g dGhlIGV4cG9ydGVkIExTTSBkYXRhCj4+ICsgKgo+PiArICogUmV0dXJucyB0cnVlIGlmIHRoZXJl IGlzIGEgc2VjaWQgc2V0LCBmYWxzZSBvdGhlcndpc2UKPj4gKyAqLwo+PiArc3RhdGljIGlubGlu ZSBib29sIGxzbWJsb2JfaXNfc2V0KHN0cnVjdCBsc21ibG9iICpibG9iKQo+PiArewo+PiArwqDC oMKgIHN0cnVjdCBsc21ibG9iIGVtcHR5ID0ge307Cj4KPiBjb25zdCBzdHJ1Y3QgbHNtYmxvYiBl bXB0eSA9IHt9Owo+Cj4+ICsKPj4gK8KgwqDCoCByZXR1cm4gISFtZW1jbXAoYmxvYiwgJmVtcHR5 LCBzaXplb2YoKmJsb2IpKTsKPj4gK30KPj4gKwo+PiArLyoqCj4+ICsgKiBsc21ibG9iX2VxdWFs IC0gcmVwb3J0IGlmIHRoZSB0d28gbHNtYmxvYidzIGFyZSBlcXVhbAo+PiArICogQGJsb2JhOiBQ b2ludGVyIHRvIG9uZSBMU00gZGF0YQo+PiArICogQGJsb2JiOiBQb2ludGVyIHRvIHRoZSBvdGhl ciBMU00gZGF0YQo+PiArICoKPj4gKyAqIFJldHVybnMgdHJ1ZSBpZiBhbGwgZW50cmllcyBpbiB0 aGUgdHdvIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlCj4+ICsgKi8KPj4gK3N0YXRpYyBpbmxp bmUgYm9vbCBsc21ibG9iX2VxdWFsKHN0cnVjdCBsc21ibG9iICpibG9iYSwgc3RydWN0IGxzbWJs b2IgKmJsb2JiKQo+Cj4gY29uc3Qgc3RydWN0IGxzbWJsb2IgKmJsb2JhLCBjb25zdCBzdHJ1Y3Qg bHNtYmxvYiAqYmxvYmIKPgo+Cj4+ICt7Cj4+ICvCoMKgwqAgcmV0dXJuICFtZW1jbXAoYmxvYmEs IGJsb2JiLCBzaXplb2YoKmJsb2JhKSk7Cj4+ICt9Cj4+ICsKPj4gwqAgLyogVGhlc2UgZnVuY3Rp b25zIGFyZSBpbiBzZWN1cml0eS9jb21tb25jYXAuYyAqLwo+PiDCoCBleHRlcm4gaW50IGNhcF9j YXBhYmxlKGNvbnN0IHN0cnVjdCBjcmVkICpjcmVkLCBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKm5z LAo+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpbnQgY2FwLCB1bnNpZ25lZCBp bnQgb3B0cyk7Cj4+IEBAIC0xODc5LDE1ICsxOTM5LDE3IEBAIHN0YXRpYyBpbmxpbmUgaW50IHNl Y3VyaXR5X2tleV9nZXRzZWN1cml0eShzdHJ1Y3Qga2V5ICprZXksIGNoYXIgKipfYnVmZmVyKQo+ PiDCoCDCoCAjaWZkZWYgQ09ORklHX0FVRElUCj4+IMKgICNpZmRlZiBDT05GSUdfU0VDVVJJVFkK Pj4gLWludCBzZWN1cml0eV9hdWRpdF9ydWxlX2luaXQodTMyIGZpZWxkLCB1MzIgb3AsIGNoYXIg KnJ1bGVzdHIsIHZvaWQgKipsc21ydWxlKTsKPj4gK2ludCBzZWN1cml0eV9hdWRpdF9ydWxlX2lu aXQodTMyIGZpZWxkLCB1MzIgb3AsIGNoYXIgKnJ1bGVzdHIsCj4+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBzdHJ1Y3QgYXVkaXRfbHNtX3J1bGVzICpsc21ydWxlcyk7Cj4+IMKg IGludCBzZWN1cml0eV9hdWRpdF9ydWxlX2tub3duKHN0cnVjdCBhdWRpdF9rcnVsZSAqa3J1bGUp Owo+PiAtaW50IHNlY3VyaXR5X2F1ZGl0X3J1bGVfbWF0Y2godTMyIHNlY2lkLCB1MzIgZmllbGQs IHUzMiBvcCwgdm9pZCAqbHNtcnVsZSk7Cj4+IC12b2lkIHNlY3VyaXR5X2F1ZGl0X3J1bGVfZnJl ZSh2b2lkICpsc21ydWxlKTsKPj4gK2ludCBzZWN1cml0eV9hdWRpdF9ydWxlX21hdGNoKHUzMiBz ZWNpZCwgdTMyIGZpZWxkLCB1MzIgb3AsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIHN0cnVjdCBhdWRpdF9sc21fcnVsZXMgKmxzbXJ1bGVzKTsKPj4gK3ZvaWQgc2VjdXJp dHlfYXVkaXRfcnVsZV9mcmVlKHN0cnVjdCBhdWRpdF9sc21fcnVsZXMgKmxzbXJ1bGVzKTsKPj4g wqAgwqAgI2Vsc2UKPj4gwqAgwqAgc3RhdGljIGlubGluZSBpbnQgc2VjdXJpdHlfYXVkaXRfcnVs ZV9pbml0KHUzMiBmaWVsZCwgdTMyIG9wLCBjaGFyICpydWxlc3RyLAo+PiAtwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdm9pZCAqKmxzbXJ1bGUpCj4+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzdHJ1Y3QgYXVkaXRfbHNt X3J1bGVzICpsc21ydWxlcykKPj4gwqAgewo+PiDCoMKgwqDCoMKgIHJldHVybiAwOwo+PiDCoCB9 Cj4+IEBAIC0xODk4LDEyICsxOTYwLDEyIEBAIHN0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X2F1 ZGl0X3J1bGVfa25vd24oc3RydWN0IGF1ZGl0X2tydWxlICprcnVsZSkKPj4gwqAgfQo+PiDCoCDC oCBzdGF0aWMgaW5saW5lIGludCBzZWN1cml0eV9hdWRpdF9ydWxlX21hdGNoKHUzMiBzZWNpZCwg dTMyIGZpZWxkLCB1MzIgb3AsCj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIHZvaWQgKmxzbXJ1bGUpCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIHN0cnVjdCBhdWRpdF9sc21fcnVsZXMgKmxzbXJ1bGVzKQo+ PiDCoCB7Cj4+IMKgwqDCoMKgwqAgcmV0dXJuIDA7Cj4+IMKgIH0KPj4gwqAgLXN0YXRpYyBpbmxp bmUgdm9pZCBzZWN1cml0eV9hdWRpdF9ydWxlX2ZyZWUodm9pZCAqbHNtcnVsZSkKPj4gK3N0YXRp YyBpbmxpbmUgdm9pZCBzZWN1cml0eV9hdWRpdF9ydWxlX2ZyZWUoc3RydWN0IGF1ZGl0X2xzbV9y dWxlcyAqbHNtcnVsZXMpCj4+IMKgIHsgfQo+PiDCoCDCoCAjZW5kaWYgLyogQ09ORklHX1NFQ1VS SVRZICovCj4+IGRpZmYgLS1naXQgYS9rZXJuZWwvYXVkaXRmaWx0ZXIuYyBiL2tlcm5lbC9hdWRp dGZpbHRlci5jCj4+IGluZGV4IDQyZDk5ODk2ZTdhNi4uZGU3NWJkNmFkODY2IDEwMDY0NAo+PiAt LS0gYS9rZXJuZWwvYXVkaXRmaWx0ZXIuYwo+PiArKysgYi9rZXJuZWwvYXVkaXRmaWx0ZXIuYwo+ PiBAQCAtNzYsNyArNzYsNyBAQCBzdGF0aWMgdm9pZCBhdWRpdF9mcmVlX2xzbV9maWVsZChzdHJ1 Y3QgYXVkaXRfZmllbGQgKmYpCj4+IMKgwqDCoMKgwqAgY2FzZSBBVURJVF9PQkpfTEVWX0xPVzoK Pj4gwqDCoMKgwqDCoCBjYXNlIEFVRElUX09CSl9MRVZfSElHSDoKPj4gwqDCoMKgwqDCoMKgwqDC oMKgIGtmcmVlKGYtPmxzbV9zdHIpOwo+PiAtwqDCoMKgwqDCoMKgwqAgc2VjdXJpdHlfYXVkaXRf cnVsZV9mcmVlKGYtPmxzbV9ydWxlKTsKPj4gK8KgwqDCoMKgwqDCoMKgIHNlY3VyaXR5X2F1ZGl0 X3J1bGVfZnJlZSgmZi0+bHNtX3J1bGVzKTsKPj4gwqDCoMKgwqDCoCB9Cj4+IMKgIH0KPj4gwqAg QEAgLTUyOSw3ICs1MjksNyBAQCBzdGF0aWMgc3RydWN0IGF1ZGl0X2VudHJ5ICphdWRpdF9kYXRh X3RvX2VudHJ5KHN0cnVjdCBhdWRpdF9ydWxlX2RhdGEgKmRhdGEsCj4+IMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIGVudHJ5LT5ydWxlLmJ1ZmxlbiArPSBmX3ZhbDsKPj4gwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgZi0+bHNtX3N0ciA9IHN0cjsKPj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgZXJyID0gc2VjdXJpdHlfYXVkaXRfcnVsZV9pbml0KGYtPnR5cGUsIGYtPm9wLCBzdHIs Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgKHZvaWQgKiopJmYtPmxzbV9ydWxlKTsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAmZi0+bHNtX3J1bGVzKTsK Pj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgLyogS2VlcCBjdXJyZW50bHkgaW52YWxpZCBm aWVsZHMgYXJvdW5kIGluIGNhc2UgdGhleQo+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg ICogYmVjb21lIHZhbGlkIGFmdGVyIGEgcG9saWN5IHJlbG9hZC4gKi8KPj4gwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgaWYgKGVyciA9PSAtRUlOVkFMKSB7Cj4+IEBAIC03ODIsNyArNzgyLDcg QEAgc3RhdGljIGludCBhdWRpdF9jb21wYXJlX3J1bGUoc3RydWN0IGF1ZGl0X2tydWxlICphLCBz dHJ1Y3QgYXVkaXRfa3J1bGUgKmIpCj4+IMKgwqDCoMKgwqAgcmV0dXJuIDA7Cj4+IMKgIH0KPj4g wqAgLS8qIER1cGxpY2F0ZSBMU00gZmllbGQgaW5mb3JtYXRpb24uwqAgVGhlIGxzbV9ydWxlIGlz IG9wYXF1ZSwgc28gbXVzdCBiZQo+PiArLyogRHVwbGljYXRlIExTTSBmaWVsZCBpbmZvcm1hdGlv bi7CoCBUaGUgbHNtX3J1bGVzIGlzIG9wYXF1ZSwgc28gbXVzdCBiZQo+PiDCoMKgICogcmUtaW5p dGlhbGl6ZWQuICovCj4+IMKgIHN0YXRpYyBpbmxpbmUgaW50IGF1ZGl0X2R1cGVfbHNtX2ZpZWxk KHN0cnVjdCBhdWRpdF9maWVsZCAqZGYsCj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCBzdHJ1Y3QgYXVkaXRfZmllbGQgKnNmKQo+PiBAQCAtNzk2LDkg Kzc5Niw5IEBAIHN0YXRpYyBpbmxpbmUgaW50IGF1ZGl0X2R1cGVfbHNtX2ZpZWxkKHN0cnVjdCBh dWRpdF9maWVsZCAqZGYsCj4+IMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gLUVOT01FTTsKPj4g wqDCoMKgwqDCoCBkZi0+bHNtX3N0ciA9IGxzbV9zdHI7Cj4+IMKgIC3CoMKgwqAgLyogb3VyIG93 biAocmVmcmVzaGVkKSBjb3B5IG9mIGxzbV9ydWxlICovCj4+ICvCoMKgwqAgLyogb3VyIG93biAo cmVmcmVzaGVkKSBjb3B5IG9mIGxzbV9ydWxlcyAqLwo+PiDCoMKgwqDCoMKgIHJldCA9IHNlY3Vy aXR5X2F1ZGl0X3J1bGVfaW5pdChkZi0+dHlwZSwgZGYtPm9wLCBkZi0+bHNtX3N0ciwKPj4gLcKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICh2b2lkICoqKSZkZi0+ bHNtX3J1bGUpOwo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgJmRmLT5sc21fcnVsZXMpOwo+PiDCoMKgwqDCoMKgIC8qIEtlZXAgY3VycmVudGx5IGludmFs aWQgZmllbGRzIGFyb3VuZCBpbiBjYXNlIHRoZXkKPj4gwqDCoMKgwqDCoMKgICogYmVjb21lIHZh bGlkIGFmdGVyIGEgcG9saWN5IHJlbG9hZC4gKi8KPj4gwqDCoMKgwqDCoCBpZiAocmV0ID09IC1F SU5WQUwpIHsKPj4gQEAgLTg1MCw3ICs4NTAsNyBAQCBzdHJ1Y3QgYXVkaXRfZW50cnkgKmF1ZGl0 X2R1cGVfcnVsZShzdHJ1Y3QgYXVkaXRfa3J1bGUgKm9sZCkKPj4gwqDCoMKgwqDCoCBuZXctPnRy ZWUgPSBvbGQtPnRyZWU7Cj4+IMKgwqDCoMKgwqAgbWVtY3B5KG5ldy0+ZmllbGRzLCBvbGQtPmZp ZWxkcywgc2l6ZW9mKHN0cnVjdCBhdWRpdF9maWVsZCkgKiBmY291bnQpOwo+PiDCoCAtwqDCoMKg IC8qIGRlZXAgY29weSB0aGlzIGluZm9ybWF0aW9uLCB1cGRhdGluZyB0aGUgbHNtX3J1bGUgZmll bGRzLCBiZWNhdXNlCj4+ICvCoMKgwqAgLyogZGVlcCBjb3B5IHRoaXMgaW5mb3JtYXRpb24sIHVw ZGF0aW5nIHRoZSBsc21fcnVsZXMgZmllbGRzLCBiZWNhdXNlCj4+IMKgwqDCoMKgwqDCoCAqIHRo ZSBvcmlnaW5hbHMgd2lsbCBhbGwgYmUgZnJlZWQgd2hlbiB0aGUgb2xkIHJ1bGUgaXMgZnJlZWQu ICovCj4+IMKgwqDCoMKgwqAgZm9yIChpID0gMDsgaSA8IGZjb3VudDsgaSsrKSB7Cj4+IMKgwqDC oMKgwqDCoMKgwqDCoCBzd2l0Y2ggKG5ldy0+ZmllbGRzW2ldLnR5cGUpIHsKPj4gQEAgLTEzNjcs MTAgKzEzNjcsMTEgQEAgaW50IGF1ZGl0X2ZpbHRlcihpbnQgbXNndHlwZSwgdW5zaWduZWQgaW50 IGxpc3R0eXBlKQo+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjYXNlIEFVRElUX1NVQkpf VFlQRToKPj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY2FzZSBBVURJVF9TVUJKX1NFTjoK Pj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY2FzZSBBVURJVF9TVUJKX0NMUjoKPj4gLcKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAoZi0+bHNtX3J1bGUpIHsKPj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAoZi0+bHNtX3N0cikgewo+PiDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc2VjdXJpdHlfY3VycmVudF9nZXRzZWNp ZF9zdWJqKCZzaWQpOwo+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgcmVzdWx0ID0gc2VjdXJpdHlfYXVkaXRfcnVsZV9tYXRjaChzaWQsCj4+IC3CoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGYtPnR5cGUsIGYtPm9w LCBmLT5sc21fcnVsZSk7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIGYtPnR5cGUsIGYtPm9wLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAmZi0+bHNtX3J1bGVzKTsKPj4gwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9Cj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgYnJlYWs7Cj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNhc2UgQVVE SVRfRVhFOgo+PiBAQCAtMTM5Nyw3ICsxMzk4LDcgQEAgaW50IGF1ZGl0X2ZpbHRlcihpbnQgbXNn dHlwZSwgdW5zaWduZWQgaW50IGxpc3R0eXBlKQo+PiDCoMKgwqDCoMKgIHJldHVybiByZXQ7Cj4+ IMKgIH0KPj4gwqAgLXN0YXRpYyBpbnQgdXBkYXRlX2xzbV9ydWxlKHN0cnVjdCBhdWRpdF9rcnVs ZSAqcikKPj4gK3N0YXRpYyBpbnQgdXBkYXRlX2xzbV9ydWxlcyhzdHJ1Y3QgYXVkaXRfa3J1bGUg KnIpCj4+IMKgIHsKPj4gwqDCoMKgwqDCoCBzdHJ1Y3QgYXVkaXRfZW50cnkgKmVudHJ5ID0gY29u dGFpbmVyX29mKHIsIHN0cnVjdCBhdWRpdF9lbnRyeSwgcnVsZSk7Cj4+IMKgwqDCoMKgwqAgc3Ry dWN0IGF1ZGl0X2VudHJ5ICpuZW50cnk7Cj4+IEBAIC0xNDI5LDcgKzE0MzAsNyBAQCBzdGF0aWMg aW50IHVwZGF0ZV9sc21fcnVsZShzdHJ1Y3QgYXVkaXRfa3J1bGUgKnIpCj4+IMKgwqDCoMKgwqAg cmV0dXJuIGVycjsKPj4gwqAgfQo+PiDCoCAtLyogVGhpcyBmdW5jdGlvbiB3aWxsIHJlLWluaXRp YWxpemUgdGhlIGxzbV9ydWxlIGZpZWxkIG9mIGFsbCBhcHBsaWNhYmxlIHJ1bGVzLgo+PiArLyog VGhpcyBmdW5jdGlvbiB3aWxsIHJlLWluaXRpYWxpemUgdGhlIGxzbV9ydWxlcyBmaWVsZCBvZiBh bGwgYXBwbGljYWJsZSBydWxlcy4KPj4gwqDCoCAqIEl0IHdpbGwgdHJhdmVyc2UgdGhlIGZpbHRl ciBsaXN0cyBzZXJhcmNoaW5nIGZvciBydWxlcyB0aGF0IGNvbnRhaW4gTFNNCj4+IMKgwqAgKiBz cGVjaWZpYyBmaWx0ZXIgZmllbGRzLsKgIFdoZW4gc3VjaCBhIHJ1bGUgaXMgZm91bmQsIGl0IGlz IGNvcGllZCwgdGhlCj4+IMKgwqAgKiBMU00gZmllbGQgaXMgcmUtaW5pdGlhbGl6ZWQsIGFuZCB0 aGUgb2xkIHJ1bGUgaXMgcmVwbGFjZWQgd2l0aCB0aGUKPj4gQEAgLTE0NDQsNyArMTQ0NSw3IEBA IGludCBhdWRpdF91cGRhdGVfbHNtX3J1bGVzKHZvaWQpCj4+IMKgIMKgwqDCoMKgwqAgZm9yIChp ID0gMDsgaSA8IEFVRElUX05SX0ZJTFRFUlM7IGkrKykgewo+PiDCoMKgwqDCoMKgwqDCoMKgwqAg bGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHIsIG4sICZhdWRpdF9ydWxlc19saXN0W2ldLCBsaXN0 KSB7Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGludCByZXMgPSB1cGRhdGVfbHNtX3J1bGUo cik7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGludCByZXMgPSB1cGRhdGVfbHNtX3J1bGVz KHIpOwo+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAoIWVycikKPj4gwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBlcnIgPSByZXM7Cj4+IMKgwqDCoMKgwqDCoMKgwqDC oCB9Cj4+IGRpZmYgLS1naXQgYS9rZXJuZWwvYXVkaXRzYy5jIGIva2VybmVsL2F1ZGl0c2MuYwo+ PiBpbmRleCBmY2U1ZDQzYTkzM2YuLmYxYzI2YTMyMmY5ZCAxMDA2NDQKPj4gLS0tIGEva2VybmVs L2F1ZGl0c2MuYwo+PiArKysgYi9rZXJuZWwvYXVkaXRzYy5jCj4+IEBAIC02NjQsNyArNjY0LDcg QEAgc3RhdGljIGludCBhdWRpdF9maWx0ZXJfcnVsZXMoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ss Cj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIG1hdGNoIGZvciBub3cgdG8gYXZv aWQgbG9zaW5nIGluZm9ybWF0aW9uIHRoYXQKPj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgbWF5IGJlIHdhbnRlZC7CoMKgIEFuIGVycm9yIG1lc3NhZ2Ugd2lsbCBhbHNvIGJlCj4+ IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGxvZ2dlZCB1cG9uIGVycm9yICovCj4+ IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlmIChmLT5sc21fcnVsZSkgewo+PiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBpZiAoZi0+bHNtX3N0cikgewo+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIGlmIChuZWVkX3NpZCkgewo+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgLyogQHRzayBzaG91bGQgYWx3YXlzIGJlIGVxdWFsIHRvCj4+IMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICogQGN1cnJlbnQgd2l0 aCB0aGUgZXhjZXB0aW9uIG9mCj4+IEBAIC02NzksOCArNjc5LDcgQEAgc3RhdGljIGludCBhdWRp dF9maWx0ZXJfcnVsZXMoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCj4+IMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBuZWVkX3NpZCA9IDA7Cj4+IMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfQo+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIHJlc3VsdCA9IHNlY3VyaXR5X2F1ZGl0X3J1bGVfbWF0Y2goc2lkLCBmLT50eXBlLAo+ PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgZi0+b3AsCj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBmLT5sc21fcnVsZSk7Cj4+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZi0+ b3AsICZmLT5sc21fcnVsZXMpOwo+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9Cj4+IMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJyZWFrOwo+PiDCoMKgwqDCoMKgwqDCoMKgwqAgY2Fz ZSBBVURJVF9PQkpfVVNFUjoKPj4gQEAgLTY5MCwyMSArNjg5LDE5IEBAIHN0YXRpYyBpbnQgYXVk aXRfZmlsdGVyX3J1bGVzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLAo+PiDCoMKgwqDCoMKgwqDC oMKgwqAgY2FzZSBBVURJVF9PQkpfTEVWX0hJR0g6Cj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIC8qIFRoZSBhYm92ZSBub3RlIGZvciBBVURJVF9TVUJKX1VTRVIuLi5BVURJVF9TVUJKX0NM Ugo+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBhbHNvIGFwcGxpZXMgaGVyZSAq Lwo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAoZi0+bHNtX3J1bGUpIHsKPj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqAgaWYgKGYtPmxzbV9zdHIpIHsKPj4gwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCAvKiBGaW5kIGZpbGVzIHRoYXQgbWF0Y2ggKi8KPj4gwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAobmFtZSkgewo+PiDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmVzdWx0ID0gc2VjdXJpdHlfYXVkaXRfcnVsZV9t YXRjaCgKPj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIG5hbWUtPm9zaWQsCj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBmLT50eXBlLAo+PiDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgZi0+b3AsCj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBmLT5sc21fcnVsZSk7Cj4+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAmZi0+bHNt X3J1bGVzKTsKPj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9IGVsc2UgaWYg KGN0eCkgewo+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbGlz dF9mb3JfZWFjaF9lbnRyeShuLCAmY3R4LT5uYW1lc19saXN0LCBsaXN0KSB7Cj4+IMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlmIChzZWN1cml0eV9h dWRpdF9ydWxlX21hdGNoKAo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbi0+b3NpZCwKPj4gLcKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGYtPnR5cGUsCj4+ IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBmLT5vcCwKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGYtPmxzbV9ydWxlKSkgewo+PiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIG4tPm9zaWQsIGYtPnR5 cGUsIGYtPm9wLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgICZmLT5sc21fcnVsZXMpKSB7Cj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKytyZXN1bHQ7Cj4+IMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYnJlYWs7 Cj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0K Pj4gQEAgLTcxNSw3ICs3MTIsNyBAQCBzdGF0aWMgaW50IGF1ZGl0X2ZpbHRlcl9ydWxlcyhzdHJ1 Y3QgdGFza19zdHJ1Y3QgKnRzaywKPj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIGJyZWFrOwo+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlm IChzZWN1cml0eV9hdWRpdF9ydWxlX21hdGNoKGN0eC0+aXBjLm9zaWQsCj4+IMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgZi0+dHlwZSwgZi0+b3AsCj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZi0+bHNtX3J1bGUpKQo+PiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgICZmLT5sc21fcnVsZXMpKQo+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgKytyZXN1bHQ7Cj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0KPj4gwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYnJlYWs7Cj4+IGRpZmYgLS1naXQgYS9zZWN1cml0eS9h cHBhcm1vci9sc20uYyBiL3NlY3VyaXR5L2FwcGFybW9yL2xzbS5jCj4+IGluZGV4IGJlODk3NmM0 MDdmNC4uMWU1M2ZlYTYxMzM1IDEwMDY0NAo+PiAtLS0gYS9zZWN1cml0eS9hcHBhcm1vci9sc20u Ywo+PiArKysgYi9zZWN1cml0eS9hcHBhcm1vci9sc20uYwo+PiBAQCAtMTE2OCw2ICsxMTY4LDEx IEBAIHN0cnVjdCBsc21fYmxvYl9zaXplcyBhcHBhcm1vcl9ibG9iX3NpemVzIF9fbHNtX3JvX2Fm dGVyX2luaXQgPSB7Cj4+IMKgwqDCoMKgwqAgLmxic19zb2NrID0gc2l6ZW9mKHN0cnVjdCBhYV9z a19jdHgpLAo+PiDCoCB9Owo+PiDCoCArc3RhdGljIHN0cnVjdCBsc21faWQgYXBwYXJtb3JfbHNt aWQgX19sc21fcm9fYWZ0ZXJfaW5pdCA9IHsKPj4gK8KgwqDCoCAubHNtwqAgPSAiYXBwYXJtb3Ii LAo+PiArwqDCoMKgIC5zbG90ID0gTFNNQkxPQl9ORUVERUQKPj4gK307Cj4+ICsKPj4gwqAgc3Rh dGljIHN0cnVjdCBzZWN1cml0eV9ob29rX2xpc3QgYXBwYXJtb3JfaG9va3NbXSBfX2xzbV9yb19h ZnRlcl9pbml0ID0gewo+PiDCoMKgwqDCoMKgIExTTV9IT09LX0lOSVQocHRyYWNlX2FjY2Vzc19j aGVjaywgYXBwYXJtb3JfcHRyYWNlX2FjY2Vzc19jaGVjayksCj4+IMKgwqDCoMKgwqAgTFNNX0hP T0tfSU5JVChwdHJhY2VfdHJhY2VtZSwgYXBwYXJtb3JfcHRyYWNlX3RyYWNlbWUpLAo+PiBAQCAt MTg1Myw3ICsxODU4LDcgQEAgc3RhdGljIGludCBfX2luaXQgYXBwYXJtb3JfaW5pdCh2b2lkKQo+ PiDCoMKgwqDCoMKgwqDCoMKgwqAgZ290byBidWZmZXJzX291dDsKPj4gwqDCoMKgwqDCoCB9Cj4+ IMKgwqDCoMKgwqAgc2VjdXJpdHlfYWRkX2hvb2tzKGFwcGFybW9yX2hvb2tzLCBBUlJBWV9TSVpF KGFwcGFybW9yX2hvb2tzKSwKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAiYXBw YXJtb3IiKTsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAmYXBwYXJtb3JfbHNt aWQpOwo+PiDCoCDCoMKgwqDCoMKgIC8qIFJlcG9ydCB0aGF0IEFwcEFybW9yIHN1Y2Nlc3NmdWxs eSBpbml0aWFsaXplZCAqLwo+PiDCoMKgwqDCoMKgIGFwcGFybW9yX2luaXRpYWxpemVkID0gMTsK Pj4gZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2JwZi9ob29rcy5jIGIvc2VjdXJpdHkvYnBmL2hvb2tz LmMKPj4gaW5kZXggZTU5NzFmYTc0ZmQ3Li43YTU4ZmU5YWI4YzQgMTAwNjQ0Cj4+IC0tLSBhL3Nl Y3VyaXR5L2JwZi9ob29rcy5jCj4+ICsrKyBiL3NlY3VyaXR5L2JwZi9ob29rcy5jCj4+IEBAIC0x NSw5ICsxNSwxOSBAQCBzdGF0aWMgc3RydWN0IHNlY3VyaXR5X2hvb2tfbGlzdCBicGZfbHNtX2hv b2tzW10gX19sc21fcm9fYWZ0ZXJfaW5pdCA9IHsKPj4gwqDCoMKgwqDCoCBMU01fSE9PS19JTklU KHRhc2tfZnJlZSwgYnBmX3Rhc2tfc3RvcmFnZV9mcmVlKSwKPj4gwqAgfTsKPj4gwqAgKy8qCj4+ ICsgKiBzbG90IGhhcyB0byBiZSBMU01CTE9CX05FRURFRCBiZWNhdXNlIHNvbWUgb2YgdGhlIGhv b2tzCj4+ICsgKiBzdXBwbGllZCBieSB0aGlzIG1vZHVsZSByZXF1aXJlIGEgc2xvdC4KPj4gKyAq Lwo+PiArc3RydWN0IGxzbV9pZCBicGZfbHNtaWQgX19sc21fcm9fYWZ0ZXJfaW5pdCA9IHsKPj4g K8KgwqDCoCAubHNtID0gImJwZiIsCj4+ICvCoMKgwqAgLnNsb3QgPSBMU01CTE9CX05FRURFRAo+ PiArfTsKPj4gKwo+PiDCoCBzdGF0aWMgaW50IF9faW5pdCBicGZfbHNtX2luaXQodm9pZCkKPj4g wqAgewo+PiAtwqDCoMKgIHNlY3VyaXR5X2FkZF9ob29rcyhicGZfbHNtX2hvb2tzLCBBUlJBWV9T SVpFKGJwZl9sc21faG9va3MpLCAiYnBmIik7Cj4+ICvCoMKgwqAgc2VjdXJpdHlfYWRkX2hvb2tz KGJwZl9sc21faG9va3MsIEFSUkFZX1NJWkUoYnBmX2xzbV9ob29rcyksCj4+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgICZicGZfbHNtaWQpOwo+PiDCoMKgwqDCoMKgIHByX2luZm8oIkxT TSBzdXBwb3J0IGZvciBlQlBGIGFjdGl2ZVxuIik7Cj4+IMKgwqDCoMKgwqAgcmV0dXJuIDA7Cj4+ IMKgIH0KPj4gZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2NvbW1vbmNhcC5jIGIvc2VjdXJpdHkvY29t bW9uY2FwLmMKPj4gaW5kZXggNWZjODk4NmMzYzc3Li5jOTRlYzQ2ZTA3YWMgMTAwNjQ0Cj4+IC0t LSBhL3NlY3VyaXR5L2NvbW1vbmNhcC5jCj4+ICsrKyBiL3NlY3VyaXR5L2NvbW1vbmNhcC5jCj4+ IEBAIC0xNDQ2LDYgKzE0NDYsMTEgQEAgaW50IGNhcF9tbWFwX2ZpbGUoc3RydWN0IGZpbGUgKmZp bGUsIHVuc2lnbmVkIGxvbmcgcmVxcHJvdCwKPj4gwqAgwqAgI2lmZGVmIENPTkZJR19TRUNVUklU WQo+PiDCoCArc3RhdGljIHN0cnVjdCBsc21faWQgY2FwYWJpbGl0eV9sc21pZCBfX2xzbV9yb19h ZnRlcl9pbml0ID0gewo+PiArwqDCoMKgIC5sc23CoCA9ICJjYXBhYmlsaXR5IiwKPj4gK8KgwqDC oCAuc2xvdCA9IExTTUJMT0JfTk9UX05FRURFRAo+PiArfTsKPj4gKwo+PiDCoCBzdGF0aWMgc3Ry dWN0IHNlY3VyaXR5X2hvb2tfbGlzdCBjYXBhYmlsaXR5X2hvb2tzW10gX19sc21fcm9fYWZ0ZXJf aW5pdCA9IHsKPj4gwqDCoMKgwqDCoCBMU01fSE9PS19JTklUKGNhcGFibGUsIGNhcF9jYXBhYmxl KSwKPj4gwqDCoMKgwqDCoCBMU01fSE9PS19JTklUKHNldHRpbWUsIGNhcF9zZXR0aW1lKSwKPj4g QEAgLTE0NzAsNyArMTQ3NSw3IEBAIHN0YXRpYyBzdHJ1Y3Qgc2VjdXJpdHlfaG9va19saXN0IGNh cGFiaWxpdHlfaG9va3NbXSBfX2xzbV9yb19hZnRlcl9pbml0ID0gewo+PiDCoCBzdGF0aWMgaW50 IF9faW5pdCBjYXBhYmlsaXR5X2luaXQodm9pZCkKPj4gwqAgewo+PiDCoMKgwqDCoMKgIHNlY3Vy aXR5X2FkZF9ob29rcyhjYXBhYmlsaXR5X2hvb2tzLCBBUlJBWV9TSVpFKGNhcGFiaWxpdHlfaG9v a3MpLAo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICJjYXBhYmlsaXR5Iik7Cj4+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICZjYXBhYmlsaXR5X2xzbWlkKTsKPj4gwqDC oMKgwqDCoCByZXR1cm4gMDsKPj4gwqAgfQo+PiDCoCBkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvbGFu ZGxvY2svY3JlZC5jIGIvc2VjdXJpdHkvbGFuZGxvY2svY3JlZC5jCj4+IGluZGV4IDY3MjVhZjI0 YzY4NC4uNTZiMTIxZDY1NDM2IDEwMDY0NAo+PiAtLS0gYS9zZWN1cml0eS9sYW5kbG9jay9jcmVk LmMKPj4gKysrIGIvc2VjdXJpdHkvbGFuZGxvY2svY3JlZC5jCj4+IEBAIC00Miw1ICs0Miw1IEBA IHN0YXRpYyBzdHJ1Y3Qgc2VjdXJpdHlfaG9va19saXN0IGxhbmRsb2NrX2hvb2tzW10gX19sc21f cm9fYWZ0ZXJfaW5pdCA9IHsKPj4gwqAgX19pbml0IHZvaWQgbGFuZGxvY2tfYWRkX2NyZWRfaG9v a3Modm9pZCkKPj4gwqAgewo+PiDCoMKgwqDCoMKgIHNlY3VyaXR5X2FkZF9ob29rcyhsYW5kbG9j a19ob29rcywgQVJSQVlfU0laRShsYW5kbG9ja19ob29rcyksCj4+IC3CoMKgwqDCoMKgwqDCoMKg wqDCoMKgIExBTkRMT0NLX05BTUUpOwo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAmbGFuZGxv Y2tfbHNtaWQpOwo+PiDCoCB9Cj4+IGRpZmYgLS1naXQgYS9zZWN1cml0eS9sYW5kbG9jay9mcy5j IGIvc2VjdXJpdHkvbGFuZGxvY2svZnMuYwo+PiBpbmRleCA5N2I4ZTQyMWY2MTcuLjMxOWU5MGU5 MjkwYyAxMDA2NDQKPj4gLS0tIGEvc2VjdXJpdHkvbGFuZGxvY2svZnMuYwo+PiArKysgYi9zZWN1 cml0eS9sYW5kbG9jay9mcy5jCj4+IEBAIC02ODgsNSArNjg4LDUgQEAgc3RhdGljIHN0cnVjdCBz ZWN1cml0eV9ob29rX2xpc3QgbGFuZGxvY2tfaG9va3NbXSBfX2xzbV9yb19hZnRlcl9pbml0ID0g ewo+PiDCoCBfX2luaXQgdm9pZCBsYW5kbG9ja19hZGRfZnNfaG9va3Modm9pZCkKPj4gwqAgewo+ PiDCoMKgwqDCoMKgIHNlY3VyaXR5X2FkZF9ob29rcyhsYW5kbG9ja19ob29rcywgQVJSQVlfU0la RShsYW5kbG9ja19ob29rcyksCj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIExBTkRMT0NLX05B TUUpOwo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAmbGFuZGxvY2tfbHNtaWQpOwo+PiDCoCB9 Cj4+IGRpZmYgLS1naXQgYS9zZWN1cml0eS9sYW5kbG9jay9wdHJhY2UuYyBiL3NlY3VyaXR5L2xh bmRsb2NrL3B0cmFjZS5jCj4+IGluZGV4IGY1NWI4MjQ0NmRlMi4uNTRjY2Y1NWEwNzdhIDEwMDY0 NAo+PiAtLS0gYS9zZWN1cml0eS9sYW5kbG9jay9wdHJhY2UuYwo+PiArKysgYi9zZWN1cml0eS9s YW5kbG9jay9wdHJhY2UuYwo+PiBAQCAtMTE2LDUgKzExNiw1IEBAIHN0YXRpYyBzdHJ1Y3Qgc2Vj dXJpdHlfaG9va19saXN0IGxhbmRsb2NrX2hvb2tzW10gX19sc21fcm9fYWZ0ZXJfaW5pdCA9IHsK Pj4gwqAgX19pbml0IHZvaWQgbGFuZGxvY2tfYWRkX3B0cmFjZV9ob29rcyh2b2lkKQo+PiDCoCB7 Cj4+IMKgwqDCoMKgwqAgc2VjdXJpdHlfYWRkX2hvb2tzKGxhbmRsb2NrX2hvb2tzLCBBUlJBWV9T SVpFKGxhbmRsb2NrX2hvb2tzKSwKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgTEFORExPQ0tf TkFNRSk7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICZsYW5kbG9ja19sc21pZCk7Cj4+IMKg IH0KPj4gZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2xhbmRsb2NrL3NldHVwLmMgYi9zZWN1cml0eS9s YW5kbG9jay9zZXR1cC5jCj4+IGluZGV4IGY4ZThlOTgwNDU0Yy4uNzU5ZTAwYjk0MzZjIDEwMDY0 NAo+PiAtLS0gYS9zZWN1cml0eS9sYW5kbG9jay9zZXR1cC5jCj4+ICsrKyBiL3NlY3VyaXR5L2xh bmRsb2NrL3NldHVwLmMKPj4gQEAgLTIzLDYgKzIzLDExIEBAIHN0cnVjdCBsc21fYmxvYl9zaXpl cyBsYW5kbG9ja19ibG9iX3NpemVzIF9fbHNtX3JvX2FmdGVyX2luaXQgPSB7Cj4+IMKgwqDCoMKg wqAgLmxic19zdXBlcmJsb2NrID0gc2l6ZW9mKHN0cnVjdCBsYW5kbG9ja19zdXBlcmJsb2NrX3Nl Y3VyaXR5KSwKPj4gwqAgfTsKPj4gwqAgK3N0cnVjdCBsc21faWQgbGFuZGxvY2tfbHNtaWQgX19s c21fcm9fYWZ0ZXJfaW5pdCA9IHsKPj4gK8KgwqDCoCAubHNtID0gTEFORExPQ0tfTkFNRSwKPj4g K8KgwqDCoCAuc2xvdCA9IExTTUJMT0JfTk9UX05FRURFRCwKPj4gK307Cj4+ICsKPj4gwqAgc3Rh dGljIGludCBfX2luaXQgbGFuZGxvY2tfaW5pdCh2b2lkKQo+PiDCoCB7Cj4+IMKgwqDCoMKgwqAg bGFuZGxvY2tfYWRkX2NyZWRfaG9va3MoKTsKPj4gZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2xhbmRs b2NrL3NldHVwLmggYi9zZWN1cml0eS9sYW5kbG9jay9zZXR1cC5oCj4+IGluZGV4IDFkYWZmYWIx YWI0Yi4uMzhiY2U1YjE3MmRjIDEwMDY0NAo+PiAtLS0gYS9zZWN1cml0eS9sYW5kbG9jay9zZXR1 cC5oCj4+ICsrKyBiL3NlY3VyaXR5L2xhbmRsb2NrL3NldHVwLmgKPj4gQEAgLTE0LDUgKzE0LDYg QEAKPj4gwqAgZXh0ZXJuIGJvb2wgbGFuZGxvY2tfaW5pdGlhbGl6ZWQ7Cj4+IMKgIMKgIGV4dGVy biBzdHJ1Y3QgbHNtX2Jsb2Jfc2l6ZXMgbGFuZGxvY2tfYmxvYl9zaXplczsKPj4gK2V4dGVybiBz dHJ1Y3QgbHNtX2lkIGxhbmRsb2NrX2xzbWlkOwo+PiDCoCDCoCAjZW5kaWYgLyogX1NFQ1VSSVRZ X0xBTkRMT0NLX1NFVFVQX0ggKi8KPj4gZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2xvYWRwaW4vbG9h ZHBpbi5jIGIvc2VjdXJpdHkvbG9hZHBpbi9sb2FkcGluLmMKPj4gaW5kZXggYjEyZjdkOTg2YjFl Li5iNTY5ZjNiYzE3MGIgMTAwNjQ0Cj4+IC0tLSBhL3NlY3VyaXR5L2xvYWRwaW4vbG9hZHBpbi5j Cj4+ICsrKyBiL3NlY3VyaXR5L2xvYWRwaW4vbG9hZHBpbi5jCj4+IEBAIC0xOTIsNiArMTkyLDEx IEBAIHN0YXRpYyBpbnQgbG9hZHBpbl9sb2FkX2RhdGEoZW51bSBrZXJuZWxfbG9hZF9kYXRhX2lk IGlkLCBib29sIGNvbnRlbnRzKQo+PiDCoMKgwqDCoMKgIHJldHVybiBsb2FkcGluX3JlYWRfZmls ZShOVUxMLCAoZW51bSBrZXJuZWxfcmVhZF9maWxlX2lkKSBpZCwgY29udGVudHMpOwo+PiDCoCB9 Cj4+IMKgICtzdGF0aWMgc3RydWN0IGxzbV9pZCBsb2FkcGluX2xzbWlkIF9fbHNtX3JvX2FmdGVy X2luaXQgPSB7Cj4+ICvCoMKgwqAgLmxzbcKgID0gImxvYWRwaW4iLAo+PiArwqDCoMKgIC5zbG90 ID0gTFNNQkxPQl9OT1RfTkVFREVECj4+ICt9Owo+PiArCj4+IMKgIHN0YXRpYyBzdHJ1Y3Qgc2Vj dXJpdHlfaG9va19saXN0IGxvYWRwaW5faG9va3NbXSBfX2xzbV9yb19hZnRlcl9pbml0ID0gewo+ PiDCoMKgwqDCoMKgIExTTV9IT09LX0lOSVQoc2JfZnJlZV9zZWN1cml0eSwgbG9hZHBpbl9zYl9m cmVlX3NlY3VyaXR5KSwKPj4gwqDCoMKgwqDCoCBMU01fSE9PS19JTklUKGtlcm5lbF9yZWFkX2Zp bGUsIGxvYWRwaW5fcmVhZF9maWxlKSwKPj4gQEAgLTIzOSw3ICsyNDQsOCBAQCBzdGF0aWMgaW50 IF9faW5pdCBsb2FkcGluX2luaXQodm9pZCkKPj4gwqDCoMKgwqDCoCBwcl9pbmZvKCJyZWFkeSB0 byBwaW4gKGN1cnJlbnRseSAlc2VuZm9yY2luZylcbiIsCj4+IMKgwqDCoMKgwqDCoMKgwqDCoCBl bmZvcmNlID8gIiIgOiAibm90ICIpOwo+PiDCoMKgwqDCoMKgIHBhcnNlX2V4Y2x1ZGUoKTsKPj4g LcKgwqDCoCBzZWN1cml0eV9hZGRfaG9va3MobG9hZHBpbl9ob29rcywgQVJSQVlfU0laRShsb2Fk cGluX2hvb2tzKSwgImxvYWRwaW4iKTsKPj4gK8KgwqDCoCBzZWN1cml0eV9hZGRfaG9va3MobG9h ZHBpbl9ob29rcywgQVJSQVlfU0laRShsb2FkcGluX2hvb2tzKSwKPj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgJmxvYWRwaW5fbHNtaWQpOwo+PiDCoMKgwqDCoMKgIHJldHVybiAwOwo+ PiDCoCB9Cj4+IMKgIGRpZmYgLS1naXQgYS9zZWN1cml0eS9sb2NrZG93bi9sb2NrZG93bi5jIGIv c2VjdXJpdHkvbG9ja2Rvd24vbG9ja2Rvd24uYwo+PiBpbmRleCA4N2NiZGM2NGQyNzIuLjRlMjRl YTNmN2I3ZSAxMDA2NDQKPj4gLS0tIGEvc2VjdXJpdHkvbG9ja2Rvd24vbG9ja2Rvd24uYwo+PiAr KysgYi9zZWN1cml0eS9sb2NrZG93bi9sb2NrZG93bi5jCj4+IEBAIC03NSw2ICs3NSwxMSBAQCBz dGF0aWMgc3RydWN0IHNlY3VyaXR5X2hvb2tfbGlzdCBsb2NrZG93bl9ob29rc1tdIF9fbHNtX3Jv X2FmdGVyX2luaXQgPSB7Cj4+IMKgwqDCoMKgwqAgTFNNX0hPT0tfSU5JVChsb2NrZWRfZG93biwg bG9ja2Rvd25faXNfbG9ja2VkX2Rvd24pLAo+PiDCoCB9Owo+PiDCoCArc3RhdGljIHN0cnVjdCBs c21faWQgbG9ja2Rvd25fbHNtaWQgX19sc21fcm9fYWZ0ZXJfaW5pdCA9IHsKPj4gK8KgwqDCoCAu bHNtID0gImxvY2tkb3duIiwKPj4gK8KgwqDCoCAuc2xvdCA9IExTTUJMT0JfTk9UX05FRURFRAo+ PiArfTsKPj4gKwo+PiDCoCBzdGF0aWMgaW50IF9faW5pdCBsb2NrZG93bl9sc21faW5pdCh2b2lk KQo+PiDCoCB7Cj4+IMKgICNpZiBkZWZpbmVkKENPTkZJR19MT0NLX0RPV05fS0VSTkVMX0ZPUkNF X0lOVEVHUklUWSkKPj4gQEAgLTgzLDcgKzg4LDcgQEAgc3RhdGljIGludCBfX2luaXQgbG9ja2Rv d25fbHNtX2luaXQodm9pZCkKPj4gwqDCoMKgwqDCoCBsb2NrX2tlcm5lbF9kb3duKCJLZXJuZWwg Y29uZmlndXJhdGlvbiIsIExPQ0tET1dOX0NPTkZJREVOVElBTElUWV9NQVgpOwo+PiDCoCAjZW5k aWYKPj4gwqDCoMKgwqDCoCBzZWN1cml0eV9hZGRfaG9va3MobG9ja2Rvd25faG9va3MsIEFSUkFZ X1NJWkUobG9ja2Rvd25faG9va3MpLAo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAi bG9ja2Rvd24iKTsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgJmxvY2tkb3duX2xz bWlkKTsKPj4gwqDCoMKgwqDCoCByZXR1cm4gMDsKPj4gwqAgfQo+PiDCoCBkaWZmIC0tZ2l0IGEv c2VjdXJpdHkvc2FmZXNldGlkL2xzbS5jIGIvc2VjdXJpdHkvc2FmZXNldGlkL2xzbS5jCj4+IGlu ZGV4IDk2M2Y0YWQ5Y2I2Ni4uMGMzNjg5NTBkYzE0IDEwMDY0NAo+PiAtLS0gYS9zZWN1cml0eS9z YWZlc2V0aWQvbHNtLmMKPj4gKysrIGIvc2VjdXJpdHkvc2FmZXNldGlkL2xzbS5jCj4+IEBAIC0y NDEsNiArMjQxLDExIEBAIHN0YXRpYyBpbnQgc2FmZXNldGlkX3Rhc2tfZml4X3NldGdpZChzdHJ1 Y3QgY3JlZCAqbmV3LAo+PiDCoMKgwqDCoMKgIHJldHVybiAtRUFDQ0VTOwo+PiDCoCB9Cj4+IMKg ICtzdGF0aWMgc3RydWN0IGxzbV9pZCBzYWZlc2V0aWRfbHNtaWQgX19sc21fcm9fYWZ0ZXJfaW5p dCA9IHsKPj4gK8KgwqDCoCAubHNtwqAgPSAic2FmZXNldGlkIiwKPj4gK8KgwqDCoCAuc2xvdCA9 IExTTUJMT0JfTk9UX05FRURFRAo+PiArfTsKPj4gKwo+PiDCoCBzdGF0aWMgc3RydWN0IHNlY3Vy aXR5X2hvb2tfbGlzdCBzYWZlc2V0aWRfc2VjdXJpdHlfaG9va3NbXSA9IHsKPj4gwqDCoMKgwqDC oCBMU01fSE9PS19JTklUKHRhc2tfZml4X3NldHVpZCwgc2FmZXNldGlkX3Rhc2tfZml4X3NldHVp ZCksCj4+IMKgwqDCoMKgwqAgTFNNX0hPT0tfSU5JVCh0YXNrX2ZpeF9zZXRnaWQsIHNhZmVzZXRp ZF90YXNrX2ZpeF9zZXRnaWQpLAo+PiBAQCAtMjUwLDcgKzI1NSw4IEBAIHN0YXRpYyBzdHJ1Y3Qg c2VjdXJpdHlfaG9va19saXN0IHNhZmVzZXRpZF9zZWN1cml0eV9ob29rc1tdID0gewo+PiDCoCBz dGF0aWMgaW50IF9faW5pdCBzYWZlc2V0aWRfc2VjdXJpdHlfaW5pdCh2b2lkKQo+PiDCoCB7Cj4+ IMKgwqDCoMKgwqAgc2VjdXJpdHlfYWRkX2hvb2tzKHNhZmVzZXRpZF9zZWN1cml0eV9ob29rcywK Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgQVJSQVlfU0laRShzYWZlc2V0aWRfc2Vj dXJpdHlfaG9va3MpLCAic2FmZXNldGlkIik7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIEFSUkFZX1NJWkUoc2FmZXNldGlkX3NlY3VyaXR5X2hvb2tzKSwKPj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgJnNhZmVzZXRpZF9sc21pZCk7Cj4+IMKgIMKgwqDCoMKgwqAgLyog UmVwb3J0IHRoYXQgU2FmZVNldElEIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZCAqLwo+PiDCoMKg wqDCoMKgIHNhZmVzZXRpZF9pbml0aWFsaXplZCA9IDE7Cj4+IGRpZmYgLS1naXQgYS9zZWN1cml0 eS9zZWN1cml0eS5jIGIvc2VjdXJpdHkvc2VjdXJpdHkuYwo+PiBpbmRleCBmMmQ0YjIwNjEzYzgu LjJiZjIxYzcyNmJhMCAxMDA2NDQKPj4gLS0tIGEvc2VjdXJpdHkvc2VjdXJpdHkuYwo+PiArKysg Yi9zZWN1cml0eS9zZWN1cml0eS5jCj4+IEBAIC0zNDUsNiArMzQ1LDcgQEAgc3RhdGljIHZvaWQg X19pbml0IG9yZGVyZWRfbHNtX2luaXQodm9pZCkKPj4gwqDCoMKgwqDCoCBpbml0X2RlYnVnKCJz b2NrIGJsb2Igc2l6ZcKgwqDCoMKgwqDCoCA9ICVkXG4iLCBibG9iX3NpemVzLmxic19zb2NrKTsK Pj4gwqDCoMKgwqDCoCBpbml0X2RlYnVnKCJzdXBlcmJsb2NrIGJsb2Igc2l6ZSA9ICVkXG4iLCBi bG9iX3NpemVzLmxic19zdXBlcmJsb2NrKTsKPj4gwqDCoMKgwqDCoCBpbml0X2RlYnVnKCJ0YXNr IGJsb2Igc2l6ZcKgwqDCoMKgwqDCoCA9ICVkXG4iLCBibG9iX3NpemVzLmxic190YXNrKTsKPj4g K8KgwqDCoCBpbml0X2RlYnVnKCJsc21ibG9iIHNpemXCoMKgwqDCoMKgwqDCoMKgID0gJXp1XG4i LCBzaXplb2Yoc3RydWN0IGxzbWJsb2IpKTsKPj4gwqAgwqDCoMKgwqDCoCAvKgo+PiDCoMKgwqDC oMKgwqAgKiBDcmVhdGUgYW55IGttZW1fY2FjaGVzIG5lZWRlZCBmb3IgYmxvYnMKPj4gQEAgLTQ3 MiwyMSArNDczLDM4IEBAIHN0YXRpYyBpbnQgbHNtX2FwcGVuZChjb25zdCBjaGFyICpuZXcsIGNo YXIgKipyZXN1bHQpCj4+IMKgwqDCoMKgwqAgcmV0dXJuIDA7Cj4+IMKgIH0KPj4gwqAgKy8qCj4+ ICsgKiBDdXJyZW50IGluZGV4IHRvIHVzZSB3aGlsZSBpbml0aWFsaXppbmcgdGhlIGxzbWJsb2Ig c2VjaWQgbGlzdC4KPj4gKyAqLwo+PiArc3RhdGljIGludCBsc21fc2xvdCBfX2xzbV9yb19hZnRl cl9pbml0Owo+PiArCj4+IMKgIC8qKgo+PiDCoMKgICogc2VjdXJpdHlfYWRkX2hvb2tzIC0gQWRk IGEgbW9kdWxlcyBob29rcyB0byB0aGUgaG9vayBsaXN0cy4KPj4gwqDCoCAqIEBob29rczogdGhl IGhvb2tzIHRvIGFkZAo+PiDCoMKgICogQGNvdW50OiB0aGUgbnVtYmVyIG9mIGhvb2tzIHRvIGFk ZAo+PiAtICogQGxzbTogdGhlIG5hbWUgb2YgdGhlIHNlY3VyaXR5IG1vZHVsZQo+PiArICogQGxz bWlkOiB0aGUgaWRlbnRpZmljYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzZWN1cml0eSBtb2R1 bGUKPj4gwqDCoCAqCj4+IMKgwqAgKiBFYWNoIExTTSBoYXMgdG8gcmVnaXN0ZXIgaXRzIGhvb2tz IHdpdGggdGhlIGluZnJhc3RydWN0dXJlLgo+PiArICogSWYgdGhlIExTTSBpcyB1c2luZyBob29r cyB0aGF0IGV4cG9ydCBzZWNpZHMgYWxsb2NhdGUgYSBzbG90Cj4+ICsgKiBmb3IgaXQgaW4gdGhl IGxzbWJsb2IuCj4+IMKgwqAgKi8KPj4gwqAgdm9pZCBfX2luaXQgc2VjdXJpdHlfYWRkX2hvb2tz KHN0cnVjdCBzZWN1cml0eV9ob29rX2xpc3QgKmhvb2tzLCBpbnQgY291bnQsCj4+IC3CoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY2hhciAqbHNtKQo+PiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIHN0cnVjdCBsc21faWQgKmxzbWlkKQo+PiDCoCB7Cj4+IMKgwqDC oMKgwqAgaW50IGk7Cj4+IMKgICvCoMKgwqAgV0FSTl9PTighbHNtaWQtPnNsb3QgfHwgIWxzbWlk LT5sc20pOwo+PiArCj4+ICvCoMKgwqAgaWYgKGxzbWlkLT5zbG90ID09IExTTUJMT0JfTkVFREVE KSB7Cj4+ICvCoMKgwqDCoMKgwqDCoCBpZiAobHNtX3Nsb3QgPj0gTFNNQkxPQl9FTlRSSUVTKQo+ PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwYW5pYygiJXMgVG9vIG1hbnkgTFNNcyByZWdpc3Rl cmVkLlxuIiwgX19mdW5jX18pOwo+PiArwqDCoMKgwqDCoMKgwqAgbHNtaWQtPnNsb3QgPSBsc21f c2xvdCsrOwo+PiArwqDCoMKgwqDCoMKgwqAgaW5pdF9kZWJ1ZygiJXMgYXNzaWduZWQgbHNtYmxv YiBzbG90ICVkXG4iLCBsc21pZC0+bHNtLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBsc21pZC0+c2xvdCk7Cj4+ICvCoMKgwqAgfQo+PiArCj4+IMKgwqDCoMKgwqAgZm9yIChpID0g MDsgaSA8IGNvdW50OyBpKyspIHsKPj4gLcKgwqDCoMKgwqDCoMKgIGhvb2tzW2ldLmxzbSA9IGxz bTsKPj4gK8KgwqDCoMKgwqDCoMKgIGhvb2tzW2ldLmxzbWlkID0gbHNtaWQ7Cj4+IMKgwqDCoMKg wqDCoMKgwqDCoCBobGlzdF9hZGRfdGFpbF9yY3UoJmhvb2tzW2ldLmxpc3QsIGhvb2tzW2ldLmhl YWQpOwo+PiDCoMKgwqDCoMKgIH0KPj4gwqAgQEAgLTQ5NSw3ICs1MTMsNyBAQCB2b2lkIF9faW5p dCBzZWN1cml0eV9hZGRfaG9va3Moc3RydWN0IHNlY3VyaXR5X2hvb2tfbGlzdCAqaG9va3MsIGlu dCBjb3VudCwKPj4gwqDCoMKgwqDCoMKgICogYW5kIGZpeCB0aGlzIHVwIGFmdGVyd2FyZHMuCj4+ IMKgwqDCoMKgwqDCoCAqLwo+PiDCoMKgwqDCoMKgIGlmIChzbGFiX2lzX2F2YWlsYWJsZSgpKSB7 Cj4+IC3CoMKgwqDCoMKgwqDCoCBpZiAobHNtX2FwcGVuZChsc20sICZsc21fbmFtZXMpIDwgMCkK Pj4gK8KgwqDCoMKgwqDCoMKgIGlmIChsc21fYXBwZW5kKGxzbWlkLT5sc20sICZsc21fbmFtZXMp IDwgMCkKPj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcGFuaWMoIiVzIC0gQ2Fubm90IGdl dCBlYXJseSBtZW1vcnkuXG4iLCBfX2Z1bmNfXyk7Cj4+IMKgwqDCoMKgwqAgfQo+PiDCoCB9Cj4+ IEBAIC0yMDc1LDcgKzIwOTMsNyBAQCBpbnQgc2VjdXJpdHlfZ2V0cHJvY2F0dHIoc3RydWN0IHRh c2tfc3RydWN0ICpwLCBjb25zdCBjaGFyICpsc20sIGNoYXIgKm5hbWUsCj4+IMKgwqDCoMKgwqAg c3RydWN0IHNlY3VyaXR5X2hvb2tfbGlzdCAqaHA7Cj4+IMKgIMKgwqDCoMKgwqAgaGxpc3RfZm9y X2VhY2hfZW50cnkoaHAsICZzZWN1cml0eV9ob29rX2hlYWRzLmdldHByb2NhdHRyLCBsaXN0KSB7 Cj4+IC3CoMKgwqDCoMKgwqDCoCBpZiAobHNtICE9IE5VTEwgJiYgc3RyY21wKGxzbSwgaHAtPmxz bSkpCj4+ICvCoMKgwqDCoMKgwqDCoCBpZiAobHNtICE9IE5VTEwgJiYgc3RyY21wKGxzbSwgaHAt PmxzbWlkLT5sc20pKQo+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjb250aW51ZTsKPj4g wqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiBocC0+aG9vay5nZXRwcm9jYXR0cihwLCBuYW1lLCB2 YWx1ZSk7Cj4+IMKgwqDCoMKgwqAgfQo+PiBAQCAtMjA4OCw3ICsyMTA2LDcgQEAgaW50IHNlY3Vy aXR5X3NldHByb2NhdHRyKGNvbnN0IGNoYXIgKmxzbSwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAq dmFsdWUsCj4+IMKgwqDCoMKgwqAgc3RydWN0IHNlY3VyaXR5X2hvb2tfbGlzdCAqaHA7Cj4+IMKg IMKgwqDCoMKgwqAgaGxpc3RfZm9yX2VhY2hfZW50cnkoaHAsICZzZWN1cml0eV9ob29rX2hlYWRz LnNldHByb2NhdHRyLCBsaXN0KSB7Cj4+IC3CoMKgwqDCoMKgwqDCoCBpZiAobHNtICE9IE5VTEwg JiYgc3RyY21wKGxzbSwgaHAtPmxzbSkpCj4+ICvCoMKgwqDCoMKgwqDCoCBpZiAobHNtICE9IE5V TEwgJiYgc3RyY21wKGxzbSwgaHAtPmxzbWlkLT5sc20pKQo+PiDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBjb250aW51ZTsKPj4gwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiBocC0+aG9vay5z ZXRwcm9jYXR0cihuYW1lLCB2YWx1ZSwgc2l6ZSk7Cj4+IMKgwqDCoMKgwqAgfQo+PiBAQCAtMjU3 OSw5ICsyNTk3LDI3IEBAIGludCBzZWN1cml0eV9rZXlfZ2V0c2VjdXJpdHkoc3RydWN0IGtleSAq a2V5LCBjaGFyICoqX2J1ZmZlcikKPj4gwqAgwqAgI2lmZGVmIENPTkZJR19BVURJVAo+PiDCoCAt aW50IHNlY3VyaXR5X2F1ZGl0X3J1bGVfaW5pdCh1MzIgZmllbGQsIHUzMiBvcCwgY2hhciAqcnVs ZXN0ciwgdm9pZCAqKmxzbXJ1bGUpCj4+ICtpbnQgc2VjdXJpdHlfYXVkaXRfcnVsZV9pbml0KHUz MiBmaWVsZCwgdTMyIG9wLCBjaGFyICpydWxlc3RyLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgc3RydWN0IGF1ZGl0X2xzbV9ydWxlcyAqbHNtcnVsZXMpCj4+IMKgIHsKPj4g LcKgwqDCoCByZXR1cm4gY2FsbF9pbnRfaG9vayhhdWRpdF9ydWxlX2luaXQsIDAsIGZpZWxkLCBv cCwgcnVsZXN0ciwgbHNtcnVsZSk7Cj4+ICvCoMKgwqAgc3RydWN0IHNlY3VyaXR5X2hvb2tfbGlz dCAqaHA7Cj4+ICvCoMKgwqAgYm9vbCBvbmVfaXNfZ29vZCA9IGZhbHNlOwo+PiArwqDCoMKgIGlu dCByYyA9IDA7Cj4+ICvCoMKgwqAgaW50IHRyYzsKPj4gKwo+PiArwqDCoMKgIGhsaXN0X2Zvcl9l YWNoX2VudHJ5KGhwLCAmc2VjdXJpdHlfaG9va19oZWFkcy5hdWRpdF9ydWxlX2luaXQsIGxpc3Qp IHsKPj4gK8KgwqDCoMKgwqDCoMKgIGlmIChXQVJOX09OKGhwLT5sc21pZC0+c2xvdCA8IDAgfHwg aHAtPmxzbWlkLT5zbG90ID49IGxzbV9zbG90KSkKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAg Y29udGludWU7Cj4+ICvCoMKgwqDCoMKgwqDCoCB0cmMgPSBocC0+aG9vay5hdWRpdF9ydWxlX2lu aXQoZmllbGQsIG9wLCBydWxlc3RyLAo+PiArICZsc21ydWxlcy0+cnVsZVtocC0+bHNtaWQtPnNs b3RdKTsKPj4gK8KgwqDCoMKgwqDCoMKgIGlmICh0cmMgPT0gMCkKPj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqAgb25lX2lzX2dvb2QgPSB0cnVlOwo+PiArwqDCoMKgwqDCoMKgwqAgZWxzZQo+PiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByYyA9IHRyYzsKPj4gK8KgwqDCoCB9Cj4+ICvCoMKgwqAg aWYgKG9uZV9pc19nb29kKQo+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIDA7Cj4+ICvCoMKgwqAg cmV0dXJuIHJjOwo+PiDCoCB9Cj4+IMKgIMKgIGludCBzZWN1cml0eV9hdWRpdF9ydWxlX2tub3du KHN0cnVjdCBhdWRpdF9rcnVsZSAqa3J1bGUpCj4+IEBAIC0yNTg5LDE0ICsyNjI1LDM2IEBAIGlu dCBzZWN1cml0eV9hdWRpdF9ydWxlX2tub3duKHN0cnVjdCBhdWRpdF9rcnVsZSAqa3J1bGUpCj4+ IMKgwqDCoMKgwqAgcmV0dXJuIGNhbGxfaW50X2hvb2soYXVkaXRfcnVsZV9rbm93biwgMCwga3J1 bGUpOwo+PiDCoCB9Cj4+IMKgIC12b2lkIHNlY3VyaXR5X2F1ZGl0X3J1bGVfZnJlZSh2b2lkICps c21ydWxlKQo+PiArdm9pZCBzZWN1cml0eV9hdWRpdF9ydWxlX2ZyZWUoc3RydWN0IGF1ZGl0X2xz bV9ydWxlcyAqbHNtcnVsZXMpCj4+IMKgIHsKPj4gLcKgwqDCoCBjYWxsX3ZvaWRfaG9vayhhdWRp dF9ydWxlX2ZyZWUsIGxzbXJ1bGUpOwo+PiArwqDCoMKgIHN0cnVjdCBzZWN1cml0eV9ob29rX2xp c3QgKmhwOwo+PiArCj4+ICvCoMKgwqAgaGxpc3RfZm9yX2VhY2hfZW50cnkoaHAsICZzZWN1cml0 eV9ob29rX2hlYWRzLmF1ZGl0X3J1bGVfZnJlZSwgbGlzdCkgewo+PiArwqDCoMKgwqDCoMKgwqAg aWYgKFdBUk5fT04oaHAtPmxzbWlkLT5zbG90IDwgMCB8fCBocC0+bHNtaWQtPnNsb3QgPj0gbHNt X3Nsb3QpKQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjb250aW51ZTsKPj4gK8KgwqDCoMKg wqDCoMKgIGlmIChsc21ydWxlcy0+cnVsZVtocC0+bHNtaWQtPnNsb3RdID09IE5VTEwpCj4+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNvbnRpbnVlOwo+PiArIGhwLT5ob29rLmF1ZGl0X3J1bGVf ZnJlZShsc21ydWxlcy0+cnVsZVtocC0+bHNtaWQtPnNsb3RdKTsKPj4gK8KgwqDCoCB9Cj4+IMKg IH0KPj4gwqAgLWludCBzZWN1cml0eV9hdWRpdF9ydWxlX21hdGNoKHUzMiBzZWNpZCwgdTMyIGZp ZWxkLCB1MzIgb3AsIHZvaWQgKmxzbXJ1bGUpCj4+ICtpbnQgc2VjdXJpdHlfYXVkaXRfcnVsZV9t YXRjaCh1MzIgc2VjaWQsIHUzMiBmaWVsZCwgdTMyIG9wLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBzdHJ1Y3QgYXVkaXRfbHNtX3J1bGVzICpsc21ydWxlcykKPj4gwqAg ewo+PiAtwqDCoMKgIHJldHVybiBjYWxsX2ludF9ob29rKGF1ZGl0X3J1bGVfbWF0Y2gsIDAsIHNl Y2lkLCBmaWVsZCwgb3AsIGxzbXJ1bGUpOwo+PiArwqDCoMKgIHN0cnVjdCBzZWN1cml0eV9ob29r X2xpc3QgKmhwOwo+PiArwqDCoMKgIGludCByYzsKPj4gKwo+PiArwqDCoMKgIGhsaXN0X2Zvcl9l YWNoX2VudHJ5KGhwLCAmc2VjdXJpdHlfaG9va19oZWFkcy5hdWRpdF9ydWxlX21hdGNoLCBsaXN0 KSB7Cj4+ICvCoMKgwqDCoMKgwqDCoCBpZiAoV0FSTl9PTihocC0+bHNtaWQtPnNsb3QgPCAwIHx8 IGhwLT5sc21pZC0+c2xvdCA+PSBsc21fc2xvdCkpCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IGNvbnRpbnVlOwo+PiArwqDCoMKgwqDCoMKgwqAgaWYgKGxzbXJ1bGVzLT5ydWxlW2hwLT5sc21p ZC0+c2xvdF0gPT0gTlVMTCkKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY29udGludWU7Cj4+ ICvCoMKgwqDCoMKgwqDCoCByYyA9IGhwLT5ob29rLmF1ZGl0X3J1bGVfbWF0Y2goc2VjaWQsIGZp ZWxkLCBvcCwKPj4gKyAmbHNtcnVsZXMtPnJ1bGVbaHAtPmxzbWlkLT5zbG90XSk7Cj4+ICvCoMKg wqDCoMKgwqDCoCBpZiAocmMpCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiByYzsK Pj4gK8KgwqDCoCB9Cj4+ICvCoMKgwqAgcmV0dXJuIDA7Cj4+IMKgIH0KPj4gwqAgI2VuZGlmIC8q IENPTkZJR19BVURJVCAqLwo+PiDCoCBkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9ob29r cy5jIGIvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jCj4+IGluZGV4IGRmZmRlNDBkMzY3ZS4uZDY3 YmNkMWFlYWY1IDEwMDY0NAo+PiAtLS0gYS9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMKPj4gKysr IGIvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jCj4+IEBAIC03MDA5LDYgKzcwMDksMTEgQEAgc3Rh dGljIGludCBzZWxpbnV4X3VyaW5nX3NxcG9sbCh2b2lkKQo+PiDCoCB9Cj4+IMKgICNlbmRpZiAv KiBDT05GSUdfSU9fVVJJTkcgKi8KPj4gwqAgK3N0YXRpYyBzdHJ1Y3QgbHNtX2lkIHNlbGludXhf bHNtaWQgX19sc21fcm9fYWZ0ZXJfaW5pdCA9IHsKPj4gK8KgwqDCoCAubHNtwqAgPSAic2VsaW51 eCIsCj4+ICvCoMKgwqAgLnNsb3QgPSBMU01CTE9CX05FRURFRAo+PiArfTsKPj4gKwo+PiDCoCAv Kgo+PiDCoMKgICogSU1QT1JUQU5UIE5PVEU6IFdoZW4gYWRkaW5nIG5ldyBob29rcywgcGxlYXNl IGJlIGNhcmVmdWwgdG8ga2VlcCB0aGlzIG9yZGVyOgo+PiDCoMKgICogMS4gYW55IGhvb2tzIHRo YXQgZG9uJ3QgYmVsb25nIHRvICgyLikgb3IgKDMuKSBiZWxvdywKPj4gQEAgLTczMjQsNyArNzMy OSw4IEBAIHN0YXRpYyBfX2luaXQgaW50IHNlbGludXhfaW5pdCh2b2lkKQo+PiDCoCDCoMKgwqDC oMKgIGhhc2h0YWJfY2FjaGVfaW5pdCgpOwo+PiDCoCAtwqDCoMKgIHNlY3VyaXR5X2FkZF9ob29r cyhzZWxpbnV4X2hvb2tzLCBBUlJBWV9TSVpFKHNlbGludXhfaG9va3MpLCAic2VsaW51eCIpOwo+ PiArwqDCoMKgIHNlY3VyaXR5X2FkZF9ob29rcyhzZWxpbnV4X2hvb2tzLCBBUlJBWV9TSVpFKHNl bGludXhfaG9va3MpLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAmc2VsaW51eF9s c21pZCk7Cj4+IMKgIMKgwqDCoMKgwqAgaWYgKGF2Y19hZGRfY2FsbGJhY2soc2VsaW51eF9uZXRj YWNoZV9hdmNfY2FsbGJhY2ssIEFWQ19DQUxMQkFDS19SRVNFVCkpCj4+IMKgwqDCoMKgwqDCoMKg wqDCoCBwYW5pYygiU0VMaW51eDogVW5hYmxlIHRvIHJlZ2lzdGVyIEFWQyBuZXRjYWNoZSBjYWxs YmFja1xuIik7Cj4+IGRpZmYgLS1naXQgYS9zZWN1cml0eS9zbWFjay9zbWFja19sc20uYyBiL3Nl Y3VyaXR5L3NtYWNrL3NtYWNrX2xzbS5jCj4+IGluZGV4IGQ1OGI1MDAwNmU3OS4uZmY4MzJkNDc0 NzlmIDEwMDY0NAo+PiAtLS0gYS9zZWN1cml0eS9zbWFjay9zbWFja19sc20uYwo+PiArKysgYi9z ZWN1cml0eS9zbWFjay9zbWFja19sc20uYwo+PiBAQCAtNDc0NCw2ICs0NzQ0LDExIEBAIHN0cnVj dCBsc21fYmxvYl9zaXplcyBzbWFja19ibG9iX3NpemVzIF9fbHNtX3JvX2FmdGVyX2luaXQgPSB7 Cj4+IMKgwqDCoMKgwqAgLmxic19zdXBlcmJsb2NrID0gc2l6ZW9mKHN0cnVjdCBzdXBlcmJsb2Nr X3NtYWNrKSwKPj4gwqAgfTsKPj4gwqAgK3N0YXRpYyBzdHJ1Y3QgbHNtX2lkIHNtYWNrX2xzbWlk IF9fbHNtX3JvX2FmdGVyX2luaXQgPSB7Cj4+ICvCoMKgwqAgLmxzbcKgID0gInNtYWNrIiwKPj4g K8KgwqDCoCAuc2xvdCA9IExTTUJMT0JfTkVFREVECj4+ICt9Owo+PiArCj4+IMKgIHN0YXRpYyBz dHJ1Y3Qgc2VjdXJpdHlfaG9va19saXN0IHNtYWNrX2hvb2tzW10gX19sc21fcm9fYWZ0ZXJfaW5p dCA9IHsKPj4gwqDCoMKgwqDCoCBMU01fSE9PS19JTklUKHB0cmFjZV9hY2Nlc3NfY2hlY2ssIHNt YWNrX3B0cmFjZV9hY2Nlc3NfY2hlY2spLAo+PiDCoMKgwqDCoMKgIExTTV9IT09LX0lOSVQocHRy YWNlX3RyYWNlbWUsIHNtYWNrX3B0cmFjZV90cmFjZW1lKSwKPj4gQEAgLTQ5NDcsNyArNDk1Miw3 IEBAIHN0YXRpYyBfX2luaXQgaW50IHNtYWNrX2luaXQodm9pZCkKPj4gwqDCoMKgwqDCoCAvKgo+ PiDCoMKgwqDCoMKgwqAgKiBSZWdpc3RlciB3aXRoIExTTQo+PiDCoMKgwqDCoMKgwqAgKi8KPj4g LcKgwqDCoCBzZWN1cml0eV9hZGRfaG9va3Moc21hY2tfaG9va3MsIEFSUkFZX1NJWkUoc21hY2tf aG9va3MpLCAic21hY2siKTsKPj4gK8KgwqDCoCBzZWN1cml0eV9hZGRfaG9va3Moc21hY2tfaG9v a3MsIEFSUkFZX1NJWkUoc21hY2tfaG9va3MpLCAmc21hY2tfbHNtaWQpOwo+PiDCoMKgwqDCoMKg IHNtYWNrX2VuYWJsZWQgPSAxOwo+PiDCoCDCoMKgwqDCoMKgIHByX2luZm8oIlNtYWNrOsKgIElu aXRpYWxpemluZy5cbiIpOwo+PiBkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvdG9tb3lvL3RvbW95by5j IGIvc2VjdXJpdHkvdG9tb3lvL3RvbW95by5jCj4+IGluZGV4IGI2YTMxOTAxZjI4OS4uZThmNmJi OTc4MmMxIDEwMDY0NAo+PiAtLS0gYS9zZWN1cml0eS90b21veW8vdG9tb3lvLmMKPj4gKysrIGIv c2VjdXJpdHkvdG9tb3lvL3RvbW95by5jCj4+IEBAIC01MjEsNiArNTIxLDExIEBAIHN0YXRpYyB2 b2lkIHRvbW95b190YXNrX2ZyZWUoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQo+PiDCoMKgwqDC oMKgIH0KPj4gwqAgfQo+PiDCoCArc3RhdGljIHN0cnVjdCBsc21faWQgdG9tb3lvX2xzbWlkIF9f bHNtX3JvX2FmdGVyX2luaXQgPSB7Cj4+ICvCoMKgwqAgLmxzbcKgID0gInRvbW95byIsCj4+ICvC oMKgwqAgLnNsb3QgPSBMU01CTE9CX05PVF9ORUVERUQKPj4gK307Cj4+ICsKPj4gwqAgLyoKPj4g wqDCoCAqIHRvbW95b19zZWN1cml0eV9vcHMgaXMgYSAic3RydWN0IHNlY3VyaXR5X29wZXJhdGlv bnMiIHdoaWNoIGlzIHVzZWQgZm9yCj4+IMKgwqAgKiByZWdpc3RlcmluZyBUT01PWU8uCj4+IEBA IC01NzMsNyArNTc4LDggQEAgc3RhdGljIGludCBfX2luaXQgdG9tb3lvX2luaXQodm9pZCkKPj4g wqDCoMKgwqDCoCBzdHJ1Y3QgdG9tb3lvX3Rhc2sgKnMgPSB0b21veW9fdGFzayhjdXJyZW50KTsK Pj4gwqAgwqDCoMKgwqDCoCAvKiByZWdpc3RlciBvdXJzZWx2ZXMgd2l0aCB0aGUgc2VjdXJpdHkg ZnJhbWV3b3JrICovCj4+IC3CoMKgwqAgc2VjdXJpdHlfYWRkX2hvb2tzKHRvbW95b19ob29rcywg QVJSQVlfU0laRSh0b21veW9faG9va3MpLCAidG9tb3lvIik7Cj4+ICvCoMKgwqAgc2VjdXJpdHlf YWRkX2hvb2tzKHRvbW95b19ob29rcywgQVJSQVlfU0laRSh0b21veW9faG9va3MpLAo+PiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAmdG9tb3lvX2xzbWlkKTsKPj4gwqDCoMKgwqDCoCBw cl9pbmZvKCJUT01PWU8gTGludXggaW5pdGlhbGl6ZWRcbiIpOwo+PiDCoMKgwqDCoMKgIHMtPmRv bWFpbl9pbmZvID0gJnRvbW95b19rZXJuZWxfZG9tYWluOwo+PiDCoMKgwqDCoMKgIGF0b21pY19p bmMoJnRvbW95b19rZXJuZWxfZG9tYWluLnVzZXJzKTsKPj4gZGlmZiAtLWdpdCBhL3NlY3VyaXR5 L3lhbWEveWFtYV9sc20uYyBiL3NlY3VyaXR5L3lhbWEveWFtYV9sc20uYwo+PiBpbmRleCAwNmUy MjYxNjZhYWIuLmE5NjM5ZWE1NDFmNyAxMDA2NDQKPj4gLS0tIGEvc2VjdXJpdHkveWFtYS95YW1h X2xzbS5jCj4+ICsrKyBiL3NlY3VyaXR5L3lhbWEveWFtYV9sc20uYwo+PiBAQCAtNDIxLDYgKzQy MSwxMSBAQCBzdGF0aWMgaW50IHlhbWFfcHRyYWNlX3RyYWNlbWUoc3RydWN0IHRhc2tfc3RydWN0 ICpwYXJlbnQpCj4+IMKgwqDCoMKgwqAgcmV0dXJuIHJjOwo+PiDCoCB9Cj4+IMKgICtzdGF0aWMg c3RydWN0IGxzbV9pZCB5YW1hX2xzbWlkIF9fbHNtX3JvX2FmdGVyX2luaXQgPSB7Cj4+ICvCoMKg wqAgLmxzbcKgID0gInlhbWEiLAo+PiArwqDCoMKgIC5zbG90ID0gTFNNQkxPQl9OT1RfTkVFREVE Cj4+ICt9Owo+PiArCj4+IMKgIHN0YXRpYyBzdHJ1Y3Qgc2VjdXJpdHlfaG9va19saXN0IHlhbWFf aG9va3NbXSBfX2xzbV9yb19hZnRlcl9pbml0ID0gewo+PiDCoMKgwqDCoMKgIExTTV9IT09LX0lO SVQocHRyYWNlX2FjY2Vzc19jaGVjaywgeWFtYV9wdHJhY2VfYWNjZXNzX2NoZWNrKSwKPj4gwqDC oMKgwqDCoCBMU01fSE9PS19JTklUKHB0cmFjZV90cmFjZW1lLCB5YW1hX3B0cmFjZV90cmFjZW1l KSwKPj4gQEAgLTQ3Nyw3ICs0ODIsNyBAQCBzdGF0aWMgaW5saW5lIHZvaWQgeWFtYV9pbml0X3N5 c2N0bCh2b2lkKSB7IH0KPj4gwqAgc3RhdGljIGludCBfX2luaXQgeWFtYV9pbml0KHZvaWQpCj4+ IMKgIHsKPj4gwqDCoMKgwqDCoCBwcl9pbmZvKCJZYW1hOiBiZWNvbWluZyBtaW5kZnVsLlxuIik7 Cj4+IC3CoMKgwqAgc2VjdXJpdHlfYWRkX2hvb2tzKHlhbWFfaG9va3MsIEFSUkFZX1NJWkUoeWFt YV9ob29rcyksICJ5YW1hIik7Cj4+ICvCoMKgwqAgc2VjdXJpdHlfYWRkX2hvb2tzKHlhbWFfaG9v a3MsIEFSUkFZX1NJWkUoeWFtYV9ob29rcyksICZ5YW1hX2xzbWlkKTsKPj4gwqDCoMKgwqDCoCB5 YW1hX2luaXRfc3lzY3RsKCk7Cj4+IMKgwqDCoMKgwqAgcmV0dXJuIDA7Cj4+IMKgIH0KCi0tCkxp bnV4LWF1ZGl0IG1haWxpbmcgbGlzdApMaW51eC1hdWRpdEByZWRoYXQuY29tCmh0dHBzOi8vbGlz dG1hbi5yZWRoYXQuY29tL21haWxtYW4vbGlzdGluZm8vbGludXgtYXVkaXQ=