]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
Corrected bug in gnutls_bye() which made it return an error code
authorNikos Mavrogiannopoulos <nmav@gnutls.org>
Fri, 19 Dec 2003 08:47:34 +0000 (08:47 +0000)
committerNikos Mavrogiannopoulos <nmav@gnutls.org>
Fri, 19 Dec 2003 08:47:34 +0000 (08:47 +0000)
of INVALID_REQUEST instead of success.

NEWS
lib/gnutls_int.h
lib/gnutls_record.c
src/cli.c

diff --git a/NEWS b/NEWS
index c223b727da45066ca9680ffdd7f2c49218f6227c..c8761c58e41fd5b232d47a8e1a24d305f61e07ca 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,7 @@
+Version 1.0.3
+- Corrected bug in gnutls_bye() which made it return an error code
+  of INVALID_REQUEST instead of success.
+
 Version 1.0.2 (18/12/2003)
 - Corrected a bug in the RSA key generation. This was
   generating unusable RSA keys.
index 1b9e21dcfceb2d93ce2c6b82f6579b168ba3782f..ef95fee29c0e5023ecceef021d3caa22632a1525 100644 (file)
@@ -131,7 +131,7 @@ typedef enum gnutls_close_request { GNUTLS_SHUT_RDWR=0, GNUTLS_SHUT_WR=1 } gnutl
 
 typedef enum HandshakeState { STATE0=0, STATE1, STATE2, STATE3, STATE4, STATE5,
        STATE6, STATE7, STATE8, STATE9, STATE20=20, STATE21,
-       STATE30=30, STATE31, STATE50=50, STATE60=60, STATE61 } HandshakeState;
+       STATE30=30, STATE31, STATE50=50, STATE60=60, STATE61, STATE62 } HandshakeState;
 
 typedef enum HandshakeType { GNUTLS_HELLO_REQUEST, GNUTLS_CLIENT_HELLO, GNUTLS_SERVER_HELLO,
                     GNUTLS_CERTIFICATE_PKT=11, GNUTLS_SERVER_KEY_EXCHANGE,
index 9cedd37f471f2ec35010cca2646489133462dd53..1629b9eddef6357d62f8ca91c9986b1720676332 100644 (file)
@@ -169,29 +169,37 @@ void gnutls_transport_get_ptr2(gnutls_session session,
   **/
 int gnutls_bye( gnutls_session session, gnutls_close_request how)
 {
-       int ret = 0, ret2 = 0;
+       int ret = 0;
 
        switch (STATE) {
                case STATE0:
                case STATE60:
-                       if (STATE==STATE60) {
-                               ret = _gnutls_io_write_flush( session);
-                       } else {
-                               ret = gnutls_alert_send( session, GNUTLS_AL_WARNING, GNUTLS_A_CLOSE_NOTIFY);
-                               STATE = STATE60;
+                       ret = _gnutls_io_write_flush( session);
+                       STATE = STATE60;
+                       if (ret < 0) {
+                               gnutls_assert();
+                               return ret;
                        }
 
-                       if (ret < 0)
-                               return ret;
                case STATE61:
-                       if ( how == GNUTLS_SHUT_RDWR && ret >= 0) {
-                               ret2 = _gnutls_recv_int( session, GNUTLS_ALERT, -1, NULL, 0); 
-                               if (ret2 >= 0) session->internals.may_read = 1;
-                       }
+                       ret = gnutls_alert_send( session, GNUTLS_AL_WARNING, GNUTLS_A_CLOSE_NOTIFY);
                        STATE = STATE61;
+                       if (ret < 0) {
+                               gnutls_assert();
+                               return ret;
+                       }
 
-                       if (ret2 < 0)
-                               return ret2;
+               case STATE62:
+                       if ( how == GNUTLS_SHUT_RDWR) {
+                               ret = _gnutls_recv_int( session, GNUTLS_ALERT, -1, NULL, 0); 
+                               if (ret >= 0) session->internals.may_read = 1;
+                       }
+                       STATE = STATE62;
+
+                       if (ret < 0) {
+                               gnutls_assert();
+                               return ret;
+                       }
                        break;
                default:
                        gnutls_assert();
@@ -697,7 +705,7 @@ ssize_t _gnutls_recv_int( gnutls_session session, ContentType type, HandshakeTyp
        uint16 header_size;
        int empty_packet = 0;
 
-       if (sizeofdata == 0 || data == NULL) {
+       if (type != GNUTLS_ALERT && (sizeofdata == 0 || data == NULL)) {
                return GNUTLS_E_INVALID_REQUEST;
        }
 
index 539251efe9be76e1892bfaad9bf19de7f8060581..d54bc531844646aa169ff7f4dbf600bff801bfca 100644 (file)
--- a/src/cli.c
+++ b/src/cli.c
@@ -617,6 +617,8 @@ void socket_bye(socket_st * socket)
                            gnutls_bye(socket->session, GNUTLS_SHUT_RDWR);
                while (ret == GNUTLS_E_INTERRUPTED
                       || ret == GNUTLS_E_AGAIN);
+               if (ret < 0)
+                       fprintf(stderr, "*** gnutls_bye() error: %s\n", gnutls_strerror(ret));
                gnutls_deinit(socket->session);
                socket->session = NULL;
        }