From ee26ab8617402c81c34a7e2b0c613cd77f769d68 Mon Sep 17 00:00:00 2001 From: Simon Tatham Date: Mon, 9 Mar 2020 19:23:24 +0000 Subject: [PATCH] kh2reg: fix Python 3 iterator bug with multiple hostnames. A known_hosts line can have multiple comma-separated hostnames on it, or more usually a hostname and an IP address. In the RSA and DSA key handlers, I was making a list of the integer parameters of the public key by using the 'map' function, and then iterating over it once per hostname on the line. But in Python 3, the 'map' function returns an iterator, not a list, so after you've iterated to its end once, it's empty, and iterating over it a second time stops immediately. As a result, the registry line for the second hostname was coming out empty. (cherry picked from commit 143f8a2d1096e9649930ed5d909bf59433c105c4) --- contrib/kh2reg.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contrib/kh2reg.py b/contrib/kh2reg.py index 272124d5..5a8e2f3e 100755 --- a/contrib/kh2reg.py +++ b/contrib/kh2reg.py @@ -225,7 +225,7 @@ def handle_line(line, output_formatter, try_hosts): # Treat as SSH-1-type host key. # Format: hostpat bits10 exp10 mod10 comment... # (PuTTY doesn't store the number of bits.) - keyparams = map (int, fields[2:4]) + keyparams = list(map(int, fields[2:4])) keytype = "rsa" else: @@ -259,12 +259,12 @@ def handle_line(line, output_formatter, try_hosts): keytype = "rsa2" # The rest of the subfields we can treat as an opaque list # of bignums (same numbers and order as stored by PuTTY). - keyparams = map (strtoint, subfields[1:]) + keyparams = list(map(strtoint, subfields[1:])) elif sshkeytype == "ssh-dss": keytype = "dss" # Same again. - keyparams = map (strtoint, subfields[1:]) + keyparams = list(map(strtoint, subfields[1:])) elif sshkeytype in nist_curves: keytype = sshkeytype