- for (i = 0; NULL != (rkey = index234(rsakeys, i)); i++)
- if (n-- == 0)
- break;
- if (rkey) {
- del234(rsakeys, rkey);
- freersakey(rkey);
- sfree(rkey);
- } else {
- for (i = 0; NULL != (skey = index234(ssh2keys, i));
- i++) if (n-- == 0)
- break;
- if (skey) {
- del234(ssh2keys, skey);
- skey->alg->freekey(skey->data);
- sfree(skey);
- }
+
+ /* get item indices in an array */
+ selectedArray = smalloc(numSelected * sizeof(int));
+ SendDlgItemMessage(hwnd, 100, LB_GETSELITEMS,
+ numSelected, (WPARAM)selectedArray);
+
+ itemNum = numSelected - 1;
+ rCount = count234(rsakeys);
+ sCount = count234(ssh2keys);
+
+ /* go through the non-rsakeys until we've covered them all,
+ * and/or we're out of selected items to check. note that
+ * we go *backwards*, to avoid complications from deleting
+ * things hence altering the offset of subsequent items
+ */
+ for (i = sCount - 1; (itemNum >= 0) && (i >= 0); i--) {
+ skey = index234(ssh2keys, i);
+
+ if (selectedArray[itemNum] == rCount + i) {
+ del234(ssh2keys, skey);
+ skey->alg->freekey(skey->data);
+ sfree(skey);
+ itemNum--;
+ }
+ }
+
+ /* do the same for the rsa keys */
+ for (i = rCount - 1; (itemNum >= 0) && (i >= 0); i--) {
+ rkey = index234(rsakeys, i);
+
+ if(selectedArray[itemNum] == i) {
+ del234(rsakeys, rkey);
+ freersakey(rkey);
+ sfree(rkey);
+ itemNum--;
+ }