Commit 7c321e8a authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

decomp: fix reading after peeking

parent 71042a86
...@@ -153,26 +153,31 @@ static int Read (stream_t *stream, void *buf, unsigned int buflen) ...@@ -153,26 +153,31 @@ static int Read (stream_t *stream, void *buf, unsigned int buflen)
{ {
stream_sys_t *p_sys = stream->p_sys; stream_sys_t *p_sys = stream->p_sys;
block_t *peeked; block_t *peeked;
size_t bonus = 0;
ssize_t length; ssize_t length;
if ((peeked = p_sys->peeked) != NULL) if ((peeked = p_sys->peeked) != NULL)
{ { /* dequeue peeked data */
bonus = (buflen > peeked->i_buffer) ? peeked->i_buffer : buflen; length = (buflen > peeked->i_buffer) ? peeked->i_buffer : buflen;
memcpy (buf, peeked->p_buffer, bonus); memcpy (buf, peeked->p_buffer, length);
peeked->p_buffer += bonus; buf = ((char *)buf) + length;
peeked->i_buffer -= bonus; buflen -= length;
peeked->p_buffer += length;
peeked->i_buffer -= length;
if (peeked->i_buffer == 0) if (peeked->i_buffer == 0)
{ {
block_Release (peeked); block_Release (peeked);
p_sys->peeked = NULL; p_sys->peeked = NULL;
} }
p_sys->offset += length;
if (buflen > 0)
length += Read (stream, ((char *)buf) + length, buflen - length);
return length;
} }
length = net_Read (stream, p_sys->read_fd, NULL, buf, buflen, false); length = net_Read (stream, p_sys->read_fd, NULL, buf, buflen, false);
if (length < 0) if (length < 0)
return 0; return 0;
length += bonus;
p_sys->offset += length; p_sys->offset += length;
return length; return length;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment