From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 118062 invoked by alias); 28 Jul 2017 16:36:25 -0000 Mailing-List: contact elfutils-devel-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Post: List-Help: List-Subscribe: Sender: elfutils-devel-owner@sourceware.org Received: (qmail 118036 invoked by uid 89); 28 Jul 2017 16:36:24 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Checked: by ClamAV 0.99.2 on sourceware.org X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.4 required=5.0 tests=BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RCVD_IN_DNSWL_NONE,RCVD_IN_SORBS_SPAM,RP_MATCHES_RCVD,SPF_PASS autolearn=ham version=3.3.2 spammy=23285 X-Spam-Status: No, score=-26.4 required=5.0 tests=BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RCVD_IN_DNSWL_NONE,RCVD_IN_SORBS_SPAM,RP_MATCHES_RCVD,SPF_PASS autolearn=ham version=3.3.2 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on sourceware.org X-Spam-Level: X-HELO: mail-ua0-f176.google.com Received: from mail-ua0-f176.google.com (HELO mail-ua0-f176.google.com) (209.85.217.176) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 28 Jul 2017 16:36:20 +0000 Received: by mail-ua0-f176.google.com with SMTP id k43so130933586uaf.3 for ; Fri, 28 Jul 2017 09:36:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=mime-version:from:date:message-id:subject:to; bh=uITFv1u+S0/5kubyGhfLkLLW3HtynmCC/Bc1MCzeGeM=; b=e4/2VDQlEQhKcnLCpgewpdEd8rprI3tTF+yAOkKJFSjkydrH+1d/Pzl6HFySMHV42H uMjo38cDfdzRf1CacEJHI3NW/SEcx4Uf7K6QXuBWBesTh9UB5fOVZS3/PbkLUF3w6+f9 CREMv6XW2rUSpKTT3kbuLFoQc5Y/huFq2E8iMVadUdUZgchIw5yIjHUjAgWBqRXldE5s NJkw2xJxbvUvDeKAP4r6Rq9D0lofaxRYO3lhUi5ZkwJjSX25jW2d6iiE3b0SLXdAK9zs UvWRmmm1SCCnOY9b37gEyZJyCyEu5JdxNcPJDi3xHKW7JIEd/gxY21gWNd3frKk2J6M4 FtdQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=uITFv1u+S0/5kubyGhfLkLLW3HtynmCC/Bc1MCzeGeM=; b=KX90ppHJ+l0w7yOBT99to2KMY0jKPGwOQqZjhcVzMgtuf7uM+BHTQzx/mHr6fZVYSX FdAja2kIv4PJR0gLpTse/hGPq0/VPwgHy8kVXBd/drlx4IhLY6D9OjBuo0ik4ixb96a7 V4MZDaLxJq4/E1ImCTXzWLpia2rHVptIuXIKOUC3GIPXuFAN6ZlkbDQt1ijRtXmMG2VS Qu324vcmXRNEKggKbkawngCLM5llXHwq/KqEoq413hkJ1d/Y56fSPnXWMLz78nQRinwf 4WQYawJN+/2AJjH/P15b8xWHgFvyejmXAJSPiDATszkEIfWSbRDPsBteveLN9pDLkAvG L67w== X-Gm-Message-State: AIVw111xQmaTljEpgk49mHa+EtLnxi61LAbn3KuzVr0FwbsX+xmtZQhy P2rw6vnOHLXpNnkrs5WBUXReuQQIMKwILQ7CAw== X-Received: by 10.176.77.96 with SMTP id k32mr4748877uag.39.1501259778161; Fri, 28 Jul 2017 09:36:18 -0700 (PDT) MIME-Version: 1.0 Received: by 10.176.24.144 with HTTP; Fri, 28 Jul 2017 09:36:17 -0700 (PDT) From: "Yunlian Jiang via elfutils-devel" Reply-To: Yunlian Jiang Date: Fri, 28 Jul 2017 16:36:00 -0000 Message-ID: Subject: [PATCH] libdwfl: Move nested function in dwfl_segment_report_module.c To: elfutils-devel@sourceware.org Content-Type: multipart/mixed; boundary="f403043c4b24cc1763055563476a" X-SW-Source: 2017-q3/txt/msg00061.txt.bz2 --f403043c4b24cc1763055563476a Content-Type: text/plain; charset="UTF-8" Content-length: 13352 This moves part of nested functions in dwfl_segment_report_module.c to file scope. --- a/libdwfl/ChangeLog +++ b/libdwfl/ChangeLog @@ -1,3 +1,7 @@ * Move nested function 'segment_read' to file scope to compile with clang. * Move nested function 'release_buffer' to file scope to compile with clang. * Move nested function 'read_portion' to file scope to compile with clang. * Move nested function 'finish_portion' to file scope to compile with clang. >From 47a9587f4c8aa10b155b054e892109b57c6e0ad4 Mon Sep 17 00:00:00 2001 From: Yunlian Jiang Date: Fri, 28 Jul 2017 09:27:20 -0700 Subject: [PATCH] libdwfl: move nested function in dwfl_segment_report_module.c * Move nested function 'segment_read' to file scope to compile with clang. * Move nested function 'release_buffer' to file scope to compile with clang. * Move nested function 'read_portion' to file scope to compile with clang. * Move nested function 'finish_portion' to file scope to compile with clang. Signed-off-by: Yunlian Jiang --- libdwfl/dwfl_segment_report_module.c | 198 +++++++++++++++++++++-------------- 1 file changed, 120 insertions(+), 78 deletions(-) diff --git a/libdwfl/dwfl_segment_report_module.c b/libdwfl/dwfl_segment_report_module.c index 207a2573..462cb7d5 100644 --- a/libdwfl/dwfl_segment_report_module.c +++ b/libdwfl/dwfl_segment_report_module.c @@ -232,6 +232,85 @@ invalid_elf (Elf *elf, bool disk_file_has_build_id, return false; } +static inline bool +segment_read (int segndx, void **buffer, size_t *buffer_available, + GElf_Addr addr, size_t minread, Dwfl *dwfl, + Dwfl_Memory_Callback *memory_callback, + void *memory_callback_arg) +{ + return ! (*memory_callback) (dwfl, segndx, buffer, buffer_available, + addr, minread, memory_callback_arg); +} + +static inline void +release_buffer (void **buffer, size_t *buffer_available, + Dwfl *dwfl, + Dwfl_Memory_Callback *memory_callback, + void *memory_callback_arg) +{ + if (*buffer != NULL) + (void) segment_read (-1, buffer, buffer_available, 0, 0, dwfl, + memory_callback, memory_callback_arg); +} + +static inline int +finish(void *phdrsp, void *buffer, size_t buffer_available, + Elf *elf, int fd, int ndx, Dwfl *dwfl, + Dwfl_Memory_Callback *memory_callback, + void *memory_callback_arg) + +{ + free (phdrsp); + release_buffer (&buffer, &buffer_available, dwfl, memory_callback, + memory_callback_arg); + if (elf != NULL) + elf_end (elf); + if (fd != -1) + close (fd); + return ndx; +} + +#define DO_REAL_FINISH finish(phdrsp, buffer, buffer_available, elf, fd, ndx, \ + dwfl, memory_callback, memory_callback_arg) + +static inline bool +read_portion (void **data, size_t *data_size, + GElf_Addr vaddr, size_t filesz, + GElf_Addr start, size_t segment, + void *buffer, size_t buffer_available, + Dwfl *dwfl, + Dwfl_Memory_Callback *memory_callback, + void *memory_callback_arg + ) +{ + if (vaddr - start + filesz > buffer_available + /* If we're in string mode, then don't consider the buffer we have + sufficient unless it contains the terminator of the string. */ + || (filesz == 0 && memchr (vaddr - start + buffer, '\0', + buffer_available - (vaddr - start)) == NULL)) + { + *data = NULL; + *data_size = filesz; + return segment_read (addr_segndx (dwfl, segment, vaddr, false), + data, data_size, vaddr, filesz, + dwfl, memory_callback, memory_callback_arg); + } + + /* We already have this whole note segment from our initial read. */ + *data = vaddr - start + buffer; + *data_size = 0; + return false; +} + +static inline void +finish_portion (void **data, size_t *data_size, Dwfl *dwfl, + Dwfl_Memory_Callback *memory_callback, + void *memory_callback_arg) +{ + if (*data_size != 0) + release_buffer (data, data_size, dwfl, memory_callback, memory_callback_arg); +} + int dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name, Dwfl_Memory_Callback *memory_callback, @@ -257,20 +336,6 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name, GElf_Addr start = dwfl->lookup_addr[segment]; - inline bool segment_read (int segndx, - void **buffer, size_t *buffer_available, - GElf_Addr addr, size_t minread) - { - return ! (*memory_callback) (dwfl, segndx, buffer, buffer_available, - addr, minread, memory_callback_arg); - } - - inline void release_buffer (void **buffer, size_t *buffer_available) - { - if (*buffer != NULL) - (void) segment_read (-1, buffer, buffer_available, 0, 0); - } - /* First read in the file header and check its sanity. */ void *buffer = NULL; @@ -282,48 +347,11 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name, here so we can always safely free it. */ void *phdrsp = NULL; - inline int finish (void) - { - free (phdrsp); - release_buffer (&buffer, &buffer_available); - if (elf != NULL) - elf_end (elf); - if (fd != -1) - close (fd); - return ndx; - } - if (segment_read (ndx, &buffer, &buffer_available, - start, sizeof (Elf64_Ehdr)) + start, sizeof (Elf64_Ehdr), + dwfl, memory_callback, memory_callback_arg) || memcmp (buffer, ELFMAG, SELFMAG) != 0) - return finish (); - - inline bool read_portion (void **data, size_t *data_size, - GElf_Addr vaddr, size_t filesz) - { - if (vaddr - start + filesz > buffer_available - /* If we're in string mode, then don't consider the buffer we have - sufficient unless it contains the terminator of the string. */ - || (filesz == 0 && memchr (vaddr - start + buffer, '\0', - buffer_available - (vaddr - start)) == NULL)) - { - *data = NULL; - *data_size = filesz; - return segment_read (addr_segndx (dwfl, segment, vaddr, false), - data, data_size, vaddr, filesz); - } - - /* We already have this whole note segment from our initial read. */ - *data = vaddr - start + buffer; - *data_size = 0; - return false; - } - - inline void finish_portion (void **data, size_t *data_size) - { - if (*data_size != 0) - release_buffer (data, data_size); - } + return DO_REAL_FINISH; /* Extract the information we need from the file header. */ const unsigned char *e_ident; @@ -360,31 +388,31 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name, case ELFCLASS32: xlatefrom.d_size = sizeof (Elf32_Ehdr); if (elf32_xlatetom (&xlateto, &xlatefrom, ei_data) == NULL) - return finish (); + return DO_REAL_FINISH; e_type = ehdr.e32.e_type; phoff = ehdr.e32.e_phoff; phnum = ehdr.e32.e_phnum; phentsize = ehdr.e32.e_phentsize; if (phentsize != sizeof (Elf32_Phdr)) - return finish (); + return DO_REAL_FINISH; shdrs_end = ehdr.e32.e_shoff + ehdr.e32.e_shnum * ehdr.e32.e_shentsize; break; case ELFCLASS64: xlatefrom.d_size = sizeof (Elf64_Ehdr); if (elf64_xlatetom (&xlateto, &xlatefrom, ei_data) == NULL) - return finish (); + return DO_REAL_FINISH; e_type = ehdr.e64.e_type; phoff = ehdr.e64.e_phoff; phnum = ehdr.e64.e_phnum; phentsize = ehdr.e64.e_phentsize; if (phentsize != sizeof (Elf64_Phdr)) - return finish (); + return DO_REAL_FINISH; shdrs_end = ehdr.e64.e_shoff + ehdr.e64.e_shnum * ehdr.e64.e_shentsize; break; default: - return finish (); + return DO_REAL_FINISH; } /* The file header tells where to find the program headers. @@ -392,7 +420,7 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name, Without them, we don't have a module to report. */ if (phnum == 0) - return finish (); + return DO_REAL_FINISH; xlatefrom.d_type = xlateto.d_type = ELF_T_PHDR; xlatefrom.d_size = phnum * phentsize; @@ -400,19 +428,21 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name, void *ph_buffer = NULL; size_t ph_buffer_size = 0; if (read_portion (&ph_buffer, &ph_buffer_size, - start + phoff, xlatefrom.d_size)) - return finish (); + start + phoff, xlatefrom.d_size, + start, segment, buffer, buffer_available, + dwfl, memory_callback, memory_callback_arg)) + return DO_REAL_FINISH; xlatefrom.d_buf = ph_buffer; bool class32 = ei_class == ELFCLASS32; size_t phdr_size = class32 ? sizeof (Elf32_Phdr) : sizeof (Elf64_Phdr); if (unlikely (phnum > SIZE_MAX / phdr_size)) - return finish (); + return DO_REAL_FINISH; const size_t phdrsp_bytes = phnum * phdr_size; phdrsp = malloc (phdrsp_bytes); if (unlikely (phdrsp == NULL)) - return finish (); + return DO_REAL_FINISH; xlateto.d_buf = phdrsp; xlateto.d_size = phdrsp_bytes; @@ -450,7 +480,9 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name, void *data; size_t data_size; - if (read_portion (&data, &data_size, vaddr, filesz)) + if (read_portion (&data, &data_size, vaddr, filesz, + start, segment, buffer, buffer_available, + dwfl, memory_callback, memory_callback_arg)) return; assert (sizeof (Elf32_Nhdr) == sizeof (Elf64_Nhdr)); @@ -501,7 +533,8 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name, done: if (notes != data) free (notes); - finish_portion (&data, &data_size); + finish_portion (&data, &data_size, + dwfl, memory_callback, memory_callback_arg); } /* Consider each of the program headers we've read from the image. */ @@ -598,14 +631,15 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name, (*p64)[i].p_align); } - finish_portion (&ph_buffer, &ph_buffer_size); + finish_portion (&ph_buffer, &ph_buffer_size, + dwfl, memory_callback, memory_callback_arg); /* We must have seen the segment covering offset 0, or else the ELF header we read at START was not produced by these program headers. */ if (unlikely (!found_bias)) { free (build_id); - return finish (); + return DO_REAL_FINISH; } /* Now we know enough to report a module for sure: its bounds. */ @@ -676,7 +710,7 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name, if (skip_this_module) { free (build_id); - return finish (); + return DO_REAL_FINISH; } } @@ -754,13 +788,15 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name, void *dyn_data = NULL; size_t dyn_data_size = 0; if (dyn_filesz != 0 && dyn_filesz % dyn_entsize == 0 - && ! read_portion (&dyn_data, &dyn_data_size, dyn_vaddr, dyn_filesz)) + && ! read_portion (&dyn_data, &dyn_data_size, dyn_vaddr, dyn_filesz, + start, segment, buffer, buffer_available, + dwfl, memory_callback, memory_callback_arg)) { void *dyns = malloc (dyn_filesz); Elf32_Dyn (*d32)[dyn_filesz / sizeof (Elf32_Dyn)] = dyns; Elf64_Dyn (*d64)[dyn_filesz / sizeof (Elf64_Dyn)] = dyns; if (unlikely (dyns == NULL)) - return finish (); + return DO_REAL_FINISH; xlatefrom.d_type = xlateto.d_type = ELF_T_DYN; xlatefrom.d_buf = (void *) dyn_data; @@ -784,7 +820,8 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name, } free (dyns); } - finish_portion (&dyn_data, &dyn_data_size); + finish_portion (&dyn_data, &dyn_data_size, + dwfl, memory_callback, memory_callback_arg); /* We'll use the name passed in or a stupid default if not DT_SONAME. */ if (name == NULL) @@ -817,7 +854,9 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name, /* Try to get the DT_SONAME string. */ if (soname_stroff != 0 && soname_stroff + 1 < dynstrsz && ! read_portion (&soname, &soname_size, - dynstr_vaddr + soname_stroff, 0)) + dynstr_vaddr + soname_stroff, 0, + start, segment, buffer, buffer_available, + dwfl, memory_callback, memory_callback_arg)) name = soname; } @@ -845,12 +884,13 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name, /* At this point we do not need BUILD_ID or NAME any more. They have been copied. */ free (build_id); - finish_portion (&soname, &soname_size); + finish_portion (&soname, &soname_size, + dwfl, memory_callback, memory_callback_arg); if (unlikely (mod == NULL)) { ndx = -1; - return finish (); + return DO_REAL_FINISH; } /* We have reported the module. Now let the caller decide whether we @@ -874,14 +914,15 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name, void *contents = calloc (1, file_trimmed_end); if (unlikely (contents == NULL)) - return finish (); + return DO_REAL_FINISH; inline void final_read (size_t offset, GElf_Addr vaddr, size_t size) { void *into = contents + offset; size_t read_size = size; (void) segment_read (addr_segndx (dwfl, segment, vaddr, false), - &into, &read_size, vaddr, size); + &into, &read_size, vaddr, size, + dwfl, memory_callback, memory_callback_arg); } if (contiguous < file_trimmed_end) @@ -935,5 +976,6 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name, mod->main_bias = bias; } - return finish (); + return DO_REAL_FINISH; } +#undef DO_REAL_FINISH -- 2.14.0.rc0.400.g1c36432dff-goog --f403043c4b24cc1763055563476a Content-Type: text/x-patch; charset="US-ASCII"; name="0001-libdwfl-move-nested-function-in-dwfl_segment_report_.patch" Content-Disposition: attachment; filename="0001-libdwfl-move-nested-function-in-dwfl_segment_report_.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_j5o3aewv0 Content-length: 17662 RnJvbSA0N2E5NTg3ZjRjOGFhMTBiMTU1YjA1NGU4OTIxMDliNTdjNmUwYWQ0 IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBZdW5saWFuIEppYW5n IDx5dW5saWFuQGdvb2dsZS5jb20+CkRhdGU6IEZyaSwgMjggSnVsIDIwMTcg MDk6Mjc6MjAgLTA3MDAKU3ViamVjdDogW1BBVENIXSBsaWJkd2ZsOiBtb3Zl IG5lc3RlZCBmdW5jdGlvbiBpbiBkd2ZsX3NlZ21lbnRfcmVwb3J0X21vZHVs ZS5jCgoqIE1vdmUgbmVzdGVkIGZ1bmN0aW9uICdzZWdtZW50X3JlYWQnIHRv IGZpbGUgc2NvcGUgdG8gY29tcGlsZSB3aXRoIGNsYW5nLgoqIE1vdmUgbmVz dGVkIGZ1bmN0aW9uICdyZWxlYXNlX2J1ZmZlcicgdG8gZmlsZSBzY29wZSB0 byBjb21waWxlIHdpdGggY2xhbmcuCiogTW92ZSBuZXN0ZWQgZnVuY3Rpb24g J3JlYWRfcG9ydGlvbicgdG8gZmlsZSBzY29wZSB0byBjb21waWxlIHdpdGgg Y2xhbmcuCiogTW92ZSBuZXN0ZWQgZnVuY3Rpb24gJ2ZpbmlzaF9wb3J0aW9u JyB0byBmaWxlIHNjb3BlIHRvIGNvbXBpbGUgd2l0aCBjbGFuZy4KClNpZ25l ZC1vZmYtYnk6IFl1bmxpYW4gSmlhbmcgPHl1bmxpYW5AZ29vZ2xlLmNvbT4K LS0tCiBsaWJkd2ZsL2R3Zmxfc2VnbWVudF9yZXBvcnRfbW9kdWxlLmMgfCAx OTggKysrKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0tLS0KIDEgZmls ZSBjaGFuZ2VkLCAxMjAgaW5zZXJ0aW9ucygrKSwgNzggZGVsZXRpb25zKC0p CgpkaWZmIC0tZ2l0IGEvbGliZHdmbC9kd2ZsX3NlZ21lbnRfcmVwb3J0X21v ZHVsZS5jIGIvbGliZHdmbC9kd2ZsX3NlZ21lbnRfcmVwb3J0X21vZHVsZS5j CmluZGV4IDIwN2EyNTczLi40NjJjYjdkNSAxMDA2NDQKLS0tIGEvbGliZHdm bC9kd2ZsX3NlZ21lbnRfcmVwb3J0X21vZHVsZS5jCisrKyBiL2xpYmR3Zmwv ZHdmbF9zZWdtZW50X3JlcG9ydF9tb2R1bGUuYwpAQCAtMjMyLDYgKzIzMiw4 NSBAQCBpbnZhbGlkX2VsZiAoRWxmICplbGYsIGJvb2wgZGlza19maWxlX2hh c19idWlsZF9pZCwKICAgcmV0dXJuIGZhbHNlOwogfQogCitzdGF0aWMgaW5s aW5lIGJvb2wKK3NlZ21lbnRfcmVhZCAoaW50IHNlZ25keCwgdm9pZCAqKmJ1 ZmZlciwgc2l6ZV90ICpidWZmZXJfYXZhaWxhYmxlLAorCSAgICAgIEdFbGZf QWRkciBhZGRyLCBzaXplX3QgbWlucmVhZCwgRHdmbCAqZHdmbCwKKwkgICAg ICBEd2ZsX01lbW9yeV9DYWxsYmFjayAqbWVtb3J5X2NhbGxiYWNrLAorCSAg ICAgIHZvaWQgKm1lbW9yeV9jYWxsYmFja19hcmcpCit7CisgIHJldHVybiAh ICgqbWVtb3J5X2NhbGxiYWNrKSAoZHdmbCwgc2VnbmR4LCBidWZmZXIsIGJ1 ZmZlcl9hdmFpbGFibGUsCisJCSAgICAgICAgICAgICAgIGFkZHIsIG1pbnJl YWQsIG1lbW9yeV9jYWxsYmFja19hcmcpOworfQorCitzdGF0aWMgaW5saW5l IHZvaWQKK3JlbGVhc2VfYnVmZmVyICh2b2lkICoqYnVmZmVyLCBzaXplX3Qg KmJ1ZmZlcl9hdmFpbGFibGUsCisJCUR3ZmwgKmR3ZmwsCisJCUR3ZmxfTWVt b3J5X0NhbGxiYWNrICptZW1vcnlfY2FsbGJhY2ssCisJCXZvaWQgKm1lbW9y eV9jYWxsYmFja19hcmcpCit7CisgIGlmICgqYnVmZmVyICE9IE5VTEwpCisg ICAgKHZvaWQpIHNlZ21lbnRfcmVhZCAoLTEsIGJ1ZmZlciwgYnVmZmVyX2F2 YWlsYWJsZSwgMCwgMCwgZHdmbCwKKwkJICAgICAgICAgbWVtb3J5X2NhbGxi YWNrLCBtZW1vcnlfY2FsbGJhY2tfYXJnKTsKK30KKworc3RhdGljIGlubGlu ZSBpbnQKK2ZpbmlzaCh2b2lkICpwaGRyc3AsIHZvaWQgKmJ1ZmZlciwgc2l6 ZV90IGJ1ZmZlcl9hdmFpbGFibGUsCisgICAgICAgRWxmICplbGYsIGludCBm ZCwgaW50IG5keCwgRHdmbCAqZHdmbCwKKyAgICAgICBEd2ZsX01lbW9yeV9D YWxsYmFjayAqbWVtb3J5X2NhbGxiYWNrLAorICAgICAgIHZvaWQgKm1lbW9y eV9jYWxsYmFja19hcmcpCisKK3sKKyAgZnJlZSAocGhkcnNwKTsKKyAgcmVs ZWFzZV9idWZmZXIgKCZidWZmZXIsICZidWZmZXJfYXZhaWxhYmxlLCBkd2Zs LCBtZW1vcnlfY2FsbGJhY2ssCisJCSAgbWVtb3J5X2NhbGxiYWNrX2FyZyk7 CisgIGlmIChlbGYgIT0gTlVMTCkKKyAgICBlbGZfZW5kIChlbGYpOworICBp ZiAoZmQgIT0gLTEpCisgICAgY2xvc2UgKGZkKTsKKyAgcmV0dXJuIG5keDsK K30KKworI2RlZmluZSBET19SRUFMX0ZJTklTSCBmaW5pc2gocGhkcnNwLCBi dWZmZXIsIGJ1ZmZlcl9hdmFpbGFibGUsIGVsZiwgZmQsIG5keCwgXAorCQlk d2ZsLCBtZW1vcnlfY2FsbGJhY2ssIG1lbW9yeV9jYWxsYmFja19hcmcpCisK K3N0YXRpYyAgaW5saW5lIGJvb2wKK3JlYWRfcG9ydGlvbiAodm9pZCAqKmRh dGEsIHNpemVfdCAqZGF0YV9zaXplLAorCSAgICAgIEdFbGZfQWRkciB2YWRk ciwgc2l6ZV90IGZpbGVzeiwKKwkgICAgICBHRWxmX0FkZHIgc3RhcnQsIHNp emVfdCBzZWdtZW50LAorCSAgICAgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ1 ZmZlcl9hdmFpbGFibGUsCisJICAgICAgRHdmbCAqZHdmbCwKKwkgICAgICBE d2ZsX01lbW9yeV9DYWxsYmFjayAqbWVtb3J5X2NhbGxiYWNrLAorCSAgICAg IHZvaWQgKm1lbW9yeV9jYWxsYmFja19hcmcKKwkgICAgICApCit7CisgIGlm ICh2YWRkciAtIHN0YXJ0ICsgZmlsZXN6ID4gYnVmZmVyX2F2YWlsYWJsZQor ICAgICAgLyogSWYgd2UncmUgaW4gc3RyaW5nIG1vZGUsIHRoZW4gZG9uJ3Qg Y29uc2lkZXIgdGhlIGJ1ZmZlciB3ZSBoYXZlCisgICAgICBzdWZmaWNpZW50 IHVubGVzcyBpdCBjb250YWlucyB0aGUgdGVybWluYXRvciBvZiB0aGUgc3Ry aW5nLiAgKi8KKyAgICAgIHx8IChmaWxlc3ogPT0gMCAmJiBtZW1jaHIgKHZh ZGRyIC0gc3RhcnQgKyBidWZmZXIsICdcMCcsCisJICBidWZmZXJfYXZhaWxh YmxlIC0gKHZhZGRyIC0gc3RhcnQpKSA9PSBOVUxMKSkKKyAgICB7CisgICAg ICAqZGF0YSA9IE5VTEw7CisgICAgICAqZGF0YV9zaXplID0gZmlsZXN6Owor ICAgICAgcmV0dXJuIHNlZ21lbnRfcmVhZCAoYWRkcl9zZWduZHggKGR3Zmws IHNlZ21lbnQsIHZhZGRyLCBmYWxzZSksCisJCQkgICBkYXRhLCBkYXRhX3Np emUsIHZhZGRyLCBmaWxlc3osCisJCQkgICBkd2ZsLCBtZW1vcnlfY2FsbGJh Y2ssIG1lbW9yeV9jYWxsYmFja19hcmcpOworICAgIH0KKworICAgIC8qIFdl IGFscmVhZHkgaGF2ZSB0aGlzIHdob2xlIG5vdGUgc2VnbWVudCBmcm9tIG91 ciBpbml0aWFsIHJlYWQuICAqLworICAqZGF0YSA9IHZhZGRyIC0gc3RhcnQg KyBidWZmZXI7CisgICpkYXRhX3NpemUgPSAwOworICByZXR1cm4gZmFsc2U7 Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZmluaXNoX3BvcnRpb24gKHZv aWQgKipkYXRhLCBzaXplX3QgKmRhdGFfc2l6ZSwgRHdmbCAqZHdmbCwKKwkJ RHdmbF9NZW1vcnlfQ2FsbGJhY2sgKm1lbW9yeV9jYWxsYmFjaywKKwkJdm9p ZCAqbWVtb3J5X2NhbGxiYWNrX2FyZykKK3sKKyAgaWYgKCpkYXRhX3NpemUg IT0gMCkKKyAgICByZWxlYXNlX2J1ZmZlciAoZGF0YSwgZGF0YV9zaXplLCBk d2ZsLCBtZW1vcnlfY2FsbGJhY2ssIG1lbW9yeV9jYWxsYmFja19hcmcpOwor fQorCiBpbnQKIGR3Zmxfc2VnbWVudF9yZXBvcnRfbW9kdWxlIChEd2ZsICpk d2ZsLCBpbnQgbmR4LCBjb25zdCBjaGFyICpuYW1lLAogCQkJICAgIER3Zmxf TWVtb3J5X0NhbGxiYWNrICptZW1vcnlfY2FsbGJhY2ssCkBAIC0yNTcsMjAg KzMzNiw2IEBAIGR3Zmxfc2VnbWVudF9yZXBvcnRfbW9kdWxlIChEd2ZsICpk d2ZsLCBpbnQgbmR4LCBjb25zdCBjaGFyICpuYW1lLAogCiAgIEdFbGZfQWRk ciBzdGFydCA9IGR3ZmwtPmxvb2t1cF9hZGRyW3NlZ21lbnRdOwogCi0gIGlu bGluZSBib29sIHNlZ21lbnRfcmVhZCAoaW50IHNlZ25keCwKLQkJCSAgICB2 b2lkICoqYnVmZmVyLCBzaXplX3QgKmJ1ZmZlcl9hdmFpbGFibGUsCi0JCQkg ICAgR0VsZl9BZGRyIGFkZHIsIHNpemVfdCBtaW5yZWFkKQotICB7Ci0gICAg cmV0dXJuICEgKCptZW1vcnlfY2FsbGJhY2spIChkd2ZsLCBzZWduZHgsIGJ1 ZmZlciwgYnVmZmVyX2F2YWlsYWJsZSwKLQkJCQkgYWRkciwgbWlucmVhZCwg bWVtb3J5X2NhbGxiYWNrX2FyZyk7Ci0gIH0KLQotICBpbmxpbmUgdm9pZCBy ZWxlYXNlX2J1ZmZlciAodm9pZCAqKmJ1ZmZlciwgc2l6ZV90ICpidWZmZXJf YXZhaWxhYmxlKQotICB7Ci0gICAgaWYgKCpidWZmZXIgIT0gTlVMTCkKLSAg ICAgICh2b2lkKSBzZWdtZW50X3JlYWQgKC0xLCBidWZmZXIsIGJ1ZmZlcl9h dmFpbGFibGUsIDAsIDApOwotICB9Ci0KICAgLyogRmlyc3QgcmVhZCBpbiB0 aGUgZmlsZSBoZWFkZXIgYW5kIGNoZWNrIGl0cyBzYW5pdHkuICAqLwogCiAg IHZvaWQgKmJ1ZmZlciA9IE5VTEw7CkBAIC0yODIsNDggKzM0NywxMSBAQCBk d2ZsX3NlZ21lbnRfcmVwb3J0X21vZHVsZSAoRHdmbCAqZHdmbCwgaW50IG5k eCwgY29uc3QgY2hhciAqbmFtZSwKICAgICAgaGVyZSBzbyB3ZSBjYW4gYWx3 YXlzIHNhZmVseSBmcmVlIGl0LiAgKi8KICAgdm9pZCAqcGhkcnNwID0gTlVM TDsKIAotICBpbmxpbmUgaW50IGZpbmlzaCAodm9pZCkKLSAgewotICAgIGZy ZWUgKHBoZHJzcCk7Ci0gICAgcmVsZWFzZV9idWZmZXIgKCZidWZmZXIsICZi dWZmZXJfYXZhaWxhYmxlKTsKLSAgICBpZiAoZWxmICE9IE5VTEwpCi0gICAg ICBlbGZfZW5kIChlbGYpOwotICAgIGlmIChmZCAhPSAtMSkKLSAgICAgIGNs b3NlIChmZCk7Ci0gICAgcmV0dXJuIG5keDsKLSAgfQotCiAgIGlmIChzZWdt ZW50X3JlYWQgKG5keCwgJmJ1ZmZlciwgJmJ1ZmZlcl9hdmFpbGFibGUsCi0J CSAgICBzdGFydCwgc2l6ZW9mIChFbGY2NF9FaGRyKSkKKwkJICAgIHN0YXJ0 LCBzaXplb2YgKEVsZjY0X0VoZHIpLAorCQkgICAgZHdmbCwgbWVtb3J5X2Nh bGxiYWNrLCBtZW1vcnlfY2FsbGJhY2tfYXJnKQogICAgICAgfHwgbWVtY21w IChidWZmZXIsIEVMRk1BRywgU0VMRk1BRykgIT0gMCkKLSAgICByZXR1cm4g ZmluaXNoICgpOwotCi0gIGlubGluZSBib29sIHJlYWRfcG9ydGlvbiAodm9p ZCAqKmRhdGEsIHNpemVfdCAqZGF0YV9zaXplLAotCQkJICAgIEdFbGZfQWRk ciB2YWRkciwgc2l6ZV90IGZpbGVzeikKLSAgewotICAgIGlmICh2YWRkciAt IHN0YXJ0ICsgZmlsZXN6ID4gYnVmZmVyX2F2YWlsYWJsZQotCS8qIElmIHdl J3JlIGluIHN0cmluZyBtb2RlLCB0aGVuIGRvbid0IGNvbnNpZGVyIHRoZSBi dWZmZXIgd2UgaGF2ZQotCSAgIHN1ZmZpY2llbnQgdW5sZXNzIGl0IGNvbnRh aW5zIHRoZSB0ZXJtaW5hdG9yIG9mIHRoZSBzdHJpbmcuICAqLwotCXx8IChm aWxlc3ogPT0gMCAmJiBtZW1jaHIgKHZhZGRyIC0gc3RhcnQgKyBidWZmZXIs ICdcMCcsCi0JCQkJICAgYnVmZmVyX2F2YWlsYWJsZSAtICh2YWRkciAtIHN0 YXJ0KSkgPT0gTlVMTCkpCi0gICAgICB7Ci0JKmRhdGEgPSBOVUxMOwotCSpk YXRhX3NpemUgPSBmaWxlc3o7Ci0JcmV0dXJuIHNlZ21lbnRfcmVhZCAoYWRk cl9zZWduZHggKGR3ZmwsIHNlZ21lbnQsIHZhZGRyLCBmYWxzZSksCi0JCQkg ICAgIGRhdGEsIGRhdGFfc2l6ZSwgdmFkZHIsIGZpbGVzeik7Ci0gICAgICB9 Ci0KLSAgICAvKiBXZSBhbHJlYWR5IGhhdmUgdGhpcyB3aG9sZSBub3RlIHNl Z21lbnQgZnJvbSBvdXIgaW5pdGlhbCByZWFkLiAgKi8KLSAgICAqZGF0YSA9 IHZhZGRyIC0gc3RhcnQgKyBidWZmZXI7Ci0gICAgKmRhdGFfc2l6ZSA9IDA7 Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW5saW5lIHZvaWQgZmlu aXNoX3BvcnRpb24gKHZvaWQgKipkYXRhLCBzaXplX3QgKmRhdGFfc2l6ZSkK LSAgewotICAgIGlmICgqZGF0YV9zaXplICE9IDApCi0gICAgICByZWxlYXNl X2J1ZmZlciAoZGF0YSwgZGF0YV9zaXplKTsKLSAgfQorICAgIHJldHVybiBE T19SRUFMX0ZJTklTSDsKIAogICAvKiBFeHRyYWN0IHRoZSBpbmZvcm1hdGlv biB3ZSBuZWVkIGZyb20gdGhlIGZpbGUgaGVhZGVyLiAgKi8KICAgY29uc3Qg dW5zaWduZWQgY2hhciAqZV9pZGVudDsKQEAgLTM2MCwzMSArMzg4LDMxIEBA IGR3Zmxfc2VnbWVudF9yZXBvcnRfbW9kdWxlIChEd2ZsICpkd2ZsLCBpbnQg bmR4LCBjb25zdCBjaGFyICpuYW1lLAogICAgIGNhc2UgRUxGQ0xBU1MzMjoK ICAgICAgIHhsYXRlZnJvbS5kX3NpemUgPSBzaXplb2YgKEVsZjMyX0VoZHIp OwogICAgICAgaWYgKGVsZjMyX3hsYXRldG9tICgmeGxhdGV0bywgJnhsYXRl ZnJvbSwgZWlfZGF0YSkgPT0gTlVMTCkKLQlyZXR1cm4gZmluaXNoICgpOwor CXJldHVybiBET19SRUFMX0ZJTklTSDsKICAgICAgIGVfdHlwZSA9IGVoZHIu ZTMyLmVfdHlwZTsKICAgICAgIHBob2ZmID0gZWhkci5lMzIuZV9waG9mZjsK ICAgICAgIHBobnVtID0gZWhkci5lMzIuZV9waG51bTsKICAgICAgIHBoZW50 c2l6ZSA9IGVoZHIuZTMyLmVfcGhlbnRzaXplOwogICAgICAgaWYgKHBoZW50 c2l6ZSAhPSBzaXplb2YgKEVsZjMyX1BoZHIpKQotCXJldHVybiBmaW5pc2gg KCk7CisJcmV0dXJuIERPX1JFQUxfRklOSVNIOwogICAgICAgc2hkcnNfZW5k ID0gZWhkci5lMzIuZV9zaG9mZiArIGVoZHIuZTMyLmVfc2hudW0gKiBlaGRy LmUzMi5lX3NoZW50c2l6ZTsKICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBF TEZDTEFTUzY0OgogICAgICAgeGxhdGVmcm9tLmRfc2l6ZSA9IHNpemVvZiAo RWxmNjRfRWhkcik7CiAgICAgICBpZiAoZWxmNjRfeGxhdGV0b20gKCZ4bGF0 ZXRvLCAmeGxhdGVmcm9tLCBlaV9kYXRhKSA9PSBOVUxMKQotCXJldHVybiBm aW5pc2ggKCk7CisJcmV0dXJuIERPX1JFQUxfRklOSVNIOwogICAgICAgZV90 eXBlID0gZWhkci5lNjQuZV90eXBlOwogICAgICAgcGhvZmYgPSBlaGRyLmU2 NC5lX3Bob2ZmOwogICAgICAgcGhudW0gPSBlaGRyLmU2NC5lX3BobnVtOwog ICAgICAgcGhlbnRzaXplID0gZWhkci5lNjQuZV9waGVudHNpemU7CiAgICAg ICBpZiAocGhlbnRzaXplICE9IHNpemVvZiAoRWxmNjRfUGhkcikpCi0JcmV0 dXJuIGZpbmlzaCAoKTsKKwlyZXR1cm4gRE9fUkVBTF9GSU5JU0g7CiAgICAg ICBzaGRyc19lbmQgPSBlaGRyLmU2NC5lX3Nob2ZmICsgZWhkci5lNjQuZV9z aG51bSAqIGVoZHIuZTY0LmVfc2hlbnRzaXplOwogICAgICAgYnJlYWs7CiAK ICAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGZpbmlzaCAoKTsKKyAgICAg IHJldHVybiBET19SRUFMX0ZJTklTSDsKICAgICB9CiAKICAgLyogVGhlIGZp bGUgaGVhZGVyIHRlbGxzIHdoZXJlIHRvIGZpbmQgdGhlIHByb2dyYW0gaGVh ZGVycy4KQEAgLTM5Miw3ICs0MjAsNyBAQCBkd2ZsX3NlZ21lbnRfcmVwb3J0 X21vZHVsZSAoRHdmbCAqZHdmbCwgaW50IG5keCwgY29uc3QgY2hhciAqbmFt ZSwKICAgICAgV2l0aG91dCB0aGVtLCB3ZSBkb24ndCBoYXZlIGEgbW9kdWxl IHRvIHJlcG9ydC4gICovCiAKICAgaWYgKHBobnVtID09IDApCi0gICAgcmV0 dXJuIGZpbmlzaCAoKTsKKyAgICByZXR1cm4gRE9fUkVBTF9GSU5JU0g7CiAK ICAgeGxhdGVmcm9tLmRfdHlwZSA9IHhsYXRldG8uZF90eXBlID0gRUxGX1Rf UEhEUjsKICAgeGxhdGVmcm9tLmRfc2l6ZSA9IHBobnVtICogcGhlbnRzaXpl OwpAQCAtNDAwLDE5ICs0MjgsMjEgQEAgZHdmbF9zZWdtZW50X3JlcG9ydF9t b2R1bGUgKER3ZmwgKmR3ZmwsIGludCBuZHgsIGNvbnN0IGNoYXIgKm5hbWUs CiAgIHZvaWQgKnBoX2J1ZmZlciA9IE5VTEw7CiAgIHNpemVfdCBwaF9idWZm ZXJfc2l6ZSA9IDA7CiAgIGlmIChyZWFkX3BvcnRpb24gKCZwaF9idWZmZXIs ICZwaF9idWZmZXJfc2l6ZSwKLQkJICAgIHN0YXJ0ICsgcGhvZmYsIHhsYXRl ZnJvbS5kX3NpemUpKQotICAgIHJldHVybiBmaW5pc2ggKCk7CisJCSAgICBz dGFydCArIHBob2ZmLCB4bGF0ZWZyb20uZF9zaXplLAorCQkgICAgc3RhcnQs IHNlZ21lbnQsIGJ1ZmZlciwgYnVmZmVyX2F2YWlsYWJsZSwKKwkJICAgIGR3 ZmwsIG1lbW9yeV9jYWxsYmFjaywgbWVtb3J5X2NhbGxiYWNrX2FyZykpCisg ICAgcmV0dXJuIERPX1JFQUxfRklOSVNIOwogCiAgIHhsYXRlZnJvbS5kX2J1 ZiA9IHBoX2J1ZmZlcjsKIAogICBib29sIGNsYXNzMzIgPSBlaV9jbGFzcyA9 PSBFTEZDTEFTUzMyOwogICBzaXplX3QgcGhkcl9zaXplID0gY2xhc3MzMiA/ IHNpemVvZiAoRWxmMzJfUGhkcikgOiBzaXplb2YgKEVsZjY0X1BoZHIpOwog ICBpZiAodW5saWtlbHkgKHBobnVtID4gU0laRV9NQVggLyBwaGRyX3NpemUp KQotICAgIHJldHVybiBmaW5pc2ggKCk7CisgICAgcmV0dXJuIERPX1JFQUxf RklOSVNIOwogICBjb25zdCBzaXplX3QgcGhkcnNwX2J5dGVzID0gcGhudW0g KiBwaGRyX3NpemU7CiAgIHBoZHJzcCA9IG1hbGxvYyAocGhkcnNwX2J5dGVz KTsKICAgaWYgKHVubGlrZWx5IChwaGRyc3AgPT0gTlVMTCkpCi0gICAgcmV0 dXJuIGZpbmlzaCAoKTsKKyAgICByZXR1cm4gRE9fUkVBTF9GSU5JU0g7CiAK ICAgeGxhdGV0by5kX2J1ZiA9IHBoZHJzcDsKICAgeGxhdGV0by5kX3NpemUg PSBwaGRyc3BfYnl0ZXM7CkBAIC00NTAsNyArNDgwLDkgQEAgZHdmbF9zZWdt ZW50X3JlcG9ydF9tb2R1bGUgKER3ZmwgKmR3ZmwsIGludCBuZHgsIGNvbnN0 IGNoYXIgKm5hbWUsCiAKICAgICB2b2lkICpkYXRhOwogICAgIHNpemVfdCBk YXRhX3NpemU7Ci0gICAgaWYgKHJlYWRfcG9ydGlvbiAoJmRhdGEsICZkYXRh X3NpemUsIHZhZGRyLCBmaWxlc3opKQorICAgIGlmIChyZWFkX3BvcnRpb24g KCZkYXRhLCAmZGF0YV9zaXplLCB2YWRkciwgZmlsZXN6LAorCQkgICAgICBz dGFydCwgc2VnbWVudCwgYnVmZmVyLCBidWZmZXJfYXZhaWxhYmxlLAorCQkg ICAgICBkd2ZsLCBtZW1vcnlfY2FsbGJhY2ssIG1lbW9yeV9jYWxsYmFja19h cmcpKQogICAgICAgcmV0dXJuOwogCiAgICAgYXNzZXJ0IChzaXplb2YgKEVs ZjMyX05oZHIpID09IHNpemVvZiAoRWxmNjRfTmhkcikpOwpAQCAtNTAxLDcg KzUzMyw4IEBAIGR3Zmxfc2VnbWVudF9yZXBvcnRfbW9kdWxlIChEd2ZsICpk d2ZsLCBpbnQgbmR4LCBjb25zdCBjaGFyICpuYW1lLAogICBkb25lOgogICAg IGlmIChub3RlcyAhPSBkYXRhKQogICAgICAgZnJlZSAobm90ZXMpOwotICAg IGZpbmlzaF9wb3J0aW9uICgmZGF0YSwgJmRhdGFfc2l6ZSk7CisgICAgZmlu aXNoX3BvcnRpb24gKCZkYXRhLCAmZGF0YV9zaXplLAorCQkgICAgZHdmbCwg bWVtb3J5X2NhbGxiYWNrLCBtZW1vcnlfY2FsbGJhY2tfYXJnKTsKICAgfQog CiAgIC8qIENvbnNpZGVyIGVhY2ggb2YgdGhlIHByb2dyYW0gaGVhZGVycyB3 ZSd2ZSByZWFkIGZyb20gdGhlIGltYWdlLiAgKi8KQEAgLTU5OCwxNCArNjMx LDE1IEBAIGR3Zmxfc2VnbWVudF9yZXBvcnRfbW9kdWxlIChEd2ZsICpkd2Zs LCBpbnQgbmR4LCBjb25zdCBjaGFyICpuYW1lLAogCQkJICgqcDY0KVtpXS5w X2FsaWduKTsKICAgICB9CiAKLSAgZmluaXNoX3BvcnRpb24gKCZwaF9idWZm ZXIsICZwaF9idWZmZXJfc2l6ZSk7CisgIGZpbmlzaF9wb3J0aW9uICgmcGhf YnVmZmVyLCAmcGhfYnVmZmVyX3NpemUsCisJCSAgZHdmbCwgbWVtb3J5X2Nh bGxiYWNrLCBtZW1vcnlfY2FsbGJhY2tfYXJnKTsKIAogICAvKiBXZSBtdXN0 IGhhdmUgc2VlbiB0aGUgc2VnbWVudCBjb3ZlcmluZyBvZmZzZXQgMCwgb3Ig ZWxzZSB0aGUgRUxGCiAgICAgIGhlYWRlciB3ZSByZWFkIGF0IFNUQVJUIHdh cyBub3QgcHJvZHVjZWQgYnkgdGhlc2UgcHJvZ3JhbSBoZWFkZXJzLiAgKi8K ICAgaWYgKHVubGlrZWx5ICghZm91bmRfYmlhcykpCiAgICAgewogICAgICAg ZnJlZSAoYnVpbGRfaWQpOwotICAgICAgcmV0dXJuIGZpbmlzaCAoKTsKKyAg ICAgIHJldHVybiBET19SRUFMX0ZJTklTSDsKICAgICB9CiAKICAgLyogTm93 IHdlIGtub3cgZW5vdWdoIHRvIHJlcG9ydCBhIG1vZHVsZSBmb3Igc3VyZTog aXRzIGJvdW5kcy4gICovCkBAIC02NzYsNyArNzEwLDcgQEAgZHdmbF9zZWdt ZW50X3JlcG9ydF9tb2R1bGUgKER3ZmwgKmR3ZmwsIGludCBuZHgsIGNvbnN0 IGNoYXIgKm5hbWUsCiAgICAgICBpZiAoc2tpcF90aGlzX21vZHVsZSkKIAl7 CiAJICBmcmVlIChidWlsZF9pZCk7Ci0JICByZXR1cm4gZmluaXNoICgpOwor CSAgcmV0dXJuIERPX1JFQUxfRklOSVNIOwogCX0KICAgICB9CiAKQEAgLTc1 NCwxMyArNzg4LDE1IEBAIGR3Zmxfc2VnbWVudF9yZXBvcnRfbW9kdWxlIChE d2ZsICpkd2ZsLCBpbnQgbmR4LCBjb25zdCBjaGFyICpuYW1lLAogICB2b2lk ICpkeW5fZGF0YSA9IE5VTEw7CiAgIHNpemVfdCBkeW5fZGF0YV9zaXplID0g MDsKICAgaWYgKGR5bl9maWxlc3ogIT0gMCAmJiBkeW5fZmlsZXN6ICUgZHlu X2VudHNpemUgPT0gMAotICAgICAgJiYgISByZWFkX3BvcnRpb24gKCZkeW5f ZGF0YSwgJmR5bl9kYXRhX3NpemUsIGR5bl92YWRkciwgZHluX2ZpbGVzeikp CisgICAgICAmJiAhIHJlYWRfcG9ydGlvbiAoJmR5bl9kYXRhLCAmZHluX2Rh dGFfc2l6ZSwgZHluX3ZhZGRyLCBkeW5fZmlsZXN6LAorCSAJICAgICAgICAg c3RhcnQsIHNlZ21lbnQsIGJ1ZmZlciwgYnVmZmVyX2F2YWlsYWJsZSwKKwkJ ICAgIAkgZHdmbCwgbWVtb3J5X2NhbGxiYWNrLCBtZW1vcnlfY2FsbGJhY2tf YXJnKSkKICAgICB7CiAgICAgICB2b2lkICpkeW5zID0gbWFsbG9jIChkeW5f ZmlsZXN6KTsKICAgICAgIEVsZjMyX0R5biAoKmQzMilbZHluX2ZpbGVzeiAv IHNpemVvZiAoRWxmMzJfRHluKV0gPSBkeW5zOwogICAgICAgRWxmNjRfRHlu ICgqZDY0KVtkeW5fZmlsZXN6IC8gc2l6ZW9mIChFbGY2NF9EeW4pXSA9IGR5 bnM7CiAgICAgICBpZiAodW5saWtlbHkgKGR5bnMgPT0gTlVMTCkpCi0JcmV0 dXJuIGZpbmlzaCAoKTsKKwlyZXR1cm4gRE9fUkVBTF9GSU5JU0g7CiAKICAg ICAgIHhsYXRlZnJvbS5kX3R5cGUgPSB4bGF0ZXRvLmRfdHlwZSA9IEVMRl9U X0RZTjsKICAgICAgIHhsYXRlZnJvbS5kX2J1ZiA9ICh2b2lkICopIGR5bl9k YXRhOwpAQCAtNzg0LDcgKzgyMCw4IEBAIGR3Zmxfc2VnbWVudF9yZXBvcnRf bW9kdWxlIChEd2ZsICpkd2ZsLCBpbnQgbmR4LCBjb25zdCBjaGFyICpuYW1l LAogCX0KICAgICAgIGZyZWUgKGR5bnMpOwogICAgIH0KLSAgZmluaXNoX3Bv cnRpb24gKCZkeW5fZGF0YSwgJmR5bl9kYXRhX3NpemUpOworICBmaW5pc2hf cG9ydGlvbiAoJmR5bl9kYXRhLCAmZHluX2RhdGFfc2l6ZSwKKwkJICBkd2Zs LCBtZW1vcnlfY2FsbGJhY2ssIG1lbW9yeV9jYWxsYmFja19hcmcpOwogCiAg IC8qIFdlJ2xsIHVzZSB0aGUgbmFtZSBwYXNzZWQgaW4gb3IgYSBzdHVwaWQg ZGVmYXVsdCBpZiBub3QgRFRfU09OQU1FLiAgKi8KICAgaWYgKG5hbWUgPT0g TlVMTCkKQEAgLTgxNyw3ICs4NTQsOSBAQCBkd2ZsX3NlZ21lbnRfcmVwb3J0 X21vZHVsZSAoRHdmbCAqZHdmbCwgaW50IG5keCwgY29uc3QgY2hhciAqbmFt ZSwKICAgICAgIC8qIFRyeSB0byBnZXQgdGhlIERUX1NPTkFNRSBzdHJpbmcu ICAqLwogICAgICAgaWYgKHNvbmFtZV9zdHJvZmYgIT0gMCAmJiBzb25hbWVf c3Ryb2ZmICsgMSA8IGR5bnN0cnN6CiAJICAmJiAhIHJlYWRfcG9ydGlvbiAo JnNvbmFtZSwgJnNvbmFtZV9zaXplLAotCQkJICAgICBkeW5zdHJfdmFkZHIg KyBzb25hbWVfc3Ryb2ZmLCAwKSkKKwkJCSAgICAgZHluc3RyX3ZhZGRyICsg c29uYW1lX3N0cm9mZiwgMCwKKwkJCSAgICAgc3RhcnQsIHNlZ21lbnQsIGJ1 ZmZlciwgYnVmZmVyX2F2YWlsYWJsZSwKKwkJCSAgICAgZHdmbCwgbWVtb3J5 X2NhbGxiYWNrLCBtZW1vcnlfY2FsbGJhY2tfYXJnKSkKIAluYW1lID0gc29u YW1lOwogICAgIH0KIApAQCAtODQ1LDEyICs4ODQsMTMgQEAgZHdmbF9zZWdt ZW50X3JlcG9ydF9tb2R1bGUgKER3ZmwgKmR3ZmwsIGludCBuZHgsIGNvbnN0 IGNoYXIgKm5hbWUsCiAgIC8qIEF0IHRoaXMgcG9pbnQgd2UgZG8gbm90IG5l ZWQgQlVJTERfSUQgb3IgTkFNRSBhbnkgbW9yZS4KICAgICAgVGhleSBoYXZl IGJlZW4gY29waWVkLiAgKi8KICAgZnJlZSAoYnVpbGRfaWQpOwotICBmaW5p c2hfcG9ydGlvbiAoJnNvbmFtZSwgJnNvbmFtZV9zaXplKTsKKyAgZmluaXNo X3BvcnRpb24gKCZzb25hbWUsICZzb25hbWVfc2l6ZSwKKwkJICBkd2ZsLCBt ZW1vcnlfY2FsbGJhY2ssIG1lbW9yeV9jYWxsYmFja19hcmcpOwogCiAgIGlm ICh1bmxpa2VseSAobW9kID09IE5VTEwpKQogICAgIHsKICAgICAgIG5keCA9 IC0xOwotICAgICAgcmV0dXJuIGZpbmlzaCAoKTsKKyAgICAgIHJldHVybiBE T19SRUFMX0ZJTklTSDsKICAgICB9CiAKICAgLyogV2UgaGF2ZSByZXBvcnRl ZCB0aGUgbW9kdWxlLiAgTm93IGxldCB0aGUgY2FsbGVyIGRlY2lkZSB3aGV0 aGVyIHdlCkBAIC04NzQsMTQgKzkxNCwxNSBAQCBkd2ZsX3NlZ21lbnRfcmVw b3J0X21vZHVsZSAoRHdmbCAqZHdmbCwgaW50IG5keCwgY29uc3QgY2hhciAq bmFtZSwKIAogICAgICAgdm9pZCAqY29udGVudHMgPSBjYWxsb2MgKDEsIGZp bGVfdHJpbW1lZF9lbmQpOwogICAgICAgaWYgKHVubGlrZWx5IChjb250ZW50 cyA9PSBOVUxMKSkKLQlyZXR1cm4gZmluaXNoICgpOworCXJldHVybiBET19S RUFMX0ZJTklTSDsKIAogICAgICAgaW5saW5lIHZvaWQgZmluYWxfcmVhZCAo c2l6ZV90IG9mZnNldCwgR0VsZl9BZGRyIHZhZGRyLCBzaXplX3Qgc2l6ZSkK ICAgICAgIHsKIAl2b2lkICppbnRvID0gY29udGVudHMgKyBvZmZzZXQ7CiAJ c2l6ZV90IHJlYWRfc2l6ZSA9IHNpemU7CiAJKHZvaWQpIHNlZ21lbnRfcmVh ZCAoYWRkcl9zZWduZHggKGR3ZmwsIHNlZ21lbnQsIHZhZGRyLCBmYWxzZSks Ci0JCQkgICAgICZpbnRvLCAmcmVhZF9zaXplLCB2YWRkciwgc2l6ZSk7CisJ CQkgICAgICZpbnRvLCAmcmVhZF9zaXplLCB2YWRkciwgc2l6ZSwKKwkJCSAg ICAgZHdmbCwgbWVtb3J5X2NhbGxiYWNrLCBtZW1vcnlfY2FsbGJhY2tfYXJn KTsKICAgICAgIH0KIAogICAgICAgaWYgKGNvbnRpZ3VvdXMgPCBmaWxlX3Ry aW1tZWRfZW5kKQpAQCAtOTM1LDUgKzk3Niw2IEBAIGR3Zmxfc2VnbWVudF9y ZXBvcnRfbW9kdWxlIChEd2ZsICpkd2ZsLCBpbnQgbmR4LCBjb25zdCBjaGFy ICpuYW1lLAogICAgICAgbW9kLT5tYWluX2JpYXMgPSBiaWFzOwogICAgIH0K IAotICByZXR1cm4gZmluaXNoICgpOworICByZXR1cm4gRE9fUkVBTF9GSU5J U0g7CiB9CisjdW5kZWYgRE9fUkVBTF9GSU5JU0gKLS0gCjIuMTQuMC5yYzAu NDAwLmcxYzM2NDMyZGZmLWdvb2cKCg== --f403043c4b24cc1763055563476a--