Fix setvbuf()-induced crash in libpq_pipeline
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Thu, 1 Apr 2021 19:25:46 +0000 (16:25 -0300)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Thu, 1 Apr 2021 19:25:51 +0000 (16:25 -0300)
Windows doesn't like setvbuf(..., _IOLBF) and crashes if you use it,
which has been causing the libpq_pipeline failures all along ... and our
own port.h has known about it for a long time: it offers PG_IOLBF that's
defined to _IONBF on that platform.  Follow its advice.

While at it, get rid of a bogus bitshift that used a constant of the
wrong size.  Decorate the constant as LL to fix.  While at it, remove a
pointless addition that only confused matters.

All as diagnosed by Tom Lane.

Discussion: https://postgr.es/m/3458958.1617302154@sss.pgh.pa.us

src/test/modules/libpq_pipeline/libpq_pipeline.c

index 4fc35cacf8f7ea8176b0b07a1d4653817398d0b4..95ffaae9f678d43f56b521bcdadb3f7cf7194df4 100644 (file)
@@ -724,8 +724,8 @@ test_pipelined_insert(PGconn *conn, int n_rows)
            if (send_step == BI_INSERT_ROWS)
            {
                snprintf(insert_param_0, MAXINTLEN, "%d", rows_to_send);
-               snprintf(insert_param_1, MAXINT8LEN, "%lld",
-                        (1L << 62) + (long long) rows_to_send);
+               /* use up some buffer space with a wide value */
+               snprintf(insert_param_1, MAXINT8LEN, "%lld", 1LL << 62);
 
                if (PQsendQueryPrepared(conn, "my_insert",
                                        2, insert_params, NULL, NULL, 0) == 1)
@@ -1324,7 +1324,7 @@ main(int argc, char **argv)
            pg_fatal("could not open file \"%s\": %m", tracefile);
 
        /* Make it line-buffered */
-       setvbuf(trace, NULL, _IOLBF, 0);
+       setvbuf(trace, NULL, PG_IOLBF, 0);
 
        PQtrace(conn, trace);
        PQtraceSetFlags(conn,