Skip to content

Commit

Permalink
lib: Fixed ostream-failure-at with blocking parent stream.
Browse files Browse the repository at this point in the history
Blocking ostream returns either a full success or a full failure. It can't
return that only n/m bytes were written.

Fixes assert:
Panic: file ostream.c: line 255 (o_stream_sendv_int): assertion failed: (!stream->blocking)
  • Loading branch information
sirainen committed Oct 13, 2016
1 parent 2d3f055 commit bf4a242
Showing 1 changed file with 15 additions and 2 deletions.
17 changes: 15 additions & 2 deletions src/lib/ostream-failure-at.c
Expand Up @@ -30,10 +30,23 @@ o_stream_failure_at_sendv(struct ostream_private *stream,
unsigned int i;
struct const_iovec *iov_dup;
unsigned int iov_dup_count;
uoff_t bytes_until_failure;
uoff_t bytes_until_failure, blocking_bytes_count = 0;
ssize_t ret;

if (fstream->failure_offset <= stream->ostream.offset) {
if (stream->ostream.blocking) {
/* blocking ostream must return either a full success or a
failure. if the current write would go past failure_offset,
return a failure now before writing anything. */
for (i = 0; i < iov_count; i++)
blocking_bytes_count += iov[i].iov_len;
if (blocking_bytes_count > 0) {
/* if we're exactly at the failure offset after this
write, fail it only on the next write. */
blocking_bytes_count--;
}
}

if (fstream->failure_offset <= stream->ostream.offset + blocking_bytes_count) {
io_stream_set_error(&stream->iostream, "%s",
fstream->error_string);
stream->ostream.stream_errno = errno = EIO;
Expand Down

0 comments on commit bf4a242

Please sign in to comment.