postgres.git / summary / log / commit / refs

commit    e03c6d93bfabc6606a8778b253ae31f2c3ee849d
Author:   Noah Misch <noah@leadboat.com>
Date:     Sun Mar 12 23:35:31 2017 +0000

    Fix pg_file_write() error handling.
    
    Detect fclose() failures; given "ln -s /dev/full $PGDATA/devfull",
    "pg_file_write('devfull', 'x', true)" now fails as it should.  Don't
    leak a stream when fwrite() fails.  Remove a born-ineffective test that
    aimed to skip zero-length writes.  Back-patch to 9.2 (all supported
    versions).


contrib/adminpack/adminpack.c | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/contrib/adminpack/adminpack.c b/contrib/adminpack/adminpack.c index ded89c60590..23751f380f4 100644 --- a/contrib/adminpack/adminpack.c +++ b/contrib/adminpack/adminpack.c @@ -141,10 +141,10 @@ pg_file_write(PG_FUNCTION_ARGS) (ERRCODE_DUPLICATE_FILE, errmsg("file \"%s\" exists", filename))); - f = fopen(filename, "wb"); + f = AllocateFile(filename, "wb"); } else - f = fopen(filename, "ab"); + f = AllocateFile(filename, "ab"); if (!f) ereport(ERROR, @@ -152,16 +152,11 @@ pg_file_write(PG_FUNCTION_ARGS) errmsg("could not open file \"%s\" for writing: %m", filename))); - if (VARSIZE(data) != 0) - { - count = fwrite(VARDATA(data), 1, VARSIZE(data) - VARHDRSZ, f); - - if (count != VARSIZE(data) - VARHDRSZ) - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not write file \"%s\": %m", filename))); - } - fclose(f); + count = fwrite(VARDATA(data), 1, VARSIZE(data) - VARHDRSZ, f); + if (count != VARSIZE(data) - VARHDRSZ || FreeFile(f)) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not write file \"%s\": %m", filename))); PG_RETURN_INT64(count); } [parent: f6cfc14e5ad3]