On Fri, 2011-10-28 at 23:10 +0200, Gergely Nagy wrote:
After the fix, when the starting position is buffer[i0].length - ofs, we get the correct value of 200, and all is well.
Reported-by: SZALAY Attila <sasa@balabit.hu> Signed-off-by: Gergely Nagy <algernon@balabit.hu> --- lib/logproto.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/lib/logproto.c b/lib/logproto.c index bdf9695..5047c98 100644 --- a/lib/logproto.c +++ b/lib/logproto.c @@ -299,7 +299,7 @@ log_proto_file_writer_flush(LogProto *s) /* allocate and copy the remaning data */ self->partial = (guchar *)g_malloc(self->partial_len); ofs = sum - rc; /* the length of the remaning (not processed) chunk in the first message */ - memcpy(self->partial, self->buffer[i0].iov_base + rc - (i0 > 0 ? (sum - self->buffer[i0 - 1].iov_len) : 0), ofs); + memcpy(self->partial, self->buffer[i0].iov_len - ofs, ofs); i = i0 + 1; while (i < self->buf_count) {
I think this patch has some problem too. My advise is th following line: memcpy(self->partial, self->buffer[i0].iov_base + (self->buffer[i0].iov_len - ofs), ofs); But I think that the following patch is a bit more readable: Reported-by: SZALAY Attila <sasa@balabit.hu> Signed-off-by: SZALAY Attila <sasa@balabit.hu> diff --git a/lib/logproto.c b/lib/logproto.c index 9ee6ec5..43f015f 100644 --- a/lib/logproto.c +++ b/lib/logproto.c @@ -271,7 +271,7 @@ static LogProtoStatus log_proto_file_writer_flush(LogProto *s) { LogProtoFileWriter *self = (LogProtoFileWriter *)s; - gint rc, i, i0, sum, ofs; + gint rc, i, i0, sum, ofs, pos; /* we might be called from log_writer_deinit() without having a buffer at all */ @@ -314,7 +314,8 @@ log_proto_file_writer_flush(LogProto *s) /* allocate and copy the remaning data */ self->partial = (guchar *)g_malloc(self->partial_len); ofs = sum - rc; /* the length of the remaning (not processed) chunk in the first message */ - memcpy(self->partial, self->buffer[i0].iov_base + rc - (i0 > 0 ? (sum - self->buffer[i0 - 1].iov_len) : 0), ofs); + pos = self->buffer[i0].iov_len - ofs; + memcpy(self->partial, self->buffer[i0].iov_base + pos, ofs); i = i0 + 1; while (i < self->buf_count) { -- Attila Szalay Support (L3) Team Leader e-mail: attila.szalay@balabit.com phone: +36 1 398 6707 BalaBit IT Security www.balabit.com H-1117 Budapest, Aliz street 2. This Communication is Confidential. We only send and receive email on the basis of the term set out at http://www.balabit.com/disclaimer/.