Skip to content

Commit

Permalink
lib: ostream-escaped: Fixed setting offset
Browse files Browse the repository at this point in the history
  • Loading branch information
sirainen committed May 18, 2016
1 parent bf87a52 commit bcab95c
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 11 deletions.
14 changes: 5 additions & 9 deletions src/lib/ostream-escaped.c
Expand Up @@ -40,7 +40,7 @@ static ssize_t
o_stream_escaped_send_chunk(struct escaped_ostream *estream,
const unsigned char *data, size_t len)
{
size_t i, max_buffer_size, flush_pos;
size_t i, max_buffer_size;
ssize_t ret;

max_buffer_size = I_MIN(o_stream_get_max_buffer_size(estream->ostream.parent),
Expand All @@ -50,24 +50,20 @@ o_stream_escaped_send_chunk(struct escaped_ostream *estream,
max_buffer_size = IO_BLOCK_SIZE;
}

flush_pos = str_len(estream->buf);
for (i = 0; i < len; i++) {
if (str_len(estream->buf) + 2 > max_buffer_size) { /* escaping takes at least two bytes */
estream->ostream.ostream.offset +=
str_len(estream->buf) - flush_pos;
ret = o_stream_escaped_send_outbuf(estream);
if (ret < 0)
if (ret < 0) {
estream->ostream.ostream.offset += i;
return ret;
flush_pos = str_len(estream->buf);
}
if (ret == 0)
break;
}
estream->format(estream->buf, data[i]);
estream->flushed = FALSE;
}
/* we'll return how many bytes of input we consumed, but ostream offset
contains how many bytes we actually wrote */
estream->ostream.ostream.offset += str_len(estream->buf) - flush_pos;
estream->ostream.ostream.offset += i;
return i;
}

Expand Down
7 changes: 5 additions & 2 deletions src/lib/test-ostream-escaped.c
Expand Up @@ -24,6 +24,7 @@ static void test_ostream_escaped_json(void)
iov[1].iov_len = 7;
test_assert(o_stream_sendv(os_encode, iov, 2) == 12);
test_assert(os_encode->offset == 12);
test_assert(os_sink->offset == 12);
test_assert(strcmp(str_c(str), "hello, world") == 0);

/* reset buffer */
Expand All @@ -33,7 +34,8 @@ static void test_ostream_escaped_json(void)
o_stream_set_max_buffer_size(os_encode, 10);
o_stream_set_max_buffer_size(os_sink, 100);
test_assert(o_stream_send(os_encode, "\x15\x00!\x00\x15\x11" "123456", 12) == 12);
test_assert(os_encode->offset == 2*6 + 1 + 3*6 + 6);
test_assert(os_encode->offset == 12);
test_assert(os_sink->offset == 2*6 + 1 + 3*6 + 6);
test_assert(strcmp(str_c(str), "\\u0015\\u0000!\\u0000\\u0015\\u0011123456") == 0);

/* reset buffer */
Expand All @@ -49,7 +51,8 @@ static void test_ostream_escaped_json(void)
o_stream_set_max_buffer_size(os_sink, 100);
ret += o_stream_send_str(os_encode, partial_input + ret);
test_assert(ret == (ssize_t)strlen(partial_input));
test_assert(os_encode->offset == str_len(str));
test_assert((ssize_t)os_encode->offset == ret);
test_assert(os_sink->offset == str_len(str));
test_assert(strcmp(str_c(str), "\\u0015!\\u0001?#&") == 0);

o_stream_unref(&os_encode);
Expand Down

0 comments on commit bcab95c

Please sign in to comment.