while (i < 4 && mlen > 2) {
memcpy(&len, data, 2);
len = ntohs(len);
+ if (len == 0 || len > mlen-2)
+ break;
data += 2;
mlen -= 2;
pos += 2;
- if (len == 0 || len > mlen)
- break;
switch(i++) {
case 0:
if (i < 4) {
io_stream_set_error(&stream->istream.iostream, "Invalid or corrupted header");
- stream->istream.istream.stream_errno = EINVAL;
+ /* was it consumed? */
+ stream->istream.istream.stream_errno =
+ mlen > 2 ? EINVAL : EPIPE;
return -1;
}
return -1;
else if (ret == 0) {
io_stream_set_error(&stream->istream.iostream, "Decryption error: truncate header length");
- stream->istream.istream.stream_errno = EINVAL;
+ stream->istream.istream.stream_errno = EPIPE;
return -1;
}
stream->initialized = TRUE;
io_stream_set_error(&stream->iostream,
"Decryption error: %s",
"Input truncated in decryption header");
- stream->istream.stream_errno = EINVAL;
+ stream->istream.stream_errno = EPIPE;
return -1;
}
if (hret == 0 && stream->parent->eof) {
/* not encrypted by us */
- stream->istream.stream_errno = EINVAL;
+ stream->istream.stream_errno = EPIPE;
io_stream_set_error(&stream->iostream,
"Truncated header");
return -1;