mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-07-18 11:31:00 -05:00
Rewrite some manual char-buffer-handling code.
In the course of recent refactorings I noticed a couple of cases where we were doing old-fashioned preallocation of a char array with some conservative maximum size, then writing into it via *p++ or similar and hoping we got the calculation right. Now we have strbuf and dupcat, so we shouldn't ever have to do that. Fixed as many cases as I could find by searching for allocations of the form 'snewn(foo, char)'. Particularly worth a mention was the Windows GSSAPI setup code, which was directly using the Win32 Registry API, and looks much more legible using the windows/utils/registry.c wrappers. (But that was why I had to enhance them in the previous commit so as to be able to open registry keys read-only: without that, the open operation would actually fail on this key, which is not user-writable.) Also unix/askpass.c, which was doing a careful reallocation of its buffer to avoid secrets being left behind in the vacated memory - which is now just a matter of ensuring we called strbuf_new_nm().
This commit is contained in:
@ -300,35 +300,21 @@ static INT_PTR CALLBACK LogProc(HWND hwnd, UINT msg,
|
||||
LB_GETSELITEMS,
|
||||
selcount,
|
||||
(LPARAM) selitems);
|
||||
int i;
|
||||
int size;
|
||||
char *clipdata;
|
||||
static unsigned char sel_nl[] = SEL_NL;
|
||||
static const unsigned char sel_nl[] = SEL_NL;
|
||||
|
||||
if (count == 0) { /* can't copy zero stuff */
|
||||
MessageBeep(0);
|
||||
break;
|
||||
}
|
||||
|
||||
size = 0;
|
||||
for (i = 0; i < count; i++)
|
||||
size +=
|
||||
strlen(getevent(selitems[i])) + sizeof(sel_nl);
|
||||
|
||||
clipdata = snewn(size, char);
|
||||
if (clipdata) {
|
||||
char *p = clipdata;
|
||||
for (i = 0; i < count; i++) {
|
||||
char *q = getevent(selitems[i]);
|
||||
int qlen = strlen(q);
|
||||
memcpy(p, q, qlen);
|
||||
p += qlen;
|
||||
memcpy(p, sel_nl, sizeof(sel_nl));
|
||||
p += sizeof(sel_nl);
|
||||
}
|
||||
write_aclip(hwnd, CLIP_SYSTEM, clipdata, size);
|
||||
sfree(clipdata);
|
||||
strbuf *sb = strbuf_new();
|
||||
for (int i = 0; i < count; i++) {
|
||||
char *q = getevent(selitems[i]);
|
||||
put_datapl(sb, ptrlen_from_asciz(q));
|
||||
put_data(sb, sel_nl, sizeof(sel_nl));
|
||||
}
|
||||
write_aclip(hwnd, CLIP_SYSTEM, sb->s, sb->len);
|
||||
strbuf_free(sb);
|
||||
sfree(selitems);
|
||||
|
||||
for (i = 0; i < (ninitial + ncircular); i++)
|
||||
|
Reference in New Issue
Block a user