Fix parsing of long lines.
This commit is contained in:
parent
63ea0d6663
commit
5a19f6d421
@ -1,3 +1,9 @@
|
|||||||
|
2008-06-20 Werner Koch <wk@g10code.com>
|
||||||
|
|
||||||
|
* engine-gpgconf.c (gpgconf_read): Change ARGV initialization for
|
||||||
|
compatibility with old compilers. Fix amount of memmove. Fix
|
||||||
|
CR removal.
|
||||||
|
|
||||||
2008-06-19 Werner Koch <wk@g10code.com>
|
2008-06-19 Werner Koch <wk@g10code.com>
|
||||||
|
|
||||||
* gpgme.h (GPGME_CONF_PATHNAME): Replace by GPGME_CONF_FILENAME,
|
* gpgme.h (GPGME_CONF_PATHNAME): Replace by GPGME_CONF_FILENAME,
|
||||||
|
@ -199,7 +199,7 @@ gpgconf_read (void *engine, char *arg1, char *arg2,
|
|||||||
#define LINELENGTH 1024
|
#define LINELENGTH 1024
|
||||||
char linebuf[LINELENGTH] = "";
|
char linebuf[LINELENGTH] = "";
|
||||||
int linelen = 0;
|
int linelen = 0;
|
||||||
char *argv[] = { NULL /* file_name */, arg1, arg2, 0 };
|
char *argv[4] = { NULL /* file_name */, NULL, NULL, NULL };
|
||||||
int rp[2];
|
int rp[2];
|
||||||
struct spawn_fd_item_s pfd[] = { {0, -1}, {-1, -1} };
|
struct spawn_fd_item_s pfd[] = { {0, -1}, {-1, -1} };
|
||||||
struct spawn_fd_item_s cfd[] = { {-1, 1 /* STDOUT_FILENO */}, {-1, -1} };
|
struct spawn_fd_item_s cfd[] = { {-1, 1 /* STDOUT_FILENO */}, {-1, -1} };
|
||||||
@ -207,6 +207,10 @@ gpgconf_read (void *engine, char *arg1, char *arg2,
|
|||||||
int nread;
|
int nread;
|
||||||
char *mark = NULL;
|
char *mark = NULL;
|
||||||
|
|
||||||
|
argv[1] = arg1;
|
||||||
|
argv[2] = arg2;
|
||||||
|
|
||||||
|
|
||||||
/* FIXME: Deal with engine->home_dir. */
|
/* FIXME: Deal with engine->home_dir. */
|
||||||
|
|
||||||
/* _gpgme_engine_new guarantees that this is not NULL. */
|
/* _gpgme_engine_new guarantees that this is not NULL. */
|
||||||
@ -243,20 +247,21 @@ gpgconf_read (void *engine, char *arg1, char *arg2,
|
|||||||
{
|
{
|
||||||
lastmark = mark;
|
lastmark = mark;
|
||||||
if (mark > line && mark[-1] == '\r')
|
if (mark > line && mark[-1] == '\r')
|
||||||
mark--;
|
mark[-1] = '\0';
|
||||||
*mark = '\0';
|
else
|
||||||
|
mark[0] = '\0';
|
||||||
|
|
||||||
/* Got a full line. Due to the CR removal code (which
|
/* Got a full line. Due to the CR removal code (which
|
||||||
occurs only on Windows) we might be one-off and thus
|
occurs only on Windows) we might be one-off and thus
|
||||||
would see empty lines. Don't pass them to the
|
would see empty lines. Don't pass them to the
|
||||||
callback. */
|
callback. */
|
||||||
err = *line? (*cb) (hook, line) : NULL;
|
err = *line? (*cb) (hook, line) : 0;
|
||||||
if (err)
|
if (err)
|
||||||
goto leave;
|
goto leave;
|
||||||
}
|
}
|
||||||
|
|
||||||
nused = lastmark? (lastmark + 1 - linebuf) : 0;
|
nused = lastmark? (lastmark + 1 - linebuf) : 0;
|
||||||
memmove (linebuf, linebuf + nused, nused);
|
memmove (linebuf, linebuf + nused, linelen - nused);
|
||||||
linelen -= nused;
|
linelen -= nused;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user