fix bug 3265, 'procmime.c: unbalanced flockfile() / funlockfile()'
[claws.git] / src / procmime.c
index 36bff67e3401d98218832e3f7c8d1c470af07729..592f2d6ae0243e3427a8fbbe645a419a5900e054 100644 (file)
@@ -362,6 +362,7 @@ gboolean procmime_decode_content(MimeInfo *mimeinfo)
        }
        if (fseek(infp, mimeinfo->offset, SEEK_SET) < 0) {
                perror("fseek");
+               procmime_fclose(infp);
                return FALSE;
        }
 
@@ -371,6 +372,9 @@ gboolean procmime_decode_content(MimeInfo *mimeinfo)
                procmime_fclose(infp);
                return FALSE;
        }
+#ifdef HAVE_FGETS_UNLOCKED
+       flockfile(outfp);
+#endif
        tmp_file = TRUE;
        readend = mimeinfo->offset + mimeinfo->length;
 
@@ -1458,6 +1462,7 @@ static void procmime_parse_message_rfc822(MimeInfo *mimeinfo, gboolean short_sca
        }
        if (fseek(fp, mimeinfo->offset, SEEK_SET) < 0) {
                FILE_OP_ERROR(mimeinfo->data.filename, "fseek");
+               procmime_fclose(fp);
                return;
        }
        procheader_get_header_fields(fp, hentry);
@@ -1532,7 +1537,11 @@ static void procmime_parse_disposition_notification(MimeInfo *mimeinfo,
                FILE_OP_ERROR(mimeinfo->data.filename, "fopen");
                return;
        }
-       fseek(fp, mimeinfo->offset, SEEK_SET);
+       if (fseek(fp, mimeinfo->offset, SEEK_SET) < 0) {
+               FILE_OP_ERROR(mimeinfo->data.filename, "fseek");
+               procmime_fclose(fp);
+               return;
+       }
 
        if (original_msgid && disposition_notification_hdr) {
                hentry[0].body = g_strdup(original_msgid);
@@ -1660,6 +1669,7 @@ static void procmime_parse_multipart(MimeInfo *mimeinfo, gboolean short_scan)
 
        if (fseek(fp, mimeinfo->offset, SEEK_SET) < 0) {
                FILE_OP_ERROR(mimeinfo->data.filename, "fseek");
+               procmime_fclose(fp);
                return;
        }
 
@@ -2488,6 +2498,7 @@ static gint procmime_write_message_rfc822(MimeInfo *mimeinfo, FILE *fp)
                }
                if (fseek(infp, mimeinfo->offset, SEEK_SET) < 0) {
                        FILE_OP_ERROR(mimeinfo->data.filename, "fseek");
+                       procmime_fclose(infp);
                        return -1;
                }
                while (SC_FGETS(buf, sizeof(buf), infp) == buf) {
@@ -2564,6 +2575,7 @@ static gint procmime_write_multipart(MimeInfo *mimeinfo, FILE *fp)
                }
                if (fseek(infp, mimeinfo->offset, SEEK_SET) < 0) {
                        FILE_OP_ERROR(mimeinfo->data.filename, "fseek");
+                       procmime_fclose(infp);
                        return -1;
                }
                while (SC_FGETS(buf, sizeof(buf), infp) == buf) {