Thread: Possible buffer overrun in src/backend/libpq/hba.c gethba_options()

Possible buffer overrun in src/backend/libpq/hba.c gethba_options()

From
Julian Hsiao
Date:
Hi,

During a routine Coverity scan of our internal PostgreSQL fork, it
issued a buffer overrun warning for src/backend/libpq/hba.c,
gethba_options()[0]:

MAIN_ISSUE EventDescription: Overrunning array "options" of 12 8-byte
elements at element index 12 (byte offset 96) using index "noptions++"
(which evaluates to 12).
[...]
        if (hba->ldapscope)
            options[noptions++] =
                CStringGetTextDatum(psprintf("ldapscope=%d", hba->ldapscope));
[...]

This is because earlier in the function[1], if hba->usermap,
hba->clientcert, and hba->pamservice were set then noptions would
exceed MAX_HBA_OPTIONS. Of course, if those options are mutually
exclusive with hba->auth_method == uaLDAP, then it's a false positive.
Is that the case, or should MAX_HBA_OPTIONS be increased?

Thanks.

[0] https://github.com/postgres/postgres/blob/master/src/backend/libpq/hba.c#L2307
[1] https://github.com/postgres/postgres/blob/master/src/backend/libpq/hba.c#L2249


Re: Possible buffer overrun in src/backend/libpq/hba.c gethba_options()

From
Thomas Munro
Date:
On Tue, Nov 13, 2018 at 3:02 PM Julian Hsiao <jhsiao@salesforce.com> wrote:
> During a routine Coverity scan of our internal PostgreSQL fork, it
> issued a buffer overrun warning for src/backend/libpq/hba.c,
> gethba_options()[0]:
>
> MAIN_ISSUE EventDescription: Overrunning array "options" of 12 8-byte
> elements at element index 12 (byte offset 96) using index "noptions++"
> (which evaluates to 12).
> [...]
>         if (hba->ldapscope)
>             options[noptions++] =
>                 CStringGetTextDatum(psprintf("ldapscope=%d", hba->ldapscope));
> [...]
>
> This is because earlier in the function[1], if hba->usermap,
> hba->clientcert, and hba->pamservice were set then noptions would
> exceed MAX_HBA_OPTIONS. Of course, if those options are mutually
> exclusive with hba->auth_method == uaLDAP, then it's a false positive.
> Is that the case, or should MAX_HBA_OPTIONS be increased?

Right, thank you.  It seems clear that MAX_HBA_OPTIONS should be
increased and the comment near its definition is wrong.  Will fix.

-- 
Thomas Munro
http://www.enterprisedb.com


Re: Possible buffer overrun in src/backend/libpq/hba.c gethba_options()

From
Thomas Munro
Date:
On Tue, Nov 13, 2018 at 3:42 PM Thomas Munro
<thomas.munro@enterprisedb.com> wrote:
> On Tue, Nov 13, 2018 at 3:02 PM Julian Hsiao <jhsiao@salesforce.com> wrote:
> > During a routine Coverity scan of our internal PostgreSQL fork, it
> > issued a buffer overrun warning for src/backend/libpq/hba.c,
> > gethba_options()[0]:
> >
> > MAIN_ISSUE EventDescription: Overrunning array "options" of 12 8-byte
> > elements at element index 12 (byte offset 96) using index "noptions++"
> > (which evaluates to 12).
> > [...]
> >         if (hba->ldapscope)
> >             options[noptions++] =
> >                 CStringGetTextDatum(psprintf("ldapscope=%d", hba->ldapscope));
> > [...]
> >
> > This is because earlier in the function[1], if hba->usermap,
> > hba->clientcert, and hba->pamservice were set then noptions would
> > exceed MAX_HBA_OPTIONS. Of course, if those options are mutually
> > exclusive with hba->auth_method == uaLDAP, then it's a false positive.
> > Is that the case, or should MAX_HBA_OPTIONS be increased?
>
> Right, thank you.  It seems clear that MAX_HBA_OPTIONS should be
> increased and the comment near its definition is wrong.  Will fix.

I'm pretty sure that's not a live bug, but I pushed a fix to master,
11 and 10 (slightly different numbers) because it was still wrong.  I
hope Coverity is happier now.  Thanks for the report.

Gee, it'd be nice to be able to build dynamically sized arrays of
datums in something more like a C++ vector and get rid of code like
this.

-- 
Thomas Munro
http://www.enterprisedb.com