Changeset: af65ff1e18bd for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=af65ff1e18bd
Modified Files:
        gdk/gdk_heap.c
Branch: Jul2012
Log Message:

Don't call fclose on the same fp twice, even if the first call failed.
Found by Coverity.


diffs (39 lines):

diff --git a/gdk/gdk_heap.c b/gdk/gdk_heap.c
--- a/gdk/gdk_heap.c
+++ b/gdk/gdk_heap.c
@@ -163,21 +163,25 @@ HEAPcacheFind( size_t *maxsz, char *fn, 
 
                                if ((fp = fopen(fn, "rb+")) != NULL &&
 #ifdef _WIN64
-                                  _fseeki64(fp, (ssize_t) *maxsz-1, SEEK_SET) 
>= 0 &&
+                                   _fseeki64(fp, (ssize_t) *maxsz-1, SEEK_SET) 
>= 0 &&
 #else
 #ifdef HAVE_FSEEKO
-                                  fseeko(fp, (off_t) *maxsz-1, SEEK_SET) >= 0 
&&
+                                   fseeko(fp, (off_t) *maxsz-1, SEEK_SET) >= 0 
&&
 #else
-                                  fseek(fp, (long) *maxsz-1, SEEK_SET) >= 0 &&
+                                   fseek(fp, (long) *maxsz-1, SEEK_SET) >= 0 &&
 #endif
 #endif
-                                  fputc('\n', fp) >= 0 &&
-                                  fflush(fp) >= 0 &&
-                                  fclose(fp) >= 0) {
-                                       void *base = GDKload(fn, NULL, *maxsz, 
*maxsz, STORE_MMAP);
-                                       GDKmunmap(e->base, e->maxsz);
-                                       e->base = base;
-                                       e->maxsz = *maxsz;
+                                   fputc('\n', fp) >= 0 &&
+                                   fflush(fp) >= 0) {
+                                       if (fclose(fp) >= 0) {
+                                               void *base = GDKload(fn, NULL, 
*maxsz, *maxsz, STORE_MMAP);
+                                               GDKmunmap(e->base, e->maxsz);
+                                               e->base = base;
+                                               e->maxsz = *maxsz;
+                                       }
+                                       /* after fclose, successful or
+                                        * not, we can't call fclose
+                                        * again */
                                        fp = NULL;
                                }
                                if (fp) {
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to