Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitc77f363

Browse files
committed
Ensure that close() and fclose() are checked for errors, at least in
cases involving writes. Per recent discussion about the possibilityof close-time failures on some filesystems. There is a TODO item forthis, too.
1 parente0707cb commitc77f363

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
staticSlruErrorCauseslru_errcause;
150151
staticintslru_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+
caseSLRU_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
staticvoid
@@ -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
elseif (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
returnNULL;
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
inti;
@@ -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+
returnfclose(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+
intsave_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)

[8]ページ先頭

©2009-2025 Movatter.jp