*/
static void fb_drawimage(void)
{
- RESERVE_CONFIG_BUFFER(head, 256);
- RESERVE_CONFIG_BUFFER(s, 80);
- int theme_file;
+ char *head, *ptr;
+ FILE *theme_file;
unsigned char *pixline;
unsigned i, j, width, height, line_size;
- memset(head, 0, sizeof(head));
- theme_file = open_or_warn_stdin(G.image_filename);
+ theme_file = xfopen_stdin(G.image_filename);
+ head = xmalloc(256);
// parse ppm header
while (1) {
- if (safe_read(theme_file, s, sizeof(s)) <= 0)
- bb_error_msg_and_die("bad PPM file '%s'", G.image_filename);
-
- if (s[0] == '#')
- continue;
-
- if (strlen(head) + strlen(s) >= sizeof(head))
- bb_error_msg_and_die("bad PPM file '%s'", G.image_filename);
-
- strcat(head, s);
- if (head[0] != 'P' || head[1] != '6')
+ if (fgets(head, 256, theme_file) == NULL
+ /* do not overrun the buffer */
+ || strlen(bb_common_bufsiz1) >= sizeof(bb_common_bufsiz1) - 256)
bb_error_msg_and_die("bad PPM file '%s'", G.image_filename);
+ ptr = memchr(head, '#', 256);
+ if (ptr != NULL)
+ *ptr = 0; /* ignore comments */
+ strcat(bb_common_bufsiz1, head);
// width, height, max_color_val
- if (sscanf(head, "P6 %u %u %u", &width, &height, &i) == 3)
+ if (sscanf(bb_common_bufsiz1, "P6 %u %u %u", &width, &height, &i) == 3
+ && i <= 255)
break;
-// TODO: i must be <= 255!
+ /* If we do not find a signature throughout the whole file then
+ we will diagnose this via EOF on read in the head of the loop. */
}
+ if (ENABLE_FEATURE_CLEAN_UP)
+ free(head);
+
line_size = width*3;
if (width > G.scr_var.xres)
width = G.scr_var.xres;
unsigned char *pixel = pixline;
DATA *src = (DATA *)(G.addr + j * G.scr_fix.line_length);
- if (safe_read(theme_file, pixline, line_size) != line_size)
+ if (fread(pixline, 1, line_size, theme_file) != line_size)
bb_error_msg_and_die("bad PPM file '%s'", G.image_filename);
for (i = 0; i < width; i++) {
unsigned thispix;
pixel += 3;
}
}
- if (ENABLE_FEATURE_CLEAN_UP) {
+ if (ENABLE_FEATURE_CLEAN_UP)
free(pixline);
- RELEASE_CONFIG_BUFFER(s);
- RELEASE_CONFIG_BUFFER(head);
- }
- close(theme_file);
+ fclose(theme_file);
}