diff options
author | Werner Koch <[email protected]> | 2014-07-30 09:04:55 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 2014-07-30 09:04:55 +0000 |
commit | 2cbd76f7911fc215845e89b50d6af5ff4a83dd77 (patch) | |
tree | b99309f67bb2e8f7d76a96cd0efad7d886b07174 | |
parent | w32: Get IOSPAWN flag back in sync with spawn helper. (diff) | |
download | gpgme-2cbd76f7911fc215845e89b50d6af5ff4a83dd77.tar.gz gpgme-2cbd76f7911fc215845e89b50d6af5ff4a83dd77.zip |
Fix possible realloc overflow for gpgsm and uiserver engines.
* src/engine-gpgsm.c (status_handler):
* src/engine-uiserver.c (status_handler):
--
After a realloc (realloc is also used for initial alloc) the allocated
size if the buffer is not correctly recorded. Thus an overflow can be
introduced by receiving data with different line lengths in a specific
order. This is not easy exploitable because libassuan constructs the
line. However a crash has been reported and thus it might be possible
to constructs an exploit.
CVE-id: CVE-2014-3564
Reported-by: Tomáš Trnka
-rw-r--r-- | NEWS | 3 | ||||
-rw-r--r-- | src/engine-gpgsm.c | 2 | ||||
-rw-r--r-- | src/engine-uiserver.c | 2 |
3 files changed, 5 insertions, 2 deletions
@@ -1,6 +1,9 @@ Noteworthy changes in version 1.5.1 (unreleased) [C__/A__/R_] ------------------------------------------------------------- + * Fix possible overflow in gpgsm and uiserver engines. + [CVE-2014-35640] + * Add support for GnuPG 2.1's --with-secret option. * Interface changes relative to the 1.5.0 release: diff --git a/src/engine-gpgsm.c b/src/engine-gpgsm.c index 8ec15985..3a837577 100644 --- a/src/engine-gpgsm.c +++ b/src/engine-gpgsm.c @@ -836,7 +836,7 @@ status_handler (void *opaque, int fd) else { *aline = newline; - gpgsm->colon.attic.linesize += linelen + 1; + gpgsm->colon.attic.linesize = *alinelen + linelen + 1; } } if (!err) diff --git a/src/engine-uiserver.c b/src/engine-uiserver.c index 2738c366..a7184b7a 100644 --- a/src/engine-uiserver.c +++ b/src/engine-uiserver.c @@ -698,7 +698,7 @@ status_handler (void *opaque, int fd) else { *aline = newline; - uiserver->colon.attic.linesize += linelen + 1; + uiserver->colon.attic.linesize = *alinelen + linelen + 1; } } if (!err) |