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:
parent
b0f9e3a6ad
commit
fbab166728
26
pageant.c
26
pageant.c
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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.
|
||||||
|
@ -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--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user