- PPMs can have comments in the header.
Thanks to Denys for pointing that out. (~+7b)
This commit is contained in:
		@@ -216,36 +216,36 @@ static void fb_drawprogressbar(unsigned percent)
 | 
			
		||||
 */
 | 
			
		||||
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;
 | 
			
		||||
@@ -257,7 +257,7 @@ static void fb_drawimage(void)
 | 
			
		||||
		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;
 | 
			
		||||
@@ -268,12 +268,9 @@ static void fb_drawimage(void)
 | 
			
		||||
			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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user