aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--host/main.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/host/main.c b/host/main.c
index 07a99dd..a8c5231 100644
--- a/host/main.c
+++ b/host/main.c
@@ -346,6 +346,8 @@ void console_render_buffer(framebuffer_t *fb){
}
int main(int argc, char **argv){
+ FILE *f = NULL;
+
if(argc != 2){
fprintf(stderr, "No or too much input text given\n");
return 1;
@@ -359,7 +361,8 @@ int main(int argc, char **argv){
glyph_t* glyph_table[BLP_SIZE];
if(read_bdf(fontfile, glyph_table, BLP_SIZE)){
fprintf(stderr, "Error reading font file.\n");
- return 1;
+ fclose(fontfile);
+ goto error;
}
fclose(fontfile);
@@ -368,10 +371,10 @@ int main(int argc, char **argv){
gifAnimationState_t *gifstate = NULL;
char *p = strstr(argv[1], ".gif");
if(p && p[4] == '\0'){ /* Argument ends with ".gif", try to read it as a gif file */
- FILE *f = fopen(argv[1], "r");
+ f = fopen(argv[1], "r");
if(!f){
fprintf(stderr, "Error opening gif file from argument (\"%s\"): %s\n", argv[1], strerror(errno));
- return 1;
+ goto error;
}
uint8_t *buf = NULL;
size_t size = 0;
@@ -379,16 +382,20 @@ int main(int argc, char **argv){
const size_t READ_INC = 1024;
do{
size_t newsize = size+READ_INC;
+ uint8_t *oldbuf = buf;
buf = realloc(buf, newsize);
if(!buf){
+ free(oldbuf);
+ fclose(f);
fprintf(stderr, "Error opening gif file from argument (\"%s\"): Cannot allocate %lu bytes.\n", argv[1], newsize);
- return 1;
+ goto error;
}
read += fread(buf+size, 1, newsize, f);
size = newsize;
}while(read == size);
fb = framebuffer_render_gif(buf, read, &gifstate, &delay);
free(buf);
+ fclose(f);
}else{
fb = framebuffer_render_text(argv[1], glyph_table, BLP_SIZE);
}
@@ -398,7 +405,7 @@ int main(int argc, char **argv){
if(!fb){
fprintf(stderr, "Error rendering text.\n");
- return 1;
+ goto error;
}
console_render_buffer(fb);
@@ -414,4 +421,6 @@ int main(int argc, char **argv){
}
}
return 0;
+error:
+ return 1;
}