From MAILER-DAEMON Thu Dec 09 03:41:46 2021 Received: from list by lists.gnu.org with archive (Exim 4.90_1) id 1mvEzq-0005Ul-E9 for mharc-bug-readline@gnu.org; Thu, 09 Dec 2021 03:41:46 -0500 Received: from eggs.gnu.org ([209.51.188.92]:40966) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mvEzp-0005Ub-OE for bug-readline@gnu.org; Thu, 09 Dec 2021 03:41:45 -0500 Received: from gclo.fr ([151.80.43.100]:58428 helo=mail.outters.eu) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mvEzm-00023s-1s for bug-readline@gnu.org; Thu, 09 Dec 2021 03:41:45 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=outters.eu; s=authentifie.0; h=Message-ID:Subject:Cc:To:From:Date:Content-Type: MIME-Version:Sender:Reply-To:Content-Transfer-Encoding:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:In-Reply-To:References:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=lNgFrOvOeQwuuw1LiAA2HNzSgYg3m+79YkptXkiHeck=; b=KXKjPFZ7zzSGzChOoWHZEgCdbG SF/6CG8keFMw7VVBgHDj99WPoC/1GM4bFboV6A83S4uryHIqXKwvCnCW0w/tjNMFkzcl39aIWEJ/J xsxT/9y1AxEbSpUkvbk0u8/0dKvoCGXCRqSEOtloYSlDAt2qvfsMwfajeCBvICt9xDCUQ/wGL/tJ/ BJxJvnvI/I6rNzeLS4j/LmXAy70OXNcZrqwyYQvCJXPZvfGjgUoHXA6CHuCN75UErXnbDmkEZf/S; Received: from [10.0.0.5] (helo=mail.outters.eu) by mel with esmtpa (Exim 4.92.3) (envelope-from ) id 1mvEzc-000Kgf-Qx; Thu, 09 Dec 2021 09:41:32 +0100 Received: from [172.17.169.2] via [212.195.100.226] by mail.outters.eu with HTTP (HTTP/1.1 POST); Thu, 09 Dec 2021 09:41:32 +0100 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=_e4330a1c75e28e312331bc845f3993a3" Date: Thu, 09 Dec 2021 09:41:32 +0100 From: Guillaume Outters To: Cc: Pedro Gimeno Subject: Re: Completion of ENV variables seems to be broken - leading slash (or even more) is added Message-ID: <2349ce77f5925f925eef5927e87391fc@outters.eu> X-Sender: guillaume-bash@outters.eu User-Agent: Roundcube Webmail/0.8.5 Received-SPF: none client-ip=151.80.43.100; envelope-from=guillaume-bash@outters.eu; helo=mail.outters.eu X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: bug-readline@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Bug reports for GNU readline library List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 09 Dec 2021 08:41:45 -0000 --=_e4330a1c75e28e312331bc845f3993a3 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8; format=flowed Le 2011-03-31 21:47, Chet Ramey a écrit: > On 3/15/11 4:44 PM, Chet Ramey wrote: > >> The difference is that bash-4.1 expanded $HOME and left the expansion >> as part of the replacement text. Bash-4.2 tries to leave what the >> user typed alone, but that leads to an inherently ambiguous >> situation: >> when do you quote the `$' in a filename (or, in this case, a >> directory >> name)? It could be a shell variable, and it could be a character in >> the filename. > > I've attached a patch that applies a heuristic. If the directory name > contains a variable, and bash expands it, it removes the appropriate > characters from the set that causes readline to ask bash to quote the > filename. It's the 90% solution. > > It is not perfect: if a character in the filename needs to be quoted, > bash will still quote the `$' in the directory name. It should handle > most of the cases, however. I may have a partial solution: not a silver bullet, but making the "90% solution" go to 95%. === Idea === The idea behind: the part that the user typed is considered well formed (sufficently to return matches), so try to preserve it, and do quote only the completion's additions. === Implementation === The implementation (attached) of this idea is still imperfect, because to identify the user-typed part, I simply compare the first match to the input; this works in the example's simple case: as bash completion knows NOT to direxpand, the $HOME from the input is included in the returned matches, and so is considered to be preserved; the quoting happens later, on spaces. This happens to work on unclosed quotes too (ls "$HOME/sp), because readline starts matching AFTER the quote, so both input and results start with $HOME/sp (without quote). === Limitations === This DOES NOT work when 1. user-typed part is fully quoted (ls "$HOME/space cowboys"/), because readline then passes the quote to the completion function (thus making input and matches diverge), nor (theorically) when 2. a space precedes a var (ls $HOME/space\ cowboys/$SUBDIR/f), because the input backslash will be detected as first difference, where to start quoting. Thus, due to 1., my proposed patch will not resolve Pedro's case in https://lists.gnu.org/archive/html/bug-bash/2021-06/msg00131.html However, a workaround (without direxpand) can be to not close the quote: i='a b' ls "$i/ # Instead of ls "$i"/ (which btw seems to work without my patch). === Going further === Maybe readline could go further to resolve 1. (and reach a "97% solution"?) by handling specially when, in a closed quote string to complete, the quote character appears at first and last chars (or forelast if the last one is a directory separator): then skip the closing char to handle the string as an unclosed quote. This would make "$i"/ work. To test: "$i/part"/unquoted/"requoted/hey"/: how will the middle " be handled? === Optionality === The patch can easily be deactivated (shopt?): it works by computing a common prefix length and passing it to make_quoted_replacement, to tell it where to start replacing. So by forcing a common prefix length of 0, we're back on the current behavior. (by the way, this is how the patch itself falls back when it is confused by the quote_char having changed) === History === Yes, you read 2011, not 2021! Sorry for digging up this 10-years-old subject (archeology fun!), from: https://lists.gnu.org/archive/html/bug-bash/2011-03/msg00235.html but it seems it has never been resolved, only circumvented by direxpanding which breaks the beauty of bash knowing how to preserve a $. https://lists.gnu.org/archive/html/bug-bash/2015-08/msg00181.html https://askubuntu.com/questions/70750/how-to-get-bash-to-stop-escaping-during-tab-completion (and I happen to get the problem every day) I'm sending this to bug-readline, because it seems to be solvable by targeting readline only, but bash would be the first "client" for it (reports are found in bug-bash), and in fact I tested it and built the patch on bash's integrated lib/readline. === Tests === t=/tmp/btest ; i="$t/space cowboys" ; mkdir -p $t/solid "$i/con" "$i/contents" "$i/other" "$i/con/solid" "$i/con/space cowboys" # Each test block lists: # Typed sequence Actual result with current bash + readline Result with current bash + patched readline # echo $t/ echo $t/s echo $t/s # echo $t/so echo $t/solid/ echo $t/solid/ #echo $t/sp echo \$t/space cowboys/ # \$ incorrect echo $t/space cowboys/ # echo $t/space cowboys/ echo \$t/space cowboys/ # \$ incorrect echo $t/space cowboys/ #echo "$t/sp echo "\$t/space cowboys/" # \$ incorrect, \ unnecessary. echo "$t/space cowboys"/ # /!\ Note there's still a problem when quotes are closed: # echo "$t/space cowboys"/ echo \$t/space cowboys/ # \$ incorrect echo \$t/space cowboys/ # Incorrect too # In forelast case the unclosed " made insert_match pass only the unquoted subpart (starting at $t), which matched with the results. # In the current case insert_match passes the whole string including quotes (starting at "$t), thus match ("$t) and replacement ($t) did not match. # This is the same as https://lists.gnu.org/archive/html/bug-bash/2021-06/msg00131.html # This could perhaps be handled by passing longest_prefix() the quote_char, so that it accepts comparing "$t" with $t when quote_char is " # (like compare_match does). # Or forcing callers *NOT* to dequote their matches (by temporarily inhibiting rl_filename_dequoting_function, mapping it to a function that # removes quotes but not backslashes?). # /!\ Note that I did *NOT* regress-test against a litteral $ in a filename. -- Guillaume --=_e4330a1c75e28e312331bc845f3993a3 Content-Transfer-Encoding: base64 Content-Type: text/x-diff; name=readline.non-intrusive-completion-quoting.8.1.patch Content-Disposition: attachment; filename=readline.non-intrusive-completion-quoting.8.1.patch; size=9827 ZGlmZiAtcnV3IGNvbXBsZXRlLmMgY29tcGxldGUuYwotLS0gY29tcGxldGUuYwkyMDIwLTA4LTI3 IDE3OjI4OjI5LjAwMDAwMDAwMCArMDIwMAorKysgY29tcGxldGUuYwkyMDIxLTEyLTA4IDA2OjIw OjEzLjg4MzE0MjAwMCArMDEwMApAQCAtMTQxLDE3ICsxNDEsMTggQEAKIHN0YXRpYyBjaGFyICoq Z2VuX2NvbXBsZXRpb25fbWF0Y2hlcyBQQVJBTVMoKGNoYXIgKiwgaW50LCBpbnQsIHJsX2NvbXBl bnRyeV9mdW5jX3QgKiwgaW50LCBpbnQpKTsKIAogc3RhdGljIGNoYXIgKipyZW1vdmVfZHVwbGlj YXRlX21hdGNoZXMgUEFSQU1TKChjaGFyICoqKSk7Ci1zdGF0aWMgdm9pZCBpbnNlcnRfbWF0Y2gg UEFSQU1TKChjaGFyICosIGludCwgaW50LCBjaGFyICopKTsKK3N0YXRpYyB2b2lkIGluc2VydF9t YXRjaCBQQVJBTVMoKGNoYXIgKiwgaW50LCBpbnQsIGNoYXIgKiwgaW50KSk7CiBzdGF0aWMgaW50 IGFwcGVuZF90b19tYXRjaCBQQVJBTVMoKGNoYXIgKiwgaW50LCBpbnQsIGludCkpOwotc3RhdGlj IHZvaWQgaW5zZXJ0X2FsbF9tYXRjaGVzIFBBUkFNUygoY2hhciAqKiwgaW50LCBjaGFyICopKTsK K3N0YXRpYyB2b2lkIGluc2VydF9hbGxfbWF0Y2hlcyBQQVJBTVMoKGNoYXIgKiosIGludCwgY2hh ciAqLCBpbnQpKTsKIHN0YXRpYyBpbnQgY29tcGxldGVfZm5jbXAgUEFSQU1TKChjb25zdCBjaGFy ICosIGludCwgY29uc3QgY2hhciAqLCBpbnQpKTsKIHN0YXRpYyB2b2lkIGRpc3BsYXlfbWF0Y2hl cyBQQVJBTVMoKGNoYXIgKiopKTsKIHN0YXRpYyBpbnQgY29tcHV0ZV9sY2Rfb2ZfbWF0Y2hlcyBQ QVJBTVMoKGNoYXIgKiosIGludCwgY29uc3QgY2hhciAqKSk7CiBzdGF0aWMgaW50IHBvc3Rwcm9j ZXNzX21hdGNoZXMgUEFSQU1TKChjaGFyICoqKiwgaW50KSk7CitzdGF0aWMgaW50IGxvbmdlc3Rf cHJlZml4IFBBUkFNUygoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKIHN0YXRpYyBpbnQg Y29tcGFyZV9tYXRjaCBQQVJBTVMoKGNoYXIgKiwgY29uc3QgY2hhciAqKSk7CiBzdGF0aWMgaW50 IGNvbXBsZXRlX2dldF9zY3JlZW53aWR0aCBQQVJBTVMoKHZvaWQpKTsKIAotc3RhdGljIGNoYXIg Km1ha2VfcXVvdGVkX3JlcGxhY2VtZW50IFBBUkFNUygoY2hhciAqLCBpbnQsIGNoYXIgKikpOwor c3RhdGljIGNoYXIgKm1ha2VfcXVvdGVkX3JlcGxhY2VtZW50IFBBUkFNUygoY2hhciAqLCBpbnQs IGNoYXIgKiwgaW50KSk7CiAKIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KIC8qCQkJCQkJCQkgICAgKi8KQEAgLTE3 NTEsMTAgKzE3NTIsMTEgQEAKIAogLyogcWMgPT0gcG9pbnRlciB0byBxdW90aW5nIGNoYXJhY3Rl ciwgaWYgYW55ICovCiBzdGF0aWMgY2hhciAqCi1tYWtlX3F1b3RlZF9yZXBsYWNlbWVudCAoY2hh ciAqbWF0Y2gsIGludCBtdHlwZSwgY2hhciAqcWMpCittYWtlX3F1b3RlZF9yZXBsYWNlbWVudCAo Y2hhciAqbWF0Y2gsIGludCBtdHlwZSwgY2hhciAqcWMsIGludCByZXBsYWNlX2Zyb20pCiB7Ci0g IGludCBzaG91bGRfcXVvdGUsIGRvX3JlcGxhY2U7Ci0gIGNoYXIgKnJlcGxhY2VtZW50OworICBp bnQgc2hvdWxkX3F1b3RlLCBkb19yZXBsYWNlLCByZXBsX29mZnNldDsKKyAgY2hhciAqb3JpZ2lu YWwsICpyZXBsYWNlbWVudCwgKmZ1bGw7CisgIGNoYXIgb3FjOwogCiAgIC8qIElmIHdlIGFyZSBk b2luZyBjb21wbGV0aW9uIG9uIHF1b3RlZCBzdWJzdHJpbmdzLCBhbmQgYW55IG1hdGNoZXMKICAg ICAgY29udGFpbiBhbnkgb2YgdGhlIGNvbXBsZXRlcl93b3JkX2JyZWFrX2NoYXJhY3RlcnMsIHRo ZW4gYXV0by0KQEAgLTE3NjQsNyArMTc2Niw4IEBACiAgICAgIGluc2VydGVkIHF1b3RlIGNoYXJh Y3RlciB3aGVuIGl0IG5vIGxvbmdlciBpcyBuZWNlc3NhcnksIHN1Y2ggYXMKICAgICAgaWYgd2Ug Y2hhbmdlIHRoZSBzdHJpbmcgd2UgYXJlIGNvbXBsZXRpbmcgb24gYW5kIHRoZSBuZXcgc2V0IG9m CiAgICAgIG1hdGNoZXMgZG9uJ3QgcmVxdWlyZSBhIHF1b3RlZCBzdWJzdHJpbmcuICovCi0gIHJl cGxhY2VtZW50ID0gbWF0Y2g7CisgIG9yaWdpbmFsID0gcmVwbGFjZW1lbnQgPSBtYXRjaDsKKyAg b3FjID0gcWMgPyAqcWMgOiAnXDAnOwogCiAgIHNob3VsZF9xdW90ZSA9IG1hdGNoICYmIHJsX2Nv bXBsZXRlcl9xdW90ZV9jaGFyYWN0ZXJzICYmCiAJCQlybF9maWxlbmFtZV9jb21wbGV0aW9uX2Rl c2lyZWQgJiYKQEAgLTE3NzYsNiArMTc3OSw4IEBACiAKICAgaWYgKHNob3VsZF9xdW90ZSkKICAg ICB7CisgICAgICBpZiAocmVwbGFjZV9mcm9tID4gMCkKKyAgICAgICAgbWF0Y2ggPSAmbWF0Y2hb cmVwbGFjZV9mcm9tXTsKICAgICAgIC8qIElmIHRoZXJlIGlzIGEgc2luZ2xlIG1hdGNoLCBzZWUg aWYgd2UgbmVlZCB0byBxdW90ZSBpdC4KICAgICAgICAgIFRoaXMgYWxzbyBjaGVja3Mgd2hldGhl ciB0aGUgY29tbW9uIHByZWZpeCBvZiBzZXZlcmFsCiAJIG1hdGNoZXMgbmVlZHMgdG8gYmUgcXVv dGVkLiAqLwpAQCAtMTc4OCwxOSArMTc5Myw0NiBAQAogCSB3b3JkIGJyZWFrIGNoYXJhY3RlciBp biBhIHBvdGVudGlhbCBtYXRjaC4gKi8KICAgICAgIGlmIChkb19yZXBsYWNlICE9IE5PX01BVENI ICYmIHJsX2ZpbGVuYW1lX3F1b3RpbmdfZnVuY3Rpb24pCiAJcmVwbGFjZW1lbnQgPSAoKnJsX2Zp bGVuYW1lX3F1b3RpbmdfZnVuY3Rpb24pIChtYXRjaCwgZG9fcmVwbGFjZSwgcWMpOworICAgICAg LyogSWYgd2UgZmVkIHRoZSBxdW90aW5nIGZ1bmN0aW9uIG9ubHkgYSBwYXJ0aWFsIGNvcHkgb2Yg b3JpZ2luYWwsCisJIHJlY29uc3RpdHV0ZSB0aGUgZnVsbCBzdHJpbmcuICovCisgICAgICBpZiAo cmVwbGFjZW1lbnQgJiYgcmVwbGFjZW1lbnQgIT0gb3JpZ2luYWwpCisJeworCSAgLyogSWYgcWMg Y2hhbmdlZCwgaXQgbWF5IGhhdmUgcXVvdGVkIGF0IHRoZSBzdGFydCBvZiB0aGUgc3VicGFydDsK KwkgICAgIHRoaXMgcG90ZW50aWFsbHkgbGVhdmVzIHRoZSBvcmlnaW5hbCBxdW90ZSBvcGVuZWQs IHdoaWNoIGNhbiBiZQorCSAgICAgYSBtZXNzIHRvIGhhbmRsZS4gU28gZmFsbCBiYWNrIHRvIHRo ZSBvcmlnaW5hbCBiZWhhdmlvdXIsIHRvIGxldCBpdAorCSAgICAgcXVvdGUtcmVwbGFjZSBldmVy eXRoaW5nLCB3aXRob3V0IHByZXNlcnZpbmcgcmVwbGFjZV9mcm9tIGNoYXJzLiAqLworCSAgaWYg KG9xYyAmJiAqcWMgIT0gb3FjKQorCSAgICB7CisJICAgICAgeGZyZWUgKHJlcGxhY2VtZW50KTsK KwkgICAgICAqcWMgPSBvcWM7CisJICAgICAgcmV0dXJuIG1ha2VfcXVvdGVkX3JlcGxhY2VtZW50 IChvcmlnaW5hbCwgbXR5cGUsIHFjLCAwKTsKKwkgICAgfQorCSAgZnVsbCA9IChjaGFyICopeG1h bGxvYyAocmVwbGFjZV9mcm9tICsgc3RybGVuIChyZXBsYWNlbWVudCkgKyAxKTsKKyAgICAgIHN0 cm5jcHkgKGZ1bGwsIG9yaWdpbmFsLCByZXBsYWNlX2Zyb20pOworICAgICAgcmVwbF9vZmZzZXQg PSAwOworICAgICAgLyogSWYgcmVwbGFjZW1lbnQgc3RhcnRzIHdpdGggdGhlIHF1b3RlIGNoYXJh Y3RlciwgYW5kIHdlIHdlcmUgYWxyZWFkeSBpbgorCSBhIHF1b3RlLCBza2lwIHRoZSByZXBsYWNl bWVudCdzIG9uZS4KKwkgT25seSBkbyB0aGlzIGluIGNhc2Ugb2YgcGFydGlhbCByZXBsYWNlLCBi ZWNhdXNlIGZ1bGwgcmVwbGFjZSBnZXRzCisJIGhhbmRsZWQgYnkgY2FsbGVyIHNraXBwaW5nIHRo ZSBvcmlnaW5hbCBxdW90ZS4gKi8KKyAgICAgIGlmIChyZXBsYWNlX2Zyb20gJiYgcWMgJiYgKnFj ICYmIHJlcGxhY2VtZW50WzBdID09ICpxYykKKyAgICAgICAgcmVwbF9vZmZzZXQgPSAxOworICAg ICAgc3RyY3B5ICgmZnVsbFtyZXBsYWNlX2Zyb21dLCAmcmVwbGFjZW1lbnRbcmVwbF9vZmZzZXRd KTsKKwkgIHhmcmVlIChyZXBsYWNlbWVudCk7CisJICByZXBsYWNlbWVudCA9IGZ1bGw7CisJfQog ICAgIH0KICAgcmV0dXJuIChyZXBsYWNlbWVudCk7CiB9CiAKIHN0YXRpYyB2b2lkCi1pbnNlcnRf bWF0Y2ggKGNoYXIgKm1hdGNoLCBpbnQgc3RhcnQsIGludCBtdHlwZSwgY2hhciAqcWMpCitpbnNl cnRfbWF0Y2ggKGNoYXIgKm1hdGNoLCBpbnQgc3RhcnQsIGludCBtdHlwZSwgY2hhciAqcWMsIGlu dCByZXBsYWNlX2Zyb20pCiB7CiAgIGNoYXIgKnJlcGxhY2VtZW50LCAqcjsKICAgY2hhciBvcWM7 CiAgIGludCBlbmQsIHJsZW47CiAKICAgb3FjID0gcWMgPyAqcWMgOiAnXDAnOwotICByZXBsYWNl bWVudCA9IG1ha2VfcXVvdGVkX3JlcGxhY2VtZW50IChtYXRjaCwgbXR5cGUsIHFjKTsKKyAgcmVw bGFjZW1lbnQgPSBtYWtlX3F1b3RlZF9yZXBsYWNlbWVudCAobWF0Y2gsIG10eXBlLCBxYywgcmVw bGFjZV9mcm9tKTsKIAogICAvKiBOb3cgaW5zZXJ0IHRoZSBtYXRjaC4gKi8KICAgaWYgKHJlcGxh Y2VtZW50KQpAQCAtMTkxNyw3ICsxOTQ5LDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLWluc2VydF9h bGxfbWF0Y2hlcyAoY2hhciAqKm1hdGNoZXMsIGludCBwb2ludCwgY2hhciAqcWMpCitpbnNlcnRf YWxsX21hdGNoZXMgKGNoYXIgKiptYXRjaGVzLCBpbnQgcG9pbnQsIGNoYXIgKnFjLCBpbnQgcmVw bGFjZV9mcm9tKQogewogICBpbnQgaTsKICAgY2hhciAqcnA7CkBAIC0xOTM0LDcgKzE5NjYsNyBA QAogICAgIHsKICAgICAgIGZvciAoaSA9IDE7IG1hdGNoZXNbaV07IGkrKykKIAl7Ci0JICBycCA9 IG1ha2VfcXVvdGVkX3JlcGxhY2VtZW50IChtYXRjaGVzW2ldLCBTSU5HTEVfTUFUQ0gsIHFjKTsK KwkgIHJwID0gbWFrZV9xdW90ZWRfcmVwbGFjZW1lbnQgKG1hdGNoZXNbaV0sIFNJTkdMRV9NQVRD SCwgcWMsIHJlcGxhY2VfZnJvbSk7CiAJICBybF9pbnNlcnRfdGV4dCAocnApOwogCSAgcmxfaW5z ZXJ0X3RleHQgKCIgIik7CiAJICBpZiAocnAgIT0gbWF0Y2hlc1tpXSkKQEAgLTE5NDMsNyArMTk3 NSw3IEBACiAgICAgfQogICBlbHNlCiAgICAgewotICAgICAgcnAgPSBtYWtlX3F1b3RlZF9yZXBs YWNlbWVudCAobWF0Y2hlc1swXSwgU0lOR0xFX01BVENILCBxYyk7CisgICAgICBycCA9IG1ha2Vf cXVvdGVkX3JlcGxhY2VtZW50IChtYXRjaGVzWzBdLCBTSU5HTEVfTUFUQ0gsIHFjLCByZXBsYWNl X2Zyb20pOwogICAgICAgcmxfaW5zZXJ0X3RleHQgKHJwKTsKICAgICAgIHJsX2luc2VydF90ZXh0 ICgiICIpOwogICAgICAgaWYgKHJwICE9IG1hdGNoZXNbMF0pCkBAIC0xOTY1LDYgKzE5OTcsMTcg QEAKICAgeGZyZWUgKG1hdGNoZXMpOwogfQogCisvKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUg Y29tbW9uIHByZWZpeCBiZXR3ZWVuIHR3byBzdHJpbmdzLiAqLworc3RhdGljIGludAorbG9uZ2Vz dF9wcmVmaXggKGNvbnN0IGNoYXIgKmEsIGNvbnN0IGNoYXIgKmIpCit7CisgIGludCBpOworCisg IGZvciAoaSA9IC0xOyBhWysraV0gJiYgYVtpXSA9PSBiW2ldOyApIHt9CisKKyAgcmV0dXJuIGk7 Cit9CisKIC8qIENvbXBhcmUgYSBwb3NzaWJseS1xdW90ZWQgZmlsZW5hbWUgVEVYVCBmcm9tIHRo ZSBsaW5lIGJ1ZmZlciBhbmQgYSBwb3NzaWJsZQogICAgTUFUQ0ggdGhhdCBpcyB0aGUgcHJvZHVj dCBvZiBmaWxlbmFtZSBjb21wbGV0aW9uLCB3aGljaCBhY3RzIG9uIHRoZSBkZXF1b3RlZAogICAg dGV4dC4gKi8KQEAgLTE5OTksNyArMjA0Miw3IEBACiB7CiAgIGNoYXIgKiptYXRjaGVzOwogICBy bF9jb21wZW50cnlfZnVuY190ICpvdXJfZnVuYzsKLSAgaW50IHN0YXJ0LCBlbmQsIGRlbGltaXRl ciwgZm91bmRfcXVvdGUsIGksIG5vbnRyaXZpYWxfbGNkOworICBpbnQgc3RhcnQsIGVuZCwgZGVs aW1pdGVyLCBmb3VuZF9xdW90ZSwgaSwgbm9udHJpdmlhbF9sY2QsIHByZXNlcnZlZF9wcmVmaXhf bGVuZ3RoOwogICBjaGFyICp0ZXh0LCAqc2F2ZWRfbGluZV9idWZmZXI7CiAgIGNoYXIgcXVvdGVf Y2hhcjsKICAgaW50IHRsZW4sIG1sZW4sIHNhdmVkX2xhc3RfY29tcGxldGlvbl9mYWlsZWQ7CkBA IC0yMDMyLDYgKzIwNzUsNyBAQAogICAvKiBub250cml2aWFsX2xjZCBpcyBzZXQgaWYgdGhlIGNv bW1vbiBwcmVmaXggYWRkcyBzb21ldGhpbmcgdG8gdGhlIHdvcmQKICAgICAgYmVpbmcgY29tcGxl dGVkLiAqLwogICBub250cml2aWFsX2xjZCA9IG1hdGNoZXMgJiYgY29tcGFyZV9tYXRjaCAodGV4 dCwgbWF0Y2hlc1swXSkgIT0gMDsKKyAgcHJlc2VydmVkX3ByZWZpeF9sZW5ndGggPSBtYXRjaGVz ID8gbG9uZ2VzdF9wcmVmaXgodGV4dCwgbWF0Y2hlc1swXSkgOiAwOwogICBpZiAod2hhdF90b19k byA9PSAnIScgfHwgd2hhdF90b19kbyA9PSAnQCcpCiAgICAgdGxlbiA9IHN0cmxlbiAodGV4dCk7 CiAgIHhmcmVlICh0ZXh0KTsKQEAgLTIwNzUsMTYgKzIxMTksMTYgQEAKICAgICAgIGlmICh3aGF0 X3RvX2RvID09IFRBQikKICAgICAgICAgewogICAgICAgICAgIGlmICgqbWF0Y2hlc1swXSkKLQkg ICAgaW5zZXJ0X21hdGNoIChtYXRjaGVzWzBdLCBzdGFydCwgbWF0Y2hlc1sxXSA/IE1VTFRfTUFU Q0ggOiBTSU5HTEVfTUFUQ0gsICZxdW90ZV9jaGFyKTsKKwkgICAgaW5zZXJ0X21hdGNoIChtYXRj aGVzWzBdLCBzdGFydCwgbWF0Y2hlc1sxXSA/IE1VTFRfTUFUQ0ggOiBTSU5HTEVfTUFUQ0gsICZx dW90ZV9jaGFyLCBwcmVzZXJ2ZWRfcHJlZml4X2xlbmd0aCk7CiAgICAgICAgIH0KICAgICAgIGVs c2UgaWYgKCptYXRjaGVzWzBdICYmIG1hdGNoZXNbMV0gPT0gMCkKIAkvKiBzaG91bGQgd2UgcGVy Zm9ybSB0aGUgY2hlY2sgb25seSBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgbWF0Y2hlcz8gKi8KLQlp bnNlcnRfbWF0Y2ggKG1hdGNoZXNbMF0sIHN0YXJ0LCBtYXRjaGVzWzFdID8gTVVMVF9NQVRDSCA6 IFNJTkdMRV9NQVRDSCwgJnF1b3RlX2NoYXIpOworCWluc2VydF9tYXRjaCAobWF0Y2hlc1swXSwg c3RhcnQsIG1hdGNoZXNbMV0gPyBNVUxUX01BVENIIDogU0lOR0xFX01BVENILCAmcXVvdGVfY2hh ciwgcHJlc2VydmVkX3ByZWZpeF9sZW5ndGgpOwogICAgICAgZWxzZSBpZiAoKm1hdGNoZXNbMF0p CS8qIHdoYXRfdG9fZG8gIT0gVEFCICYmIG11bHRpcGxlIG1hdGNoZXMgKi8KIAl7CiAJICBtbGVu ID0gKm1hdGNoZXNbMF0gPyBzdHJsZW4gKG1hdGNoZXNbMF0pIDogMDsKIAkgIGlmIChtbGVuID49 IHRsZW4pCi0JICAgIGluc2VydF9tYXRjaCAobWF0Y2hlc1swXSwgc3RhcnQsIG1hdGNoZXNbMV0g PyBNVUxUX01BVENIIDogU0lOR0xFX01BVENILCAmcXVvdGVfY2hhcik7CisJICAgIGluc2VydF9t YXRjaCAobWF0Y2hlc1swXSwgc3RhcnQsIG1hdGNoZXNbMV0gPyBNVUxUX01BVENIIDogU0lOR0xF X01BVENILCAmcXVvdGVfY2hhciwgcHJlc2VydmVkX3ByZWZpeF9sZW5ndGgpOwogCX0KIAogICAg ICAgLyogSWYgdGhlcmUgYXJlIG1vcmUgbWF0Y2hlcywgcmluZyB0aGUgYmVsbCB0byBpbmRpY2F0 ZS4KQEAgLTIxMTcsNyArMjE2MSw3IEBACiAgICAgICBicmVhazsKIAogICAgIGNhc2UgJyonOgot ICAgICAgaW5zZXJ0X2FsbF9tYXRjaGVzIChtYXRjaGVzLCBzdGFydCwgJnF1b3RlX2NoYXIpOwor ICAgICAgaW5zZXJ0X2FsbF9tYXRjaGVzIChtYXRjaGVzLCBzdGFydCwgJnF1b3RlX2NoYXIsIHBy ZXNlcnZlZF9wcmVmaXhfbGVuZ3RoKTsKICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSAnPyc6CkBA IC0yMTI1LDcgKzIxNjksNyBAQAogCSBidXQgdGhpcyBhdHRlbXB0IHJldHVybmVkIGEgc2luZ2xl IG1hdGNoLiAqLwogICAgICAgaWYgKHNhdmVkX2xhc3RfY29tcGxldGlvbl9mYWlsZWQgJiYgbWF0 Y2hlc1swXSAmJiAqbWF0Y2hlc1swXSAmJiBtYXRjaGVzWzFdID09IDApCiAJewotCSAgaW5zZXJ0 X21hdGNoIChtYXRjaGVzWzBdLCBzdGFydCwgbWF0Y2hlc1sxXSA/IE1VTFRfTUFUQ0ggOiBTSU5H TEVfTUFUQ0gsICZxdW90ZV9jaGFyKTsKKwkgIGluc2VydF9tYXRjaCAobWF0Y2hlc1swXSwgc3Rh cnQsIG1hdGNoZXNbMV0gPyBNVUxUX01BVENIIDogU0lOR0xFX01BVENILCAmcXVvdGVfY2hhciwg cHJlc2VydmVkX3ByZWZpeF9sZW5ndGgpOwogCSAgYXBwZW5kX3RvX21hdGNoIChtYXRjaGVzWzBd LCBkZWxpbWl0ZXIsIHF1b3RlX2NoYXIsIG5vbnRyaXZpYWxfbGNkKTsKIAkgIGJyZWFrOwogCX0K QEAgLTI3ODcsMTEgKzI4MzEsMTEgQEAKICAgaWYgKG1hdGNoX2xpc3RfaW5kZXggPT0gMCAmJiBt YXRjaF9saXN0X3NpemUgPiAxKQogICAgIHsKICAgICAgIHJsX2RpbmcgKCk7Ci0gICAgICBpbnNl cnRfbWF0Y2ggKG9yaWdfdGV4dCwgb3JpZ19zdGFydCwgTVVMVF9NQVRDSCwgJnF1b3RlX2NoYXIp OworICAgICAgaW5zZXJ0X21hdGNoIChvcmlnX3RleHQsIG9yaWdfc3RhcnQsIE1VTFRfTUFUQ0gs ICZxdW90ZV9jaGFyLCBzdHJsZW4gKG9yaWdfdGV4dCkpOwogICAgIH0KICAgZWxzZQogICAgIHsK LSAgICAgIGluc2VydF9tYXRjaCAobWF0Y2hlc1ttYXRjaF9saXN0X2luZGV4XSwgb3JpZ19zdGFy dCwgU0lOR0xFX01BVENILCAmcXVvdGVfY2hhcik7CisgICAgICBpbnNlcnRfbWF0Y2ggKG1hdGNo ZXNbbWF0Y2hfbGlzdF9pbmRleF0sIG9yaWdfc3RhcnQsIFNJTkdMRV9NQVRDSCwgJnF1b3RlX2No YXIsIGxvbmdlc3RfcHJlZml4IChtYXRjaGVzW21hdGNoX2xpc3RfaW5kZXhdLCBvcmlnX3RleHQp KTsKICAgICAgIGFwcGVuZF90b19tYXRjaCAobWF0Y2hlc1ttYXRjaF9saXN0X2luZGV4XSwgZGVs aW1pdGVyLCBxdW90ZV9jaGFyLAogCQkgICAgICAgY29tcGFyZV9tYXRjaCAob3JpZ190ZXh0LCBt YXRjaGVzW21hdGNoX2xpc3RfaW5kZXhdKSk7CiAgICAgfQpAQCAtMjkwNSw3ICsyOTQ5LDcgQEAK IAkgY29kZSBiZWxvdyBzaG91bGQgdGFrZSBjYXJlIG9mIGl0LiAqLwogICAgICAgaWYgKCptYXRj aGVzWzBdKQogCXsKLQkgIGluc2VydF9tYXRjaCAobWF0Y2hlc1swXSwgb3JpZ19zdGFydCwgbWF0 Y2hlc1sxXSA/IE1VTFRfTUFUQ0ggOiBTSU5HTEVfTUFUQ0gsICZxdW90ZV9jaGFyKTsKKwkgIGlu c2VydF9tYXRjaCAobWF0Y2hlc1swXSwgb3JpZ19zdGFydCwgbWF0Y2hlc1sxXSA/IE1VTFRfTUFU Q0ggOiBTSU5HTEVfTUFUQ0gsICZxdW90ZV9jaGFyLCBsb25nZXN0X3ByZWZpeCAobWF0Y2hlc1sw XSwgb3JpZ190ZXh0KSk7CiAJICBvcmlnX2VuZCA9IG9yaWdfc3RhcnQgKyBzdHJsZW4gKG1hdGNo ZXNbMF0pOwogCSAgY29tcGxldGlvbl9jaGFuZ2VkX2J1ZmZlciA9IFNUUkVRIChvcmlnX3RleHQs IG1hdGNoZXNbMF0pID09IDA7CiAJfQpAQCAtMjk2OCwxMSArMzAxMiwxMSBAQAogICBpZiAobWF0 Y2hfbGlzdF9pbmRleCA9PSAwICYmIG1hdGNoX2xpc3Rfc2l6ZSA+IDEpCiAgICAgewogICAgICAg cmxfZGluZyAoKTsKLSAgICAgIGluc2VydF9tYXRjaCAobWF0Y2hlc1swXSwgb3JpZ19zdGFydCwg TVVMVF9NQVRDSCwgJnF1b3RlX2NoYXIpOworICAgICAgaW5zZXJ0X21hdGNoIChtYXRjaGVzWzBd LCBvcmlnX3N0YXJ0LCBNVUxUX01BVENILCAmcXVvdGVfY2hhciwgbG9uZ2VzdF9wcmVmaXggKG1h dGNoZXNbMF0sIG9yaWdfdGV4dCkpOwogICAgIH0KICAgZWxzZQogICAgIHsKLSAgICAgIGluc2Vy dF9tYXRjaCAobWF0Y2hlc1ttYXRjaF9saXN0X2luZGV4XSwgb3JpZ19zdGFydCwgU0lOR0xFX01B VENILCAmcXVvdGVfY2hhcik7CisgICAgICBpbnNlcnRfbWF0Y2ggKG1hdGNoZXNbbWF0Y2hfbGlz dF9pbmRleF0sIG9yaWdfc3RhcnQsIFNJTkdMRV9NQVRDSCwgJnF1b3RlX2NoYXIsIGxvbmdlc3Rf cHJlZml4IChtYXRjaGVzW21hdGNoX2xpc3RfaW5kZXhdLCBvcmlnX3RleHQpKTsKICAgICAgIGFw cGVuZF90b19tYXRjaCAobWF0Y2hlc1ttYXRjaF9saXN0X2luZGV4XSwgZGVsaW1pdGVyLCBxdW90 ZV9jaGFyLAogCQkgICAgICAgY29tcGFyZV9tYXRjaCAob3JpZ190ZXh0LCBtYXRjaGVzW21hdGNo X2xpc3RfaW5kZXhdKSk7CiAgICAgfQo= --=_e4330a1c75e28e312331bc845f3993a3--