Re: PQHost() undefined behavior if connecting string contains both host and hostaddr types

From: Haribabu Kommi <kommi(dot)haribabu(at)gmail(dot)com>
To: Michael Paquier <michael(at)paquier(dot)xyz>
Cc: Kyotaro HORIGUCHI <horiguchi(dot)kyotaro(at)lab(dot)ntt(dot)co(dot)jp>, Peter Eisentraut <peter(dot)eisentraut(at)2ndquadrant(dot)com>, Pg Hackers <pgsql-hackers(at)postgresql(dot)org>, Michael Paquier <michael(dot)paquier(at)gmail(dot)com>, Robert Haas <robertmhaas(at)gmail(dot)com>
Subject: Re: PQHost() undefined behavior if connecting string contains both host and hostaddr types
Date: 2018-03-26 06:49:22
Message-ID: CAJrrPGdYQ92R1hNArCByu+gN_SGsFMjGvbErjH0N9W8Ry24CxA@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Mon, Mar 26, 2018 at 4:17 PM, Michael Paquier <michael(at)paquier(dot)xyz>
wrote:

> On Mon, Mar 26, 2018 at 11:28:41AM +0900, Kyotaro HORIGUCHI wrote:
> > At Sun, 25 Mar 2018 22:27:09 +1100, Haribabu Kommi <
> kommi(dot)haribabu(at)gmail(dot)com> wrote in <CAJrrPGeaQxWsU3RZ0yxGa=WY+
> wnA+nvE_YPuKzBDaqRMUt9SyA(at)mail(dot)gmail(dot)com>
> >> On Sun, Mar 25, 2018 at 12:56 AM, Michael Paquier <michael(at)paquier(dot)xyz>
> >> wrote:
>

Thanks for the review.

> > As the commit message of 50cb21f70, the function is intended not
> > to return NULL in order to prevent the user functions from a
> > crash in corner cases.
>
> The commit number is not correct here. You mean 40cb21f.
>
> > https://www.postgresql.org/message-id/19297.1493660213%40sss.pgh.pa.us
>
> I quite like the idea of using an empty string value in those cases.
> This could prevent crashes at leat for applications not doing NULL-ness
> checks.
>

I also agree to return an empty string. I did this only for the cases where
the conn is
not NULL but the status is not proper or the connhost is NULL.

> > Since the
> > purpose of PGhost is not strictly defined, especially on
> > connection failure, returning the given host list can be another
> > candidate (and the same can be said for returning ""). I think
> > users shouldn't (and I believe no one does) rely on the values
> > from the functions when CONNECTION_BAD, anyway.
>
> Yeah, this should really be documented and also should refer to the fact
> that this happens when specifying multiple hosts.
>

Added.

> > My opinion is to add a description that is saying like "these
> > functions return unreliable values for a failed connection".
>
> At the same time I don't think that this is sufficient either, because
> for multiple hosts, PQhost() just returns the first one, which makes
> absolutely no sense because the value is wrong. So I think that using a
> third, separate value has some advantages:
> - If NULL, this just means that the initialization did not happen.
> - If using an empty string, then the value cannot be evaluated.
> - If this returns a host or hostaddr (if host has not been specified),
> then that's the host which is actually used for the connection.
> Having those three states has value for applications in my opinion.
>
> The same can apply to PQport, or any other functions which for whatever
> reason add support for multiple values like host, hostaddr or port.
>

I hope that I updated the documentation properly to explain all the above
cases.

> >> Updated patch attached with behavior of returning NULL for connections
> of
> >> CONNECTION_BAD status.
> >
> > The patch does Assert() in PQhost. I suppose that Assert() in
> > client library is usable only when no more (library's) operation
> > cannot continue. It would be better to return a fallback value in
> > this criteria.
>
> The patch has to return a value as well. A shaped the patch causes
> again compilation warnings because not all code paths have a return
> value. So my previous remark has not been fixed. Hari, what do you use
> as compiler, my gcc blows a warning and reading the patch that's
> obviously incorrect.
>

In my assert enabled build, I didn't get any warning. Yes that patch to fix
the
warning is clearly wrong. I corrected in a different way of adding Assert
checks
for the hostaddr, because definitely host or hostaddr must be present.

> + PQHost returns NULL when the connection is not established or
> In the docs, this is wrong for two reasons:
> - There should be a <function> markup.
> - The name of the function is PQhost, not PGHost.
>

Corrected.

Updated patch attached.

Regards,
Hari Babu
Fujitsu Australia

Attachment Content-Type Size
PQhost-to-return-active-connected-host-and-hostaddr_v5.patch application/octet-stream 4.3 KB

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Michael Paquier 2018-03-26 07:16:31 Re: Add default role 'pg_access_server_files'
Previous Message Aleksandr Parfenov 2018-03-26 06:24:05 Re: new function for tsquery creartion