program-client-remote.c (dovecot-2.3.16) | : | program-client-remote.c (dovecot-2.3.17) | ||
---|---|---|---|---|
skipping to change at line 162 | skipping to change at line 162 | |||
} | } | |||
ssize_t reserve_mod = 0; | ssize_t reserve_mod = 0; | |||
if (stream->buffer != NULL && pos >= 1) { | if (stream->buffer != NULL && pos >= 1) { | |||
/* Retain/hide potential return code at end of | /* Retain/hide potential return code at end of | |||
buffer */ | buffer */ | |||
size_t old_reserved = reserved; | size_t old_reserved = reserved; | |||
reserved = (stream->buffer[pos - 1] == '\n' && | reserved = (stream->buffer[pos - 1] == '\n' && | |||
pos > 1 ? 2 : 1); | pos > 1 ? 2 : 1); | |||
reserve_mod = reserved - old_reserved; | reserve_mod = (ssize_t)reserved - (ssize_t)old_re served; | |||
pos -= reserved; | pos -= reserved; | |||
} | } | |||
if (ret == 0) { | if (ret == 0) { | |||
/* Parent already blocked, but we had to update | /* Parent already blocked, but we had to update | |||
pos first, to make sure reserved bytes are | pos first, to make sure reserved bytes are | |||
not visible to application. */ | not visible to application. */ | |||
break; | break; | |||
} | } | |||
if (ret >= reserve_mod) { | if (ret > 0 && ret >= reserve_mod) { | |||
/* Subtract additional reserved bytes */ | /* Subtract additional reserved bytes */ | |||
ret -= reserve_mod; | ret -= reserve_mod; | |||
} | } | |||
if (ret <= 0 && stream->parent->eof) { | if (ret <= 0 && stream->parent->eof) { | |||
/* Parent EOF and not more data to return; | /* Parent EOF and not more data to return; | |||
EOF here as well */ | EOF here as well */ | |||
i_assert(scstream->parsed_result); | i_assert(scstream->parsed_result); | |||
if (pos == 0) | if (pos == 0) | |||
i_stream_skip(stream->parent, reserved); | i_stream_skip(stream->parent, reserved); | |||
End of changes. 2 change blocks. | ||||
2 lines changed or deleted | 2 lines changed or added |