BUG #15105: OpenTransientFile() should be paired withCloseTransientFile() rather than close() - Mailing list pgsql-bugs

From PG Bug reporting form
Subject BUG #15105: OpenTransientFile() should be paired withCloseTransientFile() rather than close()
Date
Msg-id 152056616579.4966.583293218357089052@wrigleys.postgresql.org
Whole thread Raw
Responses Re: BUG #15105: OpenTransientFile() should be paired withCloseTransientFile() rather than close()
List pgsql-bugs
The following bug has been logged on the website:

Bug reference:      15105
Logged by:          Pan Bian
Email address:      bianpan2016@163.com
PostgreSQL version: 10.3
Operating system:   Linux
Description:

File: src/backend/storage/ipc/dsm_impl.c
Function: dsm_impl_mmap()

Details: The handler opened with OpenTransientFile() should be closed with
CloseTransientFile(). However, in function dsm_impl_mmap(), on a certain
path, the return value of OpenTransientFile() (at line 885) is passed to
close() (at line 926). It is better to use CloseTransientFile() here, as
done at line 909.

For your convenience, I paste the related source code as follows:

 845 static bool
 846 dsm_impl_mmap(dsm_op op, dsm_handle handle, Size request_size,
 847               void **impl_private, void **mapped_address, Size
*mapped_size,
 848               int elevel)
 849 {
         ...
 883     /* Create new segment or open an existing one for attach or resize.
*/
 884     flags = O_RDWR | (op == DSM_OP_CREATE ? O_CREAT | O_EXCL : 0);
 885     if ((fd = OpenTransientFile(name, flags, 0600)) == -1)
 886     {
 887         if (errno != EEXIST)
 888             ereport(elevel,
 889                     (errcode_for_dynamic_shared_memory(),
 890                      errmsg("could not open shared memory segment
\"%s\": %m",
 891                             name)));
 892         return false;
 893     }
 894 
 895     /*
 896      * If we're attaching the segment, determine the current size; if
we are
 897      * creating or resizing the segment, set the size to the requested
value.
 898      */
 899     if (op == DSM_OP_ATTACH)
 900     {
 901         struct stat st;
 902 
 903         if (fstat(fd, &st) != 0)
 904         {
 905             int         save_errno;
 906 
 907             /* Back out what's already been done. */
 908             save_errno = errno;
 909             CloseTransientFile(fd);
 910             errno = save_errno;
 911 
 912             ereport(elevel,
 913                     (errcode_for_dynamic_shared_memory(),
 914                      errmsg("could not stat shared memory segment
\"%s\": %m",
 915                             name)));
 916             return false;
 917         }
 918         request_size = st.st_size;
 919     }
 920     else if (*mapped_size > request_size && ftruncate(fd,
request_size))
 921     {
 922         int         save_errno;
 923 
 924         /* Back out what's already been done. */
 925         save_errno = errno;
 926         close(fd);
 927         if (op == DSM_OP_CREATE)
 928             unlink(name);
 929         errno = save_errno;
 930 
 931         ereport(elevel,
 932                 (errcode_for_dynamic_shared_memory(),
 933                  errmsg("could not resize shared memory segment \"%s\"
to %zu bytes: %m",
 934                         name, request_size)));
 935         return false;
 936     }
         ...
1038     *mapped_address = address;
1039     *mapped_size = request_size;
1040     CloseTransientFile(fd);
1041 
1042     return true;
1043 }

Thanks!


pgsql-bugs by date:

Previous
From: Michael Paquier
Date:
Subject: Re: BUG #15103: Do not use pfree() to free pg_malloc() return valuein vacuum_one_database()
Next
From: Michael Paquier
Date:
Subject: Re: BUG #15105: OpenTransientFile() should be paired withCloseTransientFile() rather than close()