1
0
mirror of git://git.gnupg.org/gnupg.git synced 2025-03-26 22:29:58 +01:00

* assuan-buffer.c (_assuan_read_line): Deal with reads of more

than a line.
* assuan-defs.h: Add space in the context for this.
This commit is contained in:
Werner Koch 2001-11-24 21:10:22 +00:00
parent 1e443ad637
commit d3a626ba68
3 changed files with 41 additions and 8 deletions

7
assuan/ChangeLog Normal file
View File

@ -0,0 +1,7 @@
2001-11-24 Werner Koch <wk@gnupg.org>
* assuan-buffer.c (_assuan_read_line): Deal with reads of more
than a line.
* assuan-defs.h: Add space in the context for this.

View File

@ -78,7 +78,7 @@ readline (int fd, char *buf, size_t buflen, int *r_nread, int *eof)
for (; n && *p != '\n'; n--, p++) for (; n && *p != '\n'; n--, p++)
; ;
if (n) if (n)
break; break; /* at least one full line available - that's enough for now */
} }
return 0; return 0;
@ -95,7 +95,26 @@ _assuan_read_line (ASSUAN_CONTEXT ctx)
if (ctx->inbound.eof) if (ctx->inbound.eof)
return -1; return -1;
rc = readline (ctx->inbound.fd, line, LINELENGTH, &nread, &ctx->inbound.eof); if (ctx->inbound.attic.linelen)
{
memcpy (line, ctx->inbound.attic.line, ctx->inbound.attic.linelen);
nread = ctx->inbound.attic.linelen;
ctx->inbound.attic.linelen = 0;
for (n=0; n < nread && line[n] != '\n'; n++)
;
if (n < nread)
rc = 0; /* found another line in the attic */
else
{ /* read the rest */
n = nread;
assert (n < LINELENGTH);
rc = readline (ctx->inbound.fd, line + n, LINELENGTH - n,
&nread, &ctx->inbound.eof);
}
}
else
rc = readline (ctx->inbound.fd, line, LINELENGTH,
&nread, &ctx->inbound.eof);
if (rc) if (rc)
return ASSUAN_Read_Error; return ASSUAN_Read_Error;
if (!nread) if (!nread)
@ -104,15 +123,18 @@ _assuan_read_line (ASSUAN_CONTEXT ctx)
return -1; return -1;
} }
for (n=nread-1; n>=0 ; n--) for (n=0; n < nread; n++)
{ {
if (line[n] == '\n') if (line[n] == '\n')
{ {
if (n != nread-1) if (n+1 < nread)
{ {
fprintf (stderr, "DBG-assuan: %d bytes left over after read\n", n++;
nread-1 - n); /* we have to copy the rest because the handlers are
/* fixme: store them for the next read */ allowed to modify the passed buffer */
memcpy (ctx->inbound.attic.line, line+n, nread-n);
ctx->inbound.attic.linelen = nread-n;
n--;
} }
if (n && line[n-1] == '\r') if (n && line[n-1] == '\r')
n--; n--;

View File

@ -24,7 +24,7 @@
#include <sys/types.h> #include <sys/types.h>
#include "assuan.h" #include "assuan.h"
#define LINELENGTH 1002 /* 1000 + [CR,]LF */ #define LINELENGTH 102 /* 1000 + [CR,]LF */
struct cmdtbl_s { struct cmdtbl_s {
const char *name; const char *name;
@ -45,6 +45,10 @@ struct assuan_context_s {
int linelen; /* w/o CR, LF - might not be the same as int linelen; /* w/o CR, LF - might not be the same as
strlen(line) due to embedded nuls. However a nul strlen(line) due to embedded nuls. However a nul
is always written at this pos */ is always written at this pos */
struct {
char line[LINELENGTH];
int linelen ;
} attic;
} inbound; } inbound;
struct { struct {