Check ftell return values
authorCampbell Barton <ideasman42@gmail.com>
Fri, 5 Jun 2015 01:46:01 +0000 (11:46 +1000)
committerCampbell Barton <ideasman42@gmail.com>
Fri, 5 Jun 2015 01:46:01 +0000 (11:46 +1000)
source/blender/blenkernel/BKE_text.h
source/blender/blenkernel/intern/text.c
source/blender/blenlib/intern/storage.c
source/blender/makesdna/intern/makesdna.c

index c5f47ad6cbf059845c6144aff8eb8f6ce3a7ae2d..a5a59d14c92e26bd22c488d9efb942a12a63893d 100644 (file)
@@ -46,7 +46,7 @@ void                  txt_set_undostate       (int u);
 int                    txt_get_undostate       (void);
 struct Text    *BKE_text_add   (struct Main *bmain, const char *name);
 int                            txt_extended_ascii_as_utf8(char **str);
-int                            BKE_text_reload         (struct Text *text);
+bool            BKE_text_reload(struct Text *text);
 struct Text    *BKE_text_load_ex(struct Main *bmain, const char *file, const char *relpath,
                                  const bool is_internal);
 struct Text    *BKE_text_load  (struct Main *bmain, const char *file, const char *relpath);
index c901fa40acc39df1bcb0fce2dc53e964bb628d78..89456763b95f842162a89005d287b35cacb6cf39 100644 (file)
@@ -330,7 +330,7 @@ static void text_from_buf(Text *text, const unsigned char *buffer, const int len
        text->curc = text->selc = 0;
 }
 
-int BKE_text_reload(Text *text)
+bool BKE_text_reload(Text *text)
 {
        FILE *fp;
        int len;
@@ -339,13 +339,24 @@ int BKE_text_reload(Text *text)
        char str[FILE_MAX];
        BLI_stat_t st;
 
-       if (!text->name) return 0;
-       
+       if (!text->name) {
+               return false;
+       }
+
        BLI_strncpy(str, text->name, FILE_MAX);
        BLI_path_abs(str, G.main->name);
        
        fp = BLI_fopen(str, "r");
-       if (fp == NULL) return 0;
+       if (fp == NULL) {
+               return false;
+       }
+       fseek(fp, 0L, SEEK_END);
+       len = ftell(fp);
+       fseek(fp, 0L, SEEK_SET);
+       if (UNLIKELY(len == -1)) {
+               fclose(fp);
+               return false;
+       }
 
        /* free memory: */
 
@@ -363,11 +374,6 @@ int BKE_text_reload(Text *text)
        MEM_freeN(text->undo_buf);
        init_undo_text(text);
 
-       fseek(fp, 0L, SEEK_END);
-       len = ftell(fp);
-       fseek(fp, 0L, SEEK_SET);
-
-
        buffer = MEM_mallocN(len, "text_buffer");
        /* under windows fread can return less than len bytes because
         * of CR stripping */
@@ -385,7 +391,7 @@ int BKE_text_reload(Text *text)
        text_from_buf(text, buffer, len);
 
        MEM_freeN(buffer);
-       return 1;
+       return true;
 }
 
 Text *BKE_text_load_ex(Main *bmain, const char *file, const char *relpath, const bool is_internal)
@@ -402,8 +408,18 @@ Text *BKE_text_load_ex(Main *bmain, const char *file, const char *relpath, const
                BLI_path_abs(str, relpath);
        
        fp = BLI_fopen(str, "r");
-       if (fp == NULL) return NULL;
-       
+       if (fp == NULL) {
+               return NULL;
+       }
+
+       fseek(fp, 0L, SEEK_END);
+       len = ftell(fp);
+       fseek(fp, 0L, SEEK_SET);
+       if (UNLIKELY(len == -1)) {
+               fclose(fp);
+               return NULL;
+       }
+
        ta = BKE_libblock_alloc(bmain, ID_TXT, BLI_path_basename(str));
        ta->id.us = 1;
 
@@ -423,10 +439,6 @@ Text *BKE_text_load_ex(Main *bmain, const char *file, const char *relpath, const
 
        /* clear undo buffer */
        init_undo_text(ta);
-
-       fseek(fp, 0L, SEEK_END);
-       len = ftell(fp);
-       fseek(fp, 0L, SEEK_SET);
        
        buffer = MEM_mallocN(len, "text_buffer");
        /* under windows fread can return less than len bytes because
index 046dba26c69d4957e1cfe4f555d170abe9bb0586..6394187d40a2573a7323d3db2ddf948809f83bfc 100644 (file)
@@ -296,6 +296,11 @@ LinkNode *BLI_file_read_as_lines(const char *name)
        size = (size_t)ftell(fp);
        fseek(fp, 0, SEEK_SET);
 
+       if (UNLIKELY(size == (size_t)-1)) {
+               fclose(fp);
+               return NULL;
+       }
+
        buf = MEM_mallocN(size, "file_as_lines");
        if (buf) {
                size_t i, last = 0;
index 7f3e9b7c19637d8fae26fa263dde0380574bfe0f..a7ff4244d5fed9711b0803764e6666157348f49c 100644 (file)
@@ -539,6 +539,11 @@ static void *read_file_data(char *filename, int *r_len)
        *r_len = ftell(fp);
        fseek(fp, 0L, SEEK_SET);
 
+       if (*r_len == -1) {
+               fclose(fp);
+               return NULL;
+       }
+
        data = MEM_mallocN(*r_len, "read_file_data");
        if (!data) {
                *r_len = -1;