Don't send an empty SSPI negotiation packet at the end of the negotiation.
authorMagnus Hagander
Tue, 4 Dec 2007 13:02:53 +0000 (13:02 +0000)
committerMagnus Hagander
Tue, 4 Dec 2007 13:02:53 +0000 (13:02 +0000)
Fixes bug #3750

src/interfaces/libpq/fe-auth.c

index 38cae4de917f197d10eb9c7a55be6a510e6adea0..f3a177c985eea01820a8b8e82ed5202698f48c55 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/interfaces/libpq/fe-auth.c,v 1.133 2007/11/15 21:14:46 momjian Exp $
+ *   $PostgreSQL: pgsql/src/interfaces/libpq/fe-auth.c,v 1.134 2007/12/04 13:02:53 mha Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -618,11 +618,18 @@ pg_SSPI_continue(PGconn *conn)
            return STATUS_ERROR;
        }
 
-       if (pqPacketSend(conn, 'p',
-                  outbuf.pBuffers[0].pvBuffer, outbuf.pBuffers[0].cbBuffer))
+       /*
+        * If the negotiation is complete, there may be zero bytes to send. The server is
+        * at this point not expecting any more data, so don't send it.
+        */
+       if (outbuf.pBuffers[0].cbBuffer > 0)
        {
-           FreeContextBuffer(outbuf.pBuffers[0].pvBuffer);
-           return STATUS_ERROR;
+           if (pqPacketSend(conn, 'p',
+                      outbuf.pBuffers[0].pvBuffer, outbuf.pBuffers[0].cbBuffer))
+           {
+               FreeContextBuffer(outbuf.pBuffers[0].pvBuffer);
+               return STATUS_ERROR;
+           }
        }
        FreeContextBuffer(outbuf.pBuffers[0].pvBuffer);
    }