[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[SCM] GNU Mailutils branch, stream-cleanup, updated. rel-2_1-75-g0ee00fd
From: |
Sergey Poznyakoff |
Subject: |
[SCM] GNU Mailutils branch, stream-cleanup, updated. rel-2_1-75-g0ee00fd |
Date: |
Fri, 30 Apr 2010 00:00:31 +0000 |
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU Mailutils".
http://git.savannah.gnu.org/cgit/mailutils.git/commit/?id=0ee00fd5861514e757aa73b1e62ca9896b2461ff
The branch, stream-cleanup has been updated
via 0ee00fd5861514e757aa73b1e62ca9896b2461ff (commit)
from 2613500d4a50cf7d36e30eea6d7af915a38c8f7d (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 0ee00fd5861514e757aa73b1e62ca9896b2461ff
Author: Sergey Poznyakoff <address@hidden>
Date: Fri Apr 30 02:59:59 2010 +0300
Bugfixes in stream code.
* mailbox/amd.c (amd_body_stream_seek): Fix boundary checking.
Return ESPIPE on boundary error.
* mailbox/header.c (header_seek): Likewise.
* mailbox/memory_stream.c (_memory_seek): Likewise.
* mailbox/message.c (_message_stream_seek): Likewise.
* mailbox/message_stream.c (_message_seek): Likewise.
* mailbox/stdio_stream.c (stdio_seek): Likewise.
* mailbox/file_stream.c (fd_open): Invert error condition.
Fix computation of open flags.
Return immediately if open returns -1.
(fd_seek): Fix boundary checking.
Return ESPIPE on boundary error.
* mailbox/mapfile_stream.c (_mapfile_open): Fix flags calculation.
(_mapfile_seek): Fix boundary checking.
Return ESPIPE on boundary error.
* mailbox/streamref.c (_streamref_read): Fix calculation of the
top size boundary.
Return 0 bytes if seek returns ESPIPE.
(_streamref_seek): Return ESPIPE on boundary error.
* mailbox/base64.c (_base64_decoder, _base64_encoder): Do
not dereference iobuf if cmd is mu_filter_init or mu_filter_done.
* mailbox/binflt.c (_copy_codec, _bit7_coder): Likewise.
* mailbox/crlfflt.c (_crlf_encoder, _crlf_decoder): Likewise.
* mailbox/linelenflt.c (_ll_encoder): Likewise.
* mailbox/qpflt.c (_qp_decoder, _qp_encoder): Likewise.
* mailbox/mailcap.c (mu_mailcap_parse): Fix loop condition.
-----------------------------------------------------------------------
Summary of changes:
mailbox/amd.c | 4 ++--
mailbox/base64.c | 25 +++++++++++++++++--------
mailbox/binflt.c | 25 ++++++++++++++-----------
mailbox/crlfflt.c | 32 +++++++++++++++++++++-----------
mailbox/file_stream.c | 9 ++++++---
mailbox/header.c | 4 ++--
mailbox/linelenflt.c | 13 +++++++++----
mailbox/mailcap.c | 7 ++++---
mailbox/mapfile_stream.c | 6 +++---
mailbox/memory_stream.c | 4 ++--
mailbox/message.c | 2 +-
mailbox/message_stream.c | 2 +-
mailbox/qpflt.c | 25 +++++++++++++++++--------
mailbox/stdio_stream.c | 2 +-
mailbox/streamref.c | 18 ++++++++++++++++--
15 files changed, 116 insertions(+), 62 deletions(-)
diff --git a/mailbox/amd.c b/mailbox/amd.c
index 34e823f..befe43e 100644
--- a/mailbox/amd.c
+++ b/mailbox/amd.c
@@ -1652,8 +1652,8 @@ amd_body_stream_seek (mu_stream_t str, mu_off_t off, int
whence,
break;
}
- if (off < 0 || off > size)
- return EINVAL;
+ if (off < 0 || off >= size)
+ return ESPIPE;
rc = mu_stream_seek (mhm->stream, mhm->body_start + off, MU_SEEK_SET, NULL);
if (rc)
diff --git a/mailbox/base64.c b/mailbox/base64.c
index 156c4a8..fd0131e 100644
--- a/mailbox/base64.c
+++ b/mailbox/base64.c
@@ -114,10 +114,10 @@ _base64_decoder (void *xd MU_ARG_UNUSED,
size_t consumed = 0;
unsigned char data[4];
size_t nbytes = 0;
- const char *iptr = iobuf->input;
- size_t isize = iobuf->isize;
- char *optr = iobuf->output;
- size_t osize = iobuf->osize;
+ const char *iptr;
+ size_t isize;
+ char *optr;
+ size_t osize;
switch (cmd)
{
@@ -133,7 +133,12 @@ _base64_decoder (void *xd MU_ARG_UNUSED,
iobuf->osize = 3;
return mu_filter_moreoutput;
}
-
+
+ iptr = iobuf->input;
+ isize = iobuf->isize;
+ optr = iobuf->output;
+ osize = iobuf->osize;
+
while (consumed < isize && nbytes + 3 < osize)
{
while (i < 4 && consumed < isize)
@@ -179,9 +184,9 @@ _base64_encoder (void *xd MU_ARG_UNUSED,
int pad = 0;
const unsigned char *ptr = (const unsigned char*) iobuf->input;
size_t nbytes = 0;
- size_t isize = iobuf->isize;
- char *optr = iobuf->output;
- size_t osize = iobuf->osize;
+ size_t isize;
+ char *optr;
+ size_t osize;
switch (cmd)
{
@@ -208,6 +213,10 @@ _base64_encoder (void *xd MU_ARG_UNUSED,
return mu_filter_moreoutput;
}
+ isize = iobuf->isize;
+ optr = iobuf->output;
+ osize = iobuf->osize;
+
while ((consumed + 3 <= isize && nbytes + 4 <= osize) || pad)
{
unsigned char c1 = 0, c2 = 0, x = '=', y = '=';
diff --git a/mailbox/binflt.c b/mailbox/binflt.c
index 003b665..d3de518 100644
--- a/mailbox/binflt.c
+++ b/mailbox/binflt.c
@@ -27,10 +27,7 @@ _copy_codec (void *xd MU_ARG_UNUSED,
enum mu_filter_command cmd,
struct mu_filter_io *iobuf)
{
- const char *iptr = iobuf->input;
- size_t isize = iobuf->isize;
- char *optr = iobuf->output;
- size_t osize = iobuf->osize;
+ size_t osize;
switch (cmd)
{
@@ -41,9 +38,10 @@ _copy_codec (void *xd MU_ARG_UNUSED,
break;
}
- if (osize > isize)
- osize = isize;
- memcpy (optr, iptr, osize);
+ osize = iobuf->osize;
+ if (osize > iobuf->isize)
+ osize = iobuf->isize;
+ memcpy (iobuf->output, iobuf->input, osize);
iobuf->isize = osize;
iobuf->osize = osize;
return mu_filter_ok;
@@ -55,10 +53,10 @@ _bit7_coder (void *xd MU_ARG_UNUSED,
struct mu_filter_io *iobuf)
{
size_t i;
- const unsigned char *iptr = (const unsigned char *) iobuf->input;
- size_t isize = iobuf->isize;
- char *optr = iobuf->output;
- size_t osize = iobuf->osize;
+ const unsigned char *iptr;
+ size_t isize;
+ char *optr;
+ size_t osize;
switch (cmd)
{
@@ -69,6 +67,11 @@ _bit7_coder (void *xd MU_ARG_UNUSED,
break;
}
+ iptr = (const unsigned char *) iobuf->input;
+ isize = iobuf->isize;
+ optr = iobuf->output;
+ osize = iobuf->osize;
+
if (osize > isize)
osize = isize;
for (i = 0; i < osize; i++)
diff --git a/mailbox/crlfflt.c b/mailbox/crlfflt.c
index a07e08d..3e9bab0 100644
--- a/mailbox/crlfflt.c
+++ b/mailbox/crlfflt.c
@@ -31,10 +31,10 @@ _crlf_encoder (void *xd MU_ARG_UNUSED,
struct mu_filter_io *iobuf)
{
size_t i, j;
- const char *iptr = iobuf->input;
- size_t isize = iobuf->isize;
- char *optr = iobuf->output;
- size_t osize = iobuf->osize;
+ const unsigned char *iptr;
+ size_t isize;
+ char *optr;
+ size_t osize;
switch (cmd)
{
@@ -45,9 +45,14 @@ _crlf_encoder (void *xd MU_ARG_UNUSED,
break;
}
+ iptr = (const unsigned char *) iobuf->input;
+ isize = iobuf->isize;
+ optr = iobuf->output;
+ osize = iobuf->osize;
+
for (i = j = 0; i < isize && j < osize; i++)
{
- unsigned char c = *(unsigned char*)iptr++;
+ unsigned char c = *iptr++;
if (c == '\n')
{
if (j + 1 == osize)
@@ -80,10 +85,10 @@ _crlf_decoder (void *xd MU_ARG_UNUSED,
struct mu_filter_io *iobuf)
{
size_t i, j;
- const char *iptr = iobuf->input;
- size_t isize = iobuf->isize;
- char *optr = iobuf->output;
- size_t osize = iobuf->osize;
+ const unsigned char *iptr;
+ size_t isize;
+ char *optr;
+ size_t osize;
switch (cmd)
{
@@ -94,14 +99,19 @@ _crlf_decoder (void *xd MU_ARG_UNUSED,
break;
}
+ iptr = (const unsigned char *) iobuf->input;
+ isize = iobuf->isize;
+ optr = iobuf->output;
+ osize = iobuf->osize;
+
for (i = j = 0; i < isize && j < osize; i++)
{
- unsigned char c = *(unsigned char*)iptr++;
+ unsigned char c = *iptr++;
if (c == '\r')
{
if (i + 1 == isize)
break;
- if (*(unsigned char*)iptr == '\n')
+ if (*iptr == '\n')
continue;
}
optr[j++] = c;
diff --git a/mailbox/file_stream.c b/mailbox/file_stream.c
index 69a5d6b..977004d 100644
--- a/mailbox/file_stream.c
+++ b/mailbox/file_stream.c
@@ -75,13 +75,13 @@ fd_open (struct _mu_stream *str)
int oflg;
int fd;
- if (fstr->filename)
+ if (!fstr->filename)
return EINVAL;
if (fstr->fd != -1)
fd_close (str);
/* Map the flags to the system equivalent. */
- if (fstr->stream.flags & MU_STREAM_RDWR)
+ if ((fstr->stream.flags & MU_STREAM_RDWR) == MU_STREAM_RDWR)
oflg = O_RDWR;
else if (fstr->stream.flags & (MU_STREAM_WRITE|MU_STREAM_APPEND))
oflg = O_WRONLY;
@@ -109,6 +109,9 @@ fd_open (struct _mu_stream *str)
else
fd = open (fstr->filename, oflg);
+ if (fd == -1)
+ return errno;
+
if (!(fstr->stream.flags & MU_STREAM_ALLOW_LINKS)
&& (fstr->stream.flags & (MU_STREAM_CREAT | MU_STREAM_RDWR |
MU_STREAM_APPEND)))
@@ -149,7 +152,7 @@ fd_seek (struct _mu_stream *str, mu_off_t off, int whence,
mu_off_t *presult)
{
struct _mu_file_stream *fstr = (struct _mu_file_stream *) str;
off = lseek (fstr->fd, off, whence);
- if (off <= 0)
+ if (off < 0)
return errno;
*presult = off;
return 0;
diff --git a/mailbox/header.c b/mailbox/header.c
index 5d23a98..50ff83f 100644
--- a/mailbox/header.c
+++ b/mailbox/header.c
@@ -956,8 +956,8 @@ header_seek (mu_stream_t str, mu_off_t off, int whence,
mu_off_t *presult)
break;
}
- if (off < 0 || off > hstr->hdr->size)
- return EINVAL;
+ if (off < 0 || off >= hstr->hdr->size)
+ return ESPIPE;
hstr->off = off;
return 0;
}
diff --git a/mailbox/linelenflt.c b/mailbox/linelenflt.c
index b487553..e3817de 100644
--- a/mailbox/linelenflt.c
+++ b/mailbox/linelenflt.c
@@ -34,10 +34,10 @@ _ll_encoder (void *xd,
struct mu_filter_io *iobuf)
{
struct _mu_linelen_filter *flt = xd;
- const char *iptr = iobuf->input;
- size_t isize = iobuf->isize;
- char *optr = iobuf->output;
- size_t osize = iobuf->osize;
+ const char *iptr;
+ size_t isize;
+ char *optr;
+ size_t osize;
size_t consumed, written;
switch (cmd)
@@ -50,6 +50,11 @@ _ll_encoder (void *xd,
break;
}
+ iptr = iobuf->input;
+ isize = iobuf->isize;
+ optr = iobuf->output;
+ osize = iobuf->osize;
+
for (consumed = written = 0; consumed < isize && written < osize; )
{
char *p;
diff --git a/mailbox/mailcap.c b/mailbox/mailcap.c
index d0815b0..d9e96f2 100644
--- a/mailbox/mailcap.c
+++ b/mailbox/mailcap.c
@@ -510,9 +510,9 @@ mu_mailcap_parse (mu_mailcap_t mailcap, mu_stream_t stream)
size_t n;
char *previous;
char *buffer;
- int buflen = 512;
+ size_t buflen = 512;
- buffer = malloc (buflen * sizeof (*buffer));
+ buffer = malloc (buflen);
if (buffer == NULL)
{
return ENOMEM;
@@ -532,7 +532,8 @@ mu_mailcap_parse (mu_mailcap_t mailcap, mu_stream_t stream)
if (status)
return status;
previous = NULL;
- while ((status = mu_stream_readline (stream, buffer, buflen, &n)) == 0)
+ while ((status = mu_stream_readline (stream, buffer, buflen, &n)) == 0
+ && n > 0)
{
int len;
diff --git a/mailbox/mapfile_stream.c b/mailbox/mapfile_stream.c
index 66bcca4..a54c65c 100644
--- a/mailbox/mapfile_stream.c
+++ b/mailbox/mapfile_stream.c
@@ -266,7 +266,7 @@ _mapfile_open (mu_stream_t stream)
mfs->fd = -1;
}
/* Map the flags to the system equivalent */
- if (flags & MU_STREAM_RDWR)
+ if ((flags & MU_STREAM_RDWR) == MU_STREAM_RDWR)
{
mflag = PROT_READ | PROT_WRITE;
flg = O_RDWR;
@@ -331,8 +331,8 @@ _mapfile_seek (struct _mu_stream *str, mu_off_t off, int
whence, mu_off_t *presu
break;
}
- if (off < 0 || off > mfs->size)
- return EINVAL;
+ if (off < 0 || off >= mfs->size)
+ return ESPIPE;
mfs->offset = off;
*presult = off;
return 0;
diff --git a/mailbox/memory_stream.c b/mailbox/memory_stream.c
index 1f388fb..8e93e7b 100644
--- a/mailbox/memory_stream.c
+++ b/mailbox/memory_stream.c
@@ -185,8 +185,8 @@ _memory_seek (struct _mu_stream *stream, mu_off_t off, int
whence,
break;
}
- if (off < 0 || off > mfs->size)
- return EINVAL;
+ if (off < 0)
+ return ESPIPE;
mfs->offset = off;
*presult = off;
return 0;
diff --git a/mailbox/message.c b/mailbox/message.c
index b92815e..5d9a505 100644
--- a/mailbox/message.c
+++ b/mailbox/message.c
@@ -183,7 +183,7 @@ _message_stream_seek (struct _mu_stream *str, mu_off_t off,
int whence,
break;
}
if (off < 0 || off >= size)
- return EINVAL;
+ return ESPIPE;
switch (sp->state)
{
diff --git a/mailbox/message_stream.c b/mailbox/message_stream.c
index f5c3cc4..6b3cb7d 100644
--- a/mailbox/message_stream.c
+++ b/mailbox/message_stream.c
@@ -325,7 +325,7 @@ _message_seek (struct _mu_stream *stream, mu_off_t off, int
whence,
}
if (off < 0 || off >= size)
- return s->stream.last_err = EINVAL;
+ return ESPIPE;
s->offset = off;
*presult = off;
return 0;
diff --git a/mailbox/qpflt.c b/mailbox/qpflt.c
index cde2688..4d8db53 100644
--- a/mailbox/qpflt.c
+++ b/mailbox/qpflt.c
@@ -33,10 +33,10 @@ _qp_decoder (void *xd MU_ARG_UNUSED,
size_t consumed = 0;
size_t wscount = 0;
size_t nbytes = 0;
- const char *iptr = iobuf->input;
- size_t isize = iobuf->isize;
- char *optr = iobuf->output;
- size_t osize = iobuf->osize;
+ const char *iptr;
+ size_t isize;
+ char *optr;
+ size_t osize;
switch (cmd)
{
@@ -47,6 +47,11 @@ _qp_decoder (void *xd MU_ARG_UNUSED,
break;
}
+ iptr = iobuf->input;
+ isize = iobuf->isize;
+ optr = iobuf->output;
+ osize = iobuf->osize;
+
while (consumed < isize && nbytes < osize)
{
c = *iptr++;
@@ -159,10 +164,10 @@ _qp_encoder (void *xd MU_ARG_UNUSED,
size_t consumed = 0;
size_t nbytes = 0;
static const char _hexdigits[] = "0123456789ABCDEF";
- const char *iptr = iobuf->input;
- size_t isize = iobuf->isize;
- char *optr = iobuf->output;
- size_t osize = iobuf->osize;
+ const char *iptr;
+ size_t isize;
+ char *optr;
+ size_t osize;
switch (cmd)
{
@@ -173,6 +178,10 @@ _qp_encoder (void *xd MU_ARG_UNUSED,
break;
}
+ iptr = iobuf->input;
+ isize = iobuf->isize;
+ optr = iobuf->output;
+ osize = iobuf->osize;
nbytes = 0;
/* Strategy: check if we have enough room in the output buffer only
diff --git a/mailbox/stdio_stream.c b/mailbox/stdio_stream.c
index d401270..dac196c 100644
--- a/mailbox/stdio_stream.c
+++ b/mailbox/stdio_stream.c
@@ -147,7 +147,7 @@ stdio_seek (struct _mu_stream *str, mu_off_t off, int
whence, mu_off_t *presult)
}
if (off < 0)
- return EINVAL;
+ return ESPIPE;
fs->offset = off;
*presult = fs->offset;
diff --git a/mailbox/streamref.c b/mailbox/streamref.c
index 75d2209..04c8450 100644
--- a/mailbox/streamref.c
+++ b/mailbox/streamref.c
@@ -41,9 +41,17 @@ _streamref_read (struct _mu_stream *str, char *buf, size_t
bufsize,
struct _mu_streamref *sp = (struct _mu_streamref *)str;
int rc;
size_t nread;
- rc = mu_stream_seek (sp->transport, sp->offset, MU_SEEK_SET, NULL);
+ mu_off_t off;
+
+ rc = mu_stream_seek (sp->transport, sp->offset, MU_SEEK_SET, &off);
if (rc == 0)
{
+ if (sp->end)
+ {
+ size_t size = sp->end - off + 1;
+ if (size < bufsize)
+ bufsize = size;
+ }
rc = mu_stream_read (sp->transport, buf, bufsize, &nread);
if (rc == 0)
{
@@ -51,6 +59,12 @@ _streamref_read (struct _mu_stream *str, char *buf, size_t
bufsize,
*pnread = nread;
}
}
+ else if (rc == ESPIPE)
+ {
+ *pnread = 0;
+ str->flags |= _MU_STR_EOF;
+ return 0;
+ }
return streamref_return (sp, rc);
}
@@ -143,7 +157,7 @@ _streamref_seek (struct _mu_stream *str, mu_off_t off, int
whence,
}
if (off < 0 || off >= size)
- return sp->stream.last_err = EINVAL;
+ return sp->stream.last_err = ESPIPE;
rc = mu_stream_seek (sp->transport, sp->start + off, MU_SEEK_SET,
&sp->offset);
if (rc)
hooks/post-receive
--
GNU Mailutils
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [SCM] GNU Mailutils branch, stream-cleanup, updated. rel-2_1-75-g0ee00fd,
Sergey Poznyakoff <=