Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit c77f363

Browse files
committed
Ensure that close() and fclose() are checked for errors, at least in
cases involving writes. Per recent discussion about the possibility of close-time failures on some filesystems. There is a TODO item for this, too.
1 parent e0707cb commit c77f363

File tree

15 files changed

+155
-56
lines changed

15 files changed

+155
-56
lines changed

src/backend/access/transam/slru.c

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
77
* Portions Copyright (c) 1994, Regents of the University of California
88
*
9-
* $PostgreSQL: pgsql/src/backend/access/transam/slru.c,v 1.8 2003/11/29 19:51:40 pgsql Exp $
9+
* $PostgreSQL: pgsql/src/backend/access/transam/slru.c,v 1.9 2004/01/26 22:35:31 tgl Exp $
1010
*
1111
*-------------------------------------------------------------------------
1212
*/
@@ -144,7 +144,8 @@ typedef enum
144144
SLRU_CREATE_FAILED,
145145
SLRU_SEEK_FAILED,
146146
SLRU_READ_FAILED,
147-
SLRU_WRITE_FAILED
147+
SLRU_WRITE_FAILED,
148+
SLRU_CLOSE_FAILED
148149
} SlruErrorCause;
149150
static SlruErrorCause slru_errcause;
150151
static int slru_errno;
@@ -510,7 +511,13 @@ SlruPhysicalReadPage(SlruCtl ctl, int pageno, int slotno)
510511
return false;
511512
}
512513

513-
close(fd);
514+
if (close(fd))
515+
{
516+
slru_errcause = SLRU_CLOSE_FAILED;
517+
slru_errno = errno;
518+
return false;
519+
}
520+
514521
return true;
515522
}
516523

@@ -587,7 +594,13 @@ SlruPhysicalWritePage(SlruCtl ctl, int pageno, int slotno)
587594
return false;
588595
}
589596

590-
close(fd);
597+
if (close(fd))
598+
{
599+
slru_errcause = SLRU_CLOSE_FAILED;
600+
slru_errno = errno;
601+
return false;
602+
}
603+
591604
return true;
592605
}
593606

@@ -642,6 +655,13 @@ SlruReportIOError(SlruCtl ctl, int pageno, TransactionId xid)
642655
errdetail("could not write to file \"%s\" at offset %u: %m",
643656
path, offset)));
644657
break;
658+
case SLRU_CLOSE_FAILED:
659+
ereport(ERROR,
660+
(errcode_for_file_access(),
661+
errmsg("could not access status of transaction %u", xid),
662+
errdetail("could not close file \"%s\": %m",
663+
path)));
664+
break;
645665
default:
646666
/* can't get here, we trust */
647667
elog(ERROR, "unrecognized SimpleLru error cause: %d",

src/backend/access/transam/xlog.c

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
10-
* $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.132 2004/01/19 19:04:40 tgl Exp $
10+
* $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.133 2004/01/26 22:35:31 tgl Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -1044,7 +1044,7 @@ XLogWrite(XLogwrtRqst WriteRqst)
10441044
*/
10451045
if (openLogFile >= 0)
10461046
{
1047-
if (close(openLogFile) != 0)
1047+
if (close(openLogFile))
10481048
ereport(PANIC,
10491049
(errcode_for_file_access(),
10501050
errmsg("could not close log file %u, segment %u: %m",
@@ -1162,7 +1162,7 @@ XLogWrite(XLogwrtRqst WriteRqst)
11621162
if (openLogFile >= 0 &&
11631163
!XLByteInPrevSeg(LogwrtResult.Write, openLogId, openLogSeg))
11641164
{
1165-
if (close(openLogFile) != 0)
1165+
if (close(openLogFile))
11661166
ereport(PANIC,
11671167
(errcode_for_file_access(),
11681168
errmsg("could not close log file %u, segment %u: %m",
@@ -1427,7 +1427,10 @@ XLogFileInit(uint32 log, uint32 seg,
14271427
(errcode_for_file_access(),
14281428
errmsg("could not fsync file \"%s\": %m", tmppath)));
14291429

1430-
close(fd);
1430+
if (close(fd))
1431+
ereport(PANIC,
1432+
(errcode_for_file_access(),
1433+
errmsg("could not close file \"%s\": %m", tmppath)));
14311434

14321435
/*
14331436
* Now move the segment into place with its final name.
@@ -2205,7 +2208,10 @@ WriteControlFile(void)
22052208
(errcode_for_file_access(),
22062209
errmsg("could not fsync control file: %m")));
22072210

2208-
close(fd);
2211+
if (close(fd))
2212+
ereport(PANIC,
2213+
(errcode_for_file_access(),
2214+
errmsg("could not close control file: %m")));
22092215
}
22102216

22112217
static void
@@ -2382,7 +2388,10 @@ UpdateControlFile(void)
23822388
(errcode_for_file_access(),
23832389
errmsg("could not fsync control file: %m")));
23842390

2385-
close(fd);
2391+
if (close(fd))
2392+
ereport(PANIC,
2393+
(errcode_for_file_access(),
2394+
errmsg("could not close control file: %m")));
23862395
}
23872396

23882397
/*
@@ -2535,7 +2544,11 @@ BootStrapXLOG(void)
25352544
(errcode_for_file_access(),
25362545
errmsg("could not fsync bootstrap transaction log file: %m")));
25372546

2538-
close(openLogFile);
2547+
if (close(openLogFile))
2548+
ereport(PANIC,
2549+
(errcode_for_file_access(),
2550+
errmsg("could not close bootstrap transaction log file: %m")));
2551+
25392552
openLogFile = -1;
25402553

25412554
memset(ControlFile, 0, sizeof(ControlFileData));
@@ -3577,7 +3590,7 @@ assign_xlog_sync_method(const char *method, bool doit, GucSource source)
35773590
openLogId, openLogSeg)));
35783591
if (open_sync_bit != new_sync_bit)
35793592
{
3580-
if (close(openLogFile) != 0)
3593+
if (close(openLogFile))
35813594
ereport(PANIC,
35823595
(errcode_for_file_access(),
35833596
errmsg("could not close log file %u, segment %u: %m",

src/backend/commands/copy.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/commands/copy.c,v 1.215 2004/01/18 02:15:29 tgl Exp $
11+
* $PostgreSQL: pgsql/src/backend/commands/copy.c,v 1.216 2004/01/26 22:35:31 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -921,7 +921,14 @@ DoCopy(const CopyStmt *stmt)
921921
}
922922

923923
if (!pipe)
924-
FreeFile(copy_file);
924+
{
925+
/* we assume only the write case could fail here */
926+
if (FreeFile(copy_file))
927+
ereport(ERROR,
928+
(errcode_for_file_access(),
929+
errmsg("could not write to file \"%s\": %m",
930+
filename)));
931+
}
925932
else if (IsUnderPostmaster && !is_from)
926933
SendCopyEnd(binary);
927934
pfree(attribute_buf.data);

src/backend/commands/user.c

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
77
* Portions Copyright (c) 1994, Regents of the University of California
88
*
9-
* $PostgreSQL: pgsql/src/backend/commands/user.c,v 1.132 2004/01/07 18:56:25 neilc Exp $
9+
* $PostgreSQL: pgsql/src/backend/commands/user.c,v 1.133 2004/01/26 22:35:32 tgl Exp $
1010
*
1111
*-------------------------------------------------------------------------
1212
*/
@@ -241,12 +241,11 @@ write_group_file(Relation grel)
241241
}
242242
heap_endscan(scan);
243243

244-
fflush(fp);
245-
if (ferror(fp))
244+
if (FreeFile(fp))
246245
ereport(ERROR,
247246
(errcode_for_file_access(),
248-
errmsg("could not write to temporary file \"%s\": %m", tempname)));
249-
FreeFile(fp);
247+
errmsg("could not write to temporary file \"%s\": %m",
248+
tempname)));
250249

251250
/*
252251
* Rename the temp file to its final name, deleting the old pg_pwd. We
@@ -372,12 +371,11 @@ write_user_file(Relation urel)
372371
}
373372
heap_endscan(scan);
374373

375-
fflush(fp);
376-
if (ferror(fp))
374+
if (FreeFile(fp))
377375
ereport(ERROR,
378376
(errcode_for_file_access(),
379-
errmsg("could not write to temporary file \"%s\": %m", tempname)));
380-
FreeFile(fp);
377+
errmsg("could not write to temporary file \"%s\": %m",
378+
tempname)));
381379

382380
/*
383381
* Rename the temp file to its final name, deleting the old pg_pwd. We

src/backend/postmaster/postmaster.c

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
*
3838
*
3939
* IDENTIFICATION
40-
* $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.358 2004/01/11 03:49:31 momjian Exp $
40+
* $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.359 2004/01/26 22:35:32 tgl Exp $
4141
*
4242
* NOTES
4343
*
@@ -3171,15 +3171,12 @@ CreateOptsFile(int argc, char *argv[])
31713171
fprintf(fp, " '%s'", argv[i]);
31723172
fputs("\n", fp);
31733173

3174-
fflush(fp);
3175-
if (ferror(fp))
3174+
if (fclose(fp))
31763175
{
31773176
elog(LOG, "could not write file \"%s\": %m", filename);
3178-
fclose(fp);
31793177
return false;
31803178
}
31813179

3182-
fclose(fp);
31833180
return true;
31843181
}
31853182

@@ -3290,7 +3287,14 @@ write_backend_variables(Port *port)
32903287
write_var(debug_flag,fp);
32913288

32923289
/* Release file */
3293-
FreeFile(fp);
3290+
if (FreeFile(fp))
3291+
{
3292+
ereport(ERROR,
3293+
(errcode_for_file_access(),
3294+
errmsg("could not write to file \"%s\": %m", filename)));
3295+
return false;
3296+
}
3297+
32943298
return true;
32953299
}
32963300

src/backend/storage/file/fd.c

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* Portions Copyright (c) 1994, Regents of the University of California
88
*
99
* IDENTIFICATION
10-
* $PostgreSQL: pgsql/src/backend/storage/file/fd.c,v 1.105 2003/12/20 17:31:21 momjian Exp $
10+
* $PostgreSQL: pgsql/src/backend/storage/file/fd.c,v 1.106 2004/01/26 22:35:32 tgl Exp $
1111
*
1212
* NOTES:
1313
*
@@ -397,7 +397,7 @@ LruDelete(File file)
397397

398398
/* close the file */
399399
if (close(vfdP->fd))
400-
elog(LOG, "failed to close \"%s\": %m",
400+
elog(ERROR, "failed to close \"%s\": %m",
401401
vfdP->fileName);
402402

403403
--nfile;
@@ -842,7 +842,7 @@ FileClose(File file)
842842

843843
/* close the file */
844844
if (close(vfdP->fd))
845-
elog(LOG, "failed to close \"%s\": %m",
845+
elog(ERROR, "failed to close \"%s\": %m",
846846
vfdP->fileName);
847847

848848
--nfile;
@@ -1069,7 +1069,13 @@ AllocateFile(char *name, char *mode)
10691069
return NULL;
10701070
}
10711071

1072-
void
1072+
/*
1073+
* Close a file returned by AllocateFile.
1074+
*
1075+
* Note we do not check fclose's return value --- it is up to the caller
1076+
* to handle close errors.
1077+
*/
1078+
int
10731079
FreeFile(FILE *file)
10741080
{
10751081
int i;
@@ -1089,7 +1095,7 @@ FreeFile(FILE *file)
10891095
if (i < 0)
10901096
elog(WARNING, "file passed to FreeFile was not obtained from AllocateFile");
10911097

1092-
fclose(file);
1098+
return fclose(file);
10931099
}
10941100

10951101
/*

src/backend/storage/freespace/freespace.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/storage/freespace/freespace.c,v 1.29 2004/01/11 03:49:31 momjian Exp $
11+
* $PostgreSQL: pgsql/src/backend/storage/freespace/freespace.c,v 1.30 2004/01/26 22:35:32 tgl Exp $
1212
*
1313
*
1414
* NOTES:
@@ -793,7 +793,12 @@ DumpFreeSpaceMap(int code, Datum arg)
793793
/* Clean up */
794794
LWLockRelease(FreeSpaceLock);
795795

796-
FreeFile(fp);
796+
if (FreeFile(fp))
797+
{
798+
elog(LOG, "could not write \"%s\": %m", cachefilename);
799+
/* Remove busted cache file */
800+
unlink(cachefilename);
801+
}
797802

798803
return;
799804

src/backend/utils/cache/relcache.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/utils/cache/relcache.c,v 1.194 2003/12/28 21:57:37 tgl Exp $
11+
* $PostgreSQL: pgsql/src/backend/utils/cache/relcache.c,v 1.195 2004/01/26 22:35:32 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -3330,7 +3330,8 @@ write_relcache_init_file(void)
33303330
MemoryContextSwitchTo(oldcxt);
33313331
}
33323332

3333-
FreeFile(fp);
3333+
if (FreeFile(fp))
3334+
elog(FATAL, "could not write init file");
33343335

33353336
/*
33363337
* Now we have to check whether the data we've so painstakingly

src/backend/utils/init/miscinit.c

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/utils/init/miscinit.c,v 1.119 2004/01/08 06:01:21 tgl Exp $
11+
* $PostgreSQL: pgsql/src/backend/utils/init/miscinit.c,v 1.120 2004/01/26 22:35:32 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -622,7 +622,16 @@ CreateLockFile(const char *filename, bool amPostmaster,
622622
(errcode_for_file_access(),
623623
errmsg("could not write lock file \"%s\": %m", filename)));
624624
}
625-
close(fd);
625+
if (close(fd))
626+
{
627+
int save_errno = errno;
628+
629+
unlink(filename);
630+
errno = save_errno;
631+
ereport(FATAL,
632+
(errcode_for_file_access(),
633+
errmsg("could not write lock file \"%s\": %m", filename)));
634+
}
626635

627636
/*
628637
* Arrange for automatic removal of lockfile at proc_exit.
@@ -776,7 +785,13 @@ RecordSharedMemoryInLockFile(unsigned long id1, unsigned long id2)
776785
close(fd);
777786
return;
778787
}
779-
close(fd);
788+
if (close(fd))
789+
{
790+
ereport(LOG,
791+
(errcode_for_file_access(),
792+
errmsg("could not write to file \"%s\": %m",
793+
directoryLockFile)));
794+
}
780795
}
781796

782797

0 commit comments

Comments
 (0)