summaryrefslogtreecommitdiff
path: root/src/input/input_pnm.c
diff options
context:
space:
mode:
authorDarren Salt <linux@youmustbejoking.demon.co.uk>2009-01-05 14:50:58 +0000
committerDarren Salt <linux@youmustbejoking.demon.co.uk>2009-01-05 14:50:58 +0000
commit5347abe5764b0a0ff3ef1d357ce9934a425758fa (patch)
tree16114922f1fe3862535ef1898da393648522d48b /src/input/input_pnm.c
parent0907a74b5fa7b8b439f1f8f5db239c7586bfb12d (diff)
parent8f725b5644ac910294fbe28929ddc98cd1d2ad38 (diff)
downloadxine-lib-5347abe5764b0a0ff3ef1d357ce9934a425758fa.tar.gz
xine-lib-5347abe5764b0a0ff3ef1d357ce9934a425758fa.tar.bz2
Merge security fixes.
Diffstat (limited to 'src/input/input_pnm.c')
-rw-r--r--src/input/input_pnm.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/src/input/input_pnm.c b/src/input/input_pnm.c
index 669d24d28..af2b8add2 100644
--- a/src/input/input_pnm.c
+++ b/src/input/input_pnm.c
@@ -83,7 +83,8 @@ static off_t pnm_plugin_read (input_plugin_t *this_gen,
lprintf ("pnm_plugin_read: %"PRId64" bytes ...\n", len);
n = pnm_read (this->pnm, buf, len);
- this->curpos += n;
+ if (n >= 0)
+ this->curpos += n;
return n;
}
@@ -96,6 +97,11 @@ static buf_element_t *pnm_plugin_read_block (input_plugin_t *this_gen,
lprintf ("pnm_plugin_read_block: %"PRId64" bytes...\n", todo);
+ if (todo < 0 || todo > buf->size) {
+ buf->free_buffer (buf);
+ return NULL;
+ }
+
buf->content = buf->mem;
buf->type = BUF_DEMUX_BLOCK;
@@ -123,10 +129,16 @@ static off_t pnm_plugin_seek (input_plugin_t *this_gen, off_t offset, int origin
if ((origin == SEEK_CUR) && (offset >= 0)) {
for (;((int)offset) - BUFSIZE > 0; offset -= BUFSIZE) {
- this->curpos += pnm_plugin_read (this_gen, this->scratch, BUFSIZE);
+ off_t n = pnm_plugin_read (this_gen, this->scratch, BUFSIZE);
+ if (n <= 0)
+ return this->curpos;
+ this->curpos += n;
}
- this->curpos += pnm_plugin_read (this_gen, this->scratch, offset);
+ off_t n = pnm_plugin_read (this_gen, this->scratch, offset);
+ if (n <= 0)
+ return this->curpos;
+ this->curpos += n;
}
return this->curpos;