ssize_t ret;
size = i_stream_get_data_size(stream->parent);
- if (size >= 3)
+ if (size > 0)
return 1;
- /* we have less than one base64 block.
- see if there is more data available. */
ret = i_stream_read_memarea(stream->parent);
if (ret <= 0) {
stream->istream.stream_errno = stream->parent->stream_errno;
buffer_t buf;
data = i_stream_get_data(stream->parent, &size);
- if (size == 0 || (size < 3 && !stream->parent->eof))
+ if (size == 0)
return 0;
out_size = base64_encode_get_size(b64enc, size);
buffer_avail);
if (base64_encode_finish(b64enc, &buf))
stream->istream.eof = TRUE;
+ i_assert(buf.used > 0);
+
stream->pos += buf.used;
return 1;
}
if (ret == 0)
return 0;
if (ret < 0) {
+ if (stream->istream.stream_errno != 0)
+ return -1;
if (i_stream_get_data_size(stream->parent) == 0)
break;
/* add the final partial block */
post_count = stream->pos - stream->skip;
} while (ret == 0 && pre_count == post_count);
- if (ret < 0) {
- if (ret == -2)
- return ret;
+ if (ret == -2) {
+ if (pre_count == post_count)
+ return -2;
+ } else if (ret < 0) {
if (i_stream_get_data_size(stream->parent) == 0) {
+ i_assert(post_count == pre_count);
pre_count = stream->pos - stream->skip;
ret = i_stream_base64_finish_encode(bstream);
post_count = stream->pos - stream->skip;
if (ret <= 0)
return ret;
}
- if (pre_count == post_count)
+ if (pre_count == post_count) {
+ stream->istream.eof = TRUE;
return -1;
+ }
}
i_assert(post_count > pre_count);