diff options
Diffstat (limited to 'boilerplate')
-rw-r--r-- | boilerplate/cairo-boilerplate.c | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/boilerplate/cairo-boilerplate.c b/boilerplate/cairo-boilerplate.c index f7146b745..039fb3dee 100644 --- a/boilerplate/cairo-boilerplate.c +++ b/boilerplate/cairo-boilerplate.c @@ -746,6 +746,24 @@ POPEN: return popen (command, "r"); } +static cairo_bool_t +freadn (char *buf, int len, FILE *file) +{ + int ret; + + while (len) { + ret = fread (buf, 1, len, file); + if (ret != len) { + if (ferror (file) || feof (file)) + return FALSE; + } + len -= ret; + buf += len; + } + + return TRUE; +} + cairo_surface_t * cairo_boilerplate_image_surface_create_from_ppm_stream (FILE *file) { @@ -780,18 +798,18 @@ cairo_boilerplate_image_surface_create_from_ppm_stream (FILE *file) unsigned char *buf = data + y *stride; switch (format) { case '7': - if (fread (buf, 4, width, file) != (size_t) width) + if (! freadn (buf, 4 * width, file)) goto FAIL; break; case '6': for (x = 0; x < width; x++) { - if (fread (buf, 1, 3, file) != 3) + if (! freadn (buf, 3, file)) goto FAIL; buf += 4; } break; case '5': - if (fread (buf, 1, width, file) != (size_t) width) + if (! freadn (buf, width, file)) goto FAIL; break; } |