]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Fix saving and restoring umask
authorPeter Eisentraut <peter_e@gmx.net>
Fri, 22 Sep 2017 20:50:59 +0000 (16:50 -0400)
committerPeter Eisentraut <peter_e@gmx.net>
Sat, 23 Sep 2017 14:05:28 +0000 (10:05 -0400)
In two cases, we set a different umask for some piece of code and
restore it afterwards.  But if the contained code errors out, the umask
is not restored.  So add TRY/CATCH blocks to fix that.

src/backend/commands/copy.c
src/backend/libpq/be-fsstubs.c

index 3eba9efcc6322445b917c16fb9745f66d7f3ece4..71bec156cdb666ad218a552a5d6ff15db7c81702 100644 (file)
@@ -1619,7 +1619,16 @@ BeginCopyTo(Relation rel,
                                          errmsg("relative path not allowed for COPY to file")));
 
                        oumask = umask(S_IWGRP | S_IWOTH);
-                       cstate->copy_file = AllocateFile(cstate->filename, PG_BINARY_W);
+                       PG_TRY();
+                       {
+                               cstate->copy_file = AllocateFile(cstate->filename, PG_BINARY_W);
+                       }
+                       PG_CATCH();
+                       {
+                               umask(oumask);
+                               PG_RE_THROW();
+                       }
+                       PG_END_TRY();
                        umask(oumask);
                        if (cstate->copy_file == NULL)
                                ereport(ERROR,
index bcc90b9be2affd38db3ad9943488dd92836302a4..10cb1e14926c286f0a12411ce1a26ef23c74d843 100644 (file)
@@ -540,8 +540,17 @@ lo_export(PG_FUNCTION_ARGS)
         */
        text_to_cstring_buffer(filename, fnamebuf, sizeof(fnamebuf));
        oumask = umask(S_IWGRP | S_IWOTH);
-       fd = OpenTransientFile(fnamebuf, O_CREAT | O_WRONLY | O_TRUNC | PG_BINARY,
-                                                  S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
+       PG_TRY();
+       {
+               fd = OpenTransientFile(fnamebuf, O_CREAT | O_WRONLY | O_TRUNC | PG_BINARY,
+                                                          S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
+       }
+       PG_CATCH();
+       {
+               umask(oumask);
+               PG_RE_THROW();
+       }
+       PG_END_TRY();
        umask(oumask);
        if (fd < 0)
                ereport(ERROR,