aboutsummaryrefslogtreecommitdiffstats
path: root/common/iobuf.c
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2019-09-10 13:45:58 +0000
committerWerner Koch <[email protected]>2019-09-10 13:45:58 +0000
commit2f0fdab8aabdf408495163ef99b2d4d111f74692 (patch)
tree8ed0018cf23afd260baaa90df5f859033fe16bfb /common/iobuf.c
parentgpg: New option --use-keyboxd. (diff)
downloadgnupg-2f0fdab8aabdf408495163ef99b2d4d111f74692.tar.gz
gnupg-2f0fdab8aabdf408495163ef99b2d4d111f74692.zip
common: Allow a readlimit for iobuf_esopen.
* common/iobuf.c (file_es_filter_ctx_t): Add fields use_readlimit and readlimit. (file_es_filter): Implement them. (iobuf_esopen): Add new arg readlimit. * g10/decrypt-data.c (decrypt_data): Adjust for change. * g10/import.c (import_keys_es_stream): Ditto. -- This comes handy for (length,datablob) style streams. Signed-off-by: Werner Koch <[email protected]>
Diffstat (limited to 'common/iobuf.c')
-rw-r--r--common/iobuf.c37
1 files changed, 35 insertions, 2 deletions
diff --git a/common/iobuf.c b/common/iobuf.c
index 05944255f..db5d062cd 100644
--- a/common/iobuf.c
+++ b/common/iobuf.c
@@ -106,6 +106,8 @@ typedef struct
int keep_open;
int no_cache;
int eof_seen;
+ int use_readlimit; /* Take care of the readlimit. */
+ size_t readlimit; /* Number of bytes left to read. */
int print_only_name; /* Flags indicating that fname is not a real file. */
char fname[1]; /* Name of the file. */
} file_es_filter_ctx_t;
@@ -635,6 +637,34 @@ file_es_filter (void *opaque, int control, iobuf_t chain, byte * buf,
rc = -1;
*ret_len = 0;
}
+ else if (a->use_readlimit)
+ {
+ nbytes = 0;
+ if (!a->readlimit)
+ { /* eof */
+ a->eof_seen = 1;
+ rc = -1;
+ }
+ else
+ {
+ if (size > a->readlimit)
+ size = a->readlimit;
+ rc = es_read (f, buf, size, &nbytes);
+ if (rc == -1)
+ { /* error */
+ rc = gpg_error_from_syserror ();
+ log_error ("%s: read error: %s\n", a->fname,strerror (errno));
+ }
+ else if (!nbytes)
+ { /* eof */
+ a->eof_seen = 1;
+ rc = -1;
+ }
+ else
+ a->readlimit -= nbytes;
+ }
+ *ret_len = nbytes;
+ }
else
{
nbytes = 0;
@@ -1412,7 +1442,8 @@ iobuf_fdopen_nc (int fd, const char *mode)
iobuf_t
-iobuf_esopen (estream_t estream, const char *mode, int keep_open)
+iobuf_esopen (estream_t estream, const char *mode, int keep_open,
+ size_t readlimit)
{
iobuf_t a;
file_es_filter_ctx_t *fcx;
@@ -1424,7 +1455,9 @@ iobuf_esopen (estream_t estream, const char *mode, int keep_open)
fcx->fp = estream;
fcx->print_only_name = 1;
fcx->keep_open = keep_open;
- sprintf (fcx->fname, "[fd %p]", estream);
+ fcx->readlimit = readlimit;
+ fcx->use_readlimit = !!readlimit;
+ snprintf (fcx->fname, 30, "[fd %p]", estream);
a->filter = file_es_filter;
a->filter_ov = fcx;
file_es_filter (fcx, IOBUFCTRL_INIT, NULL, NULL, &len);