Fixed a bug reading from gpgconf.

This commit is contained in:
Werner Koch 2008-04-28 18:42:56 +00:00
parent a69c74e4ef
commit 914ace7a37
5 changed files with 32 additions and 16 deletions

View File

@ -1,3 +1,7 @@
2008-04-01 Werner Koch <wk@g10code.com>
* configure.ac (AC_INIT): Fix quoting.
2008-01-30 Marcus Brinkmann <marcus@g10code.de> 2008-01-30 Marcus Brinkmann <marcus@g10code.de>
* configure.ac: Bump required version of automake up to 1.10. * configure.ac: Bump required version of automake up to 1.10.

View File

@ -36,7 +36,8 @@ m4_define(my_issvn, [yes])
m4_define([svn_revision], m4_esyscmd([echo -n $( (svn info 2>/dev/null \ m4_define([svn_revision], m4_esyscmd([echo -n $( (svn info 2>/dev/null \
|| echo 'Revision: 0')|sed -n '/^Revision:/ {s/[^0-9]//gp;q;}')])) || echo 'Revision: 0')|sed -n '/^Revision:/ {s/[^0-9]//gp;q;}')]))
AC_INIT([gpgme], my_version[]m4_if(my_issvn,[yes],[-svn[]svn_revision]), AC_INIT([gpgme],
[my_version[]m4_if(my_issvn,[yes],[-svn[]svn_revision])],
[bug-gpgme@gnupg.org]) [bug-gpgme@gnupg.org])

View File

@ -1,3 +1,8 @@
2008-04-28 Werner Koch <wk@g10code.com>
* engine-gpgconf.c (gpgconf_read): Fixed segv. Avoid memmove for
each line.
2008-04-22 Marcus Brinkmann <marcus@g10code.de> 2008-04-22 Marcus Brinkmann <marcus@g10code.de>
* w32-qt-io.cpp, kdpipeiodevice.cpp: New versions from Frank * w32-qt-io.cpp, kdpipeiodevice.cpp: New versions from Frank

View File

@ -198,7 +198,7 @@ gpgconf_read (void *engine, char *arg1, char *arg2,
struct engine_gpgconf *gpgconf = engine; struct engine_gpgconf *gpgconf = engine;
gpgme_error_t err = 0; gpgme_error_t err = 0;
#define LINELENGTH 1024 #define LINELENGTH 1024
char line[LINELENGTH] = ""; char linebuf[LINELENGTH] = "";
int linelen = 0; int linelen = 0;
char *argv[] = { NULL /* file_name */, arg1, arg2, 0 }; char *argv[] = { NULL /* file_name */, arg1, arg2, 0 };
int rp[2]; int rp[2];
@ -229,28 +229,33 @@ gpgconf_read (void *engine, char *arg1, char *arg2,
do do
{ {
nread = _gpgme_io_read (rp[0], &line[linelen], LINELENGTH - linelen - 1); nread = _gpgme_io_read (rp[0],
linebuf + linelen, LINELENGTH - linelen - 1);
if (nread > 0) if (nread > 0)
{ {
linelen += nread; char *line;
line[linelen] = '\0'; const char *lastmark = NULL;
size_t nused;
while ((mark = strchr (line, '\n'))) linelen += nread;
linebuf[linelen] = '\0';
for (line=linebuf; (mark = strchr (line, '\n')); line = mark+1 )
{ {
char *eol = mark; lastmark = mark;
if (mark > line && mark[-1] == '\r')
if (eol > line && eol[-1] == '\r') mark--;
eol--; *mark = '\0';
*eol = '\0';
/* Got a full line. */ /* Got a full line. */
err = (*cb) (hook, line); err = (*cb) (hook, line);
if (err) if (err)
break; goto leave;
linelen -= mark + 1 - line;
memmove (line, mark + 1, linelen);
} }
nused = lastmark? (lastmark + 1 - linebuf) : 0;
memmove (linebuf, linebuf + nused, nused);
linelen -= nused;
} }
} }
while (nread > 0 && linelen < LINELENGTH - 1); while (nread > 0 && linelen < LINELENGTH - 1);
@ -260,6 +265,7 @@ gpgconf_read (void *engine, char *arg1, char *arg2,
if (!err && nread > 0) if (!err && nread > 0)
err = gpg_error (GPG_ERR_LINE_TOO_LONG); err = gpg_error (GPG_ERR_LINE_TOO_LONG);
leave:
_gpgme_io_close (rp[0]); _gpgme_io_close (rp[0]);
return err; return err;

View File

@ -72,7 +72,7 @@ extern "C" {
AM_PATH_GPGME macro) check that this header matches the installed AM_PATH_GPGME macro) check that this header matches the installed
library. Warning: Do not edit the next line. configure will do library. Warning: Do not edit the next line. configure will do
that for you! */ that for you! */
#define GPGME_VERSION "1.1.7-svn1301" #define GPGME_VERSION "1.1.7-svn1307"