Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Fix potentially-unportable code in contrib/adminpack.
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 15 Apr 2018 17:02:12 +0000 (13:02 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 15 Apr 2018 17:02:12 +0000 (13:02 -0400)
Spelling access(2)'s second argument as "2" is just horrid.
POSIX makes no promises as to the numeric values of W_OK and related
macros.  Even if it accidentally works as intended on every supported
platform, it's still unreadable and inconsistent with adjacent code.

In passing, don't spell "NULL" as "0" either.  Yes, that's legal C;
no, it's not project style.

Back-patch, just in case the unportability is real and not theoretical.
(Most likely, even if a platform had different bit assignments for
access()'s modes, there'd not be an observable behavior difference
here; but I'm being paranoid today.)

contrib/adminpack/adminpack.c

index 23751f380f4e17c48233ac48fcab425fda93fb8c..0d2edff93cde96d6ea8134018298bb2b8a445f97 100644 (file)
@@ -178,7 +178,7 @@ pg_file_rename(PG_FUNCTION_ARGS)
    fn1 = convert_and_check_filename(PG_GETARG_TEXT_P(0), false);
    fn2 = convert_and_check_filename(PG_GETARG_TEXT_P(1), false);
    if (PG_ARGISNULL(2))
-       fn3 = 0;
+       fn3 = NULL;
    else
        fn3 = convert_and_check_filename(PG_GETARG_TEXT_P(2), false);
 
@@ -200,7 +200,7 @@ pg_file_rename(PG_FUNCTION_ARGS)
        PG_RETURN_BOOL(false);
    }
 
-   rc = access(fn3 ? fn3 : fn2, 2);
+   rc = access(fn3 ? fn3 : fn2, W_OK);
    if (rc >= 0 || errno != ENOENT)
    {
        ereport(ERROR,