• Tom Lane's avatar
    Fix thinko in PQisBusy(). · ae27b1ac
    Tom Lane authored
    In commit 1f39a1c0 I made PQisBusy consider conn->write_failed, but
    that is now looking like complete brain fade.  In the first place, the
    logic is quite wrong: it ought to be like "and not" rather than "or".
    This meant that once we'd gotten into a write_failed state, PQisBusy
    would always return true, probably causing the calling application to
    iterate its loop until PQconsumeInput returns a hard failure thanks
    to connection loss.  That's not what we want: the intended behavior
    is to return an error PGresult, which the application probably has
    much cleaner support for.
    
    But in the second place, checking write_failed here seems like the
    wrong thing anyway.  The idea of the write_failed mechanism is to
    postpone handling of a write failure until we've read all we can from
    the server; so that flag should not interfere with input-processing
    behavior.  (Compare 7247e243.)  What we *should* check for is
    status = CONNECTION_BAD, ie, socket already closed.  (Most places that
    close the socket don't touch asyncStatus, but they do reset status.)
    This primarily ensures that if PQisBusy() returns true then there is
    an open socket, which is assumed by several call sites in our own
    code, and probably other applications too.
    
    While at it, fix a nearby thinko in libpq's my_sock_write: we should
    only consult errno for res < 0, not res == 0.  This is harmless since
    pqsecure_raw_write would force errno to zero in such a case, but it
    still could confuse readers.
    
    Noted by Andres Freund.  Backpatch to v12 where 1f39a1c0 came in.
    
    Discussion: https://postgr.es/m/20220211011025.ek7exh6owpzjyudn@alap3.anarazel.de
    ae27b1ac
fe-secure-openssl.c 47.6 KB