瀏覽代碼

Check the return values of all file write operations.

git-svn-id: file:///var/svn/tigccpp/trunk@419 9552661e-59e3-4036-b4f2-dbe53926924f
kevinkofler 18 年之前
父節點
當前提交
a714392eec
共有 1 個文件被更改,包括 27 次插入21 次删除
  1. 27 21
      ktigcc/tpr.cxx

+ 27 - 21
ktigcc/tpr.cxx

@@ -506,12 +506,12 @@ int save_tpr(FILE *f,TPRDataStruct *dest)
     unsigned i=0,e;
     QString tmp;
     
-#define boolean_param(token,setting) fprintf(f,token "%d\r\n",!!dest->settings.setting);
-#define string_vparam(token,var) fprintf(f,token "%s\r\n",smartAscii(dest->var));
+#define boolean_param(token,setting) if (fprintf(f,token "%d\r\n",!!dest->settings.setting)<0) return -2;
+#define string_vparam(token,var) if (fprintf(f,token "%s\r\n",smartAscii(dest->var))<0) return -2;
 #define string_param(token,setting) string_vparam(token,settings.setting)
 #define ignore_param(token) /**/
     
-    fputs("[Settings]\r\n",f);
+    if (fputs("[Settings]\r\n",f)<0) return -2;
     boolean_param("Archive=",archive)
     boolean_param("Pack=",pack)
     string_param("Packed Variable=",pack_name)
@@ -550,31 +550,31 @@ int save_tpr(FILE *f,TPRDataStruct *dest)
 #undef string_param
 #undef ignore_param
     
-#define boolean_param(token,setting) fprintf(f,token "%d\r\n",!!dest->libopts.setting);
+#define boolean_param(token,setting) if (fprintf(f,token "%d\r\n",!!dest->libopts.setting)<0) return -2;
     
 #define reloc_param(token,setting) \
     switch(dest->libopts.setting) \
     { \
     case RT_NONE: \
-        fprintf(f,token "None\r\n"); \
+        if (fprintf(f,token "None\r\n")<0) return -2; \
         break; \
     case RT_DIRECT: \
-        fprintf(f,token "Direct\r\n"); \
+        if (fprintf(f,token "Direct\r\n")<0) return -2; \
         break; \
     case RT_AMS: \
-        fprintf(f,token "AMS\r\n"); \
+        if (fprintf(f,token "AMS\r\n")<0) return -2; \
         break; \
     case RT_PRECOMP: \
-        fprintf(f,token "Precomputed\r\n"); \
+        if (fprintf(f,token "Precomputed\r\n")<0) return -2; \
         break; \
     case RT_KERNEL: \
-        fprintf(f,token "Kernel\r\n"); \
+        if (fprintf(f,token "Kernel\r\n")<0) return -2; \
         break; \
     case RT_COMPRESSED: \
-        fprintf(f,token "Compressed\r\n"); \
+        if (fprintf(f,token "Compressed\r\n")<0) return -2; \
         break; \
     case RT_FLINE: \
-        fprintf(f,token "F-Line\r\n"); \
+        if (fprintf(f,token "F-Line\r\n")<0) return -2; \
         break; \
     }
     
@@ -583,10 +583,10 @@ int save_tpr(FILE *f,TPRDataStruct *dest)
         int major,minor; \
         major=dest->libopts.setting/100; \
         minor=dest->libopts.setting%100; \
-        fprintf(f,token "%d.%02d\r\n",major,minor); \
+        if (fprintf(f,token "%d.%02d\r\n",major,minor)<0) return -2; \
     }
     
-    fputs("\r\n[Library Options]\r\n",f);
+    if (fputs("\r\n[Library Options]\r\n",f)<0) return -2;
     boolean_param("Use TI-89=",use_ti89)
     boolean_param("Use TI-92 Plus=",use_ti92p)
     boolean_param("Use V200=",use_v200)
@@ -612,17 +612,17 @@ int save_tpr(FILE *f,TPRDataStruct *dest)
 #undef reloc_param
 #undef minams_param
     
-    fprintf(f,"\r\n[File Editing]\r\nOpen File=%s\r\n\r\n[Included Files]\r\n",smartAscii(dest->open_file));
+    if (fprintf(f,"\r\n[File Editing]\r\nOpen File=%s\r\n\r\n[Included Files]\r\n",smartAscii(dest->open_file))<0) return -2;
     
 #define filepath_param(token,filetype) \
     e=dest->filetype.path.count(); \
     for(i=0;i<e;i++) \
     { \
         tmp=convert_path_separators_save(smartAscii(dest->filetype.path[i])); \
-        fprintf(f,token " %u=%s\r\n",i+1,smartAscii(tmp)); \
+        if (fprintf(f,token " %u=%s\r\n",i+1,smartAscii(tmp))<0) return -2; \
         if (!dest->filetype.folder[i].isEmpty()) \
         { \
-          fprintf(f,token " %u Folder=%s\r\n",i+1,smartAscii(dest->filetype.folder[i])); \
+          if (fprintf(f,token " %u Folder=%s\r\n",i+1,smartAscii(dest->filetype.folder[i]))<0) return -2; \
         } \
     }
     
@@ -638,12 +638,13 @@ int save_tpr(FILE *f,TPRDataStruct *dest)
     
 #undef filepath_param
     
-    fputs("\r\n",f);
+    if (fputs("\r\n",f)<0) return -2;
     
     return 0;
 }
 
-//returns 0 on success, -1 if the file isn't there, and -2 if there's not enough memory.
+//returns 0 on success, -1 if the file couldn't be created or -2 if fprintf,
+//fputs or fclose failed
 int saveTPR(const QString &fileName,TPRDataStruct *src)
 {
   FILE *f;
@@ -654,7 +655,7 @@ int saveTPR(const QString &fileName,TPRDataStruct *src)
     return -1;
   }
   ret=save_tpr(f,src);
-  fclose(f);
+  if (fclose(f)) return -2;
   return ret;
 }
 
@@ -688,6 +689,7 @@ int saveFileText(const char *fileName,QString &fileText)
 {
   FILE *f;
   const char *s;
+  size_t l;
   
   f=fopen(fileName,"wb");
   if (!f)
@@ -698,8 +700,12 @@ int saveFileText(const char *fileName,QString &fileText)
         return -1;
   }
   s=smartAscii(fileText);
-  fwrite(s,1,strlen(s),f);
-  fclose(f);
+  l=fileText.length();
+  if (fwrite(s,1,l,f)<l) {
+    fclose(f);
+    return -2;
+  }
+  if (fclose(f)) return -2;
   return 0;
 }