diff options
author | Matthias Andree <matthias.andree@gmx.de> | 2021-02-14 10:39:42 +0100 |
---|---|---|
committer | Matthias Andree <matthias.andree@gmx.de> | 2021-02-14 10:41:08 +0100 |
commit | 38653ec3ca6665dfde1ea94f094b00a5c06fcc4f (patch) | |
tree | 7cb1929fc9e0337dfee23bd952259eef9ec233bc /imap.c | |
parent | 0f55cd47f61ec021801ac778ed3f1995f7ae686b (diff) | |
download | fetchmail-38653ec3ca6665dfde1ea94f094b00a5c06fcc4f.tar.gz fetchmail-38653ec3ca6665dfde1ea94f094b00a5c06fcc4f.tar.bz2 fetchmail-38653ec3ca6665dfde1ea94f094b00a5c06fcc4f.zip |
imap.c: fix memory leak in timeout situation for LOGIN auth
...which uses siglongjmp() so that gen_transact() will not return.
Note, just in case, this uses local static buffers and is not thread-safe.
Diffstat (limited to 'imap.c')
-rw-r--r-- | imap.c | 8 |
1 files changed, 5 insertions, 3 deletions
@@ -639,11 +639,13 @@ static int imap_getauth(int sock, struct query *ctl, char *greeting) || ctl->server.authenticate == A_PASSWORD) { /* these sizes guarantee no buffer overflow */ - char *remotename, *password; + static char *remotename, *password; /* XXX FIXME: not thread-safe but is leaky on timeout */ size_t rnl, pwl; rnl = 2 * strlen(ctl->remotename) + 1; pwl = 2 * strlen(ctl->password) + 1; + if (remotename) xfree(remotename); remotename = (char *)xmalloc(rnl); + if (password) xfree(password); password = (char *)xmalloc(pwl); imap_canonicalize(remotename, ctl->remotename, rnl); @@ -654,8 +656,8 @@ static int imap_getauth(int sock, struct query *ctl, char *greeting) memset(shroud, 0x55, sizeof(shroud)); shroud[0] = '\0'; memset(password, 0x55, strlen(password)); - free(password); - free(remotename); + xfree(password); + xfree(remotename); if (ok) { if(ctl->server.authenticate != A_ANY) |