Re: BUG #14929: Unchecked AllocateDir() return value inrestoreTwoPhaseData() - Mailing list pgsql-bugs

From Amit Langote
Subject Re: BUG #14929: Unchecked AllocateDir() return value inrestoreTwoPhaseData()
Date
Msg-id 728f1223-9a35-56cb-8854-afb84849c2cc@lab.ntt.co.jp
Whole thread Raw
In response to BUG #14929: Unchecked AllocateDir() return value inrestoreTwoPhaseData()  (bianpan2016@163.com)
Responses Re: BUG #14929: Unchecked AllocateDir() return value in restoreTwoPhaseData()  (Michael Paquier <michael.paquier@gmail.com>)
List pgsql-bugs
On 2017/11/27 18:31, bianpan2016@163.com wrote:
> The following bug has been logged on the website:
> 
> Bug reference:      14929
> Logged by:          Pan Bian
> Email address:      bianpan2016@163.com
> PostgreSQL version: 10.1
> Operating system:   Linux
> Description:        
> 
> File: src/backend/access/transam/twophase.c
> Function: restoreTwoPhaseData
> Line: 1738
> 
> AllocateDir() will return a NULL pointer if it fails to open the specified
> directory. However, in function restoreTwoPhaseData(), its return value is
> not checked. This may result in a NULL pointer dereference when trying to
> free it (see line 1759).
> 
> For your convenience, I copy and paste related codes as follows:
> 
> 1732 void
> 1733 restoreTwoPhaseData(void)
> 1734 {
> 1735     DIR        *cldir;
> 1736     struct dirent *clde;
> 1737 
> 1738     cldir = AllocateDir(TWOPHASE_DIR);
> 1739     LWLockAcquire(TwoPhaseStateLock, LW_EXCLUSIVE);
> 1740     while ((clde = ReadDir(cldir, TWOPHASE_DIR)) != NULL)
> 1741     {
>          ...
> 1758     LWLockRelease(TwoPhaseStateLock);
> 1759     FreeDir(cldir);
> 1760 }

Thanks for the report.

It seems like a good idea to check cldir for NULL before freeing.  Please
find attached a patch to implement the same.

Thanks,
Amit

Attachment

pgsql-bugs by date:

Previous
From: Amit Langote
Date:
Subject: Re: BUG #14928: Unchecked SearchSysCacheCopy1() return value
Next
From: Michael Paquier
Date:
Subject: Re: BUG #14929: Unchecked AllocateDir() return value in restoreTwoPhaseData()