1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-01-25 01:02:24 +00:00

winpgnt: fix GUI removal of encrypted keys.

The GUI loop that responded to the 'Remove Key' button in the key list
worked by actually trying to retrieve a pointer to the ssh_key for a
stored key, and then passing that back to the delete function. But
when a key is encrypted, that pointer is NULL, so we segfaulted.

Fixed by changing pageant_delete_ssh2_key() to take a numeric index in
the list instead of a key pointer.
This commit is contained in:
Simon Tatham 2021-04-02 11:30:18 +01:00
parent b0f9e3a6ad
commit fbab166728
3 changed files with 12 additions and 33 deletions

View File

@ -1388,31 +1388,21 @@ ssh2_userkey *pageant_nth_ssh2_key(int i)
return NULL; return NULL;
} }
bool pageant_delete_ssh1_key(RSAKey *rkey) bool pageant_delete_nth_ssh1_key(int i)
{ {
strbuf *blob = makeblob1(rkey); PageantKey *pk = delpos234(keytree, find_first_key_for_version(1) + i);
PageantKeySort sort = keysort(1, ptrlen_from_strbuf(blob)); if (!pk)
PageantKey *deleted = del234(keytree, &sort);
strbuf_free(blob);
if (!deleted)
return false; return false;
assert(deleted->sort.ssh_version == 1); pk_free(pk);
assert(deleted->rkey == rkey);
return true; return true;
} }
bool pageant_delete_ssh2_key(ssh2_userkey *skey) bool pageant_delete_nth_ssh2_key(int i)
{ {
strbuf *blob = makeblob2(skey); PageantKey *pk = delpos234(keytree, find_first_key_for_version(2) + i);
PageantKeySort sort = keysort(2, ptrlen_from_strbuf(blob)); if (!pk)
PageantKey *deleted = del234(keytree, &sort);
strbuf_free(blob);
if (!deleted)
return false; return false;
assert(deleted->sort.ssh_version == 2); pk_free(pk);
assert(deleted->skey == skey);
return true; return true;
} }

View File

@ -125,8 +125,8 @@ int pageant_count_ssh1_keys(void);
int pageant_count_ssh2_keys(void); int pageant_count_ssh2_keys(void);
bool pageant_add_ssh1_key(RSAKey *rkey); bool pageant_add_ssh1_key(RSAKey *rkey);
bool pageant_add_ssh2_key(ssh2_userkey *skey); bool pageant_add_ssh2_key(ssh2_userkey *skey);
bool pageant_delete_ssh1_key(RSAKey *rkey); bool pageant_delete_nth_ssh1_key(int i);
bool pageant_delete_ssh2_key(ssh2_userkey *skey); bool pageant_delete_nth_ssh2_key(int i);
/* /*
* This callback must be provided by the Pageant front end code. * This callback must be provided by the Pageant front end code.

View File

@ -505,9 +505,6 @@ static void prompt_add_keyfile(bool encrypted)
static INT_PTR CALLBACK KeyListProc(HWND hwnd, UINT msg, static INT_PTR CALLBACK KeyListProc(HWND hwnd, UINT msg,
WPARAM wParam, LPARAM lParam) WPARAM wParam, LPARAM lParam)
{ {
RSAKey *rkey;
ssh2_userkey *skey;
static const struct { static const struct {
const char *name; const char *name;
FingerprintType value; FingerprintType value;
@ -615,24 +612,16 @@ static INT_PTR CALLBACK KeyListProc(HWND hwnd, UINT msg,
* things hence altering the offset of subsequent items * things hence altering the offset of subsequent items
*/ */
for (i = sCount - 1; (itemNum >= 0) && (i >= 0); i--) { for (i = sCount - 1; (itemNum >= 0) && (i >= 0); i--) {
skey = pageant_nth_ssh2_key(i);
if (selectedArray[itemNum] == rCount + i) { if (selectedArray[itemNum] == rCount + i) {
pageant_delete_ssh2_key(skey); pageant_delete_nth_ssh2_key(i);
ssh_key_free(skey->key);
sfree(skey);
itemNum--; itemNum--;
} }
} }
/* do the same for the rsa keys */ /* do the same for the rsa keys */
for (i = rCount - 1; (itemNum >= 0) && (i >= 0); i--) { for (i = rCount - 1; (itemNum >= 0) && (i >= 0); i--) {
rkey = pageant_nth_ssh1_key(i);
if(selectedArray[itemNum] == i) { if(selectedArray[itemNum] == i) {
pageant_delete_ssh1_key(rkey); pageant_delete_nth_ssh1_key(i);
freersakey(rkey);
sfree(rkey);
itemNum--; itemNum--;
} }
} }