Fix for bug #16577 (connection hang in recv_token).
authorZdeněk Salvet <salvet@ics.muni.cz>
Wed, 3 May 2006 14:40:32 +0000 (14:40 +0000)
committerZdeněk Salvet <salvet@ics.muni.cz>
Wed, 3 May 2006 14:40:32 +0000 (14:40 +0000)
org.glite.security.gsoap-plugin/src/glite_gss.c

index 7f79063..02dc1bb 100644 (file)
@@ -317,6 +317,12 @@ end:
    return ret;
 }
 
+#define SSL_TOKEN_HEADER_LENGTH 5
+static size_t ssl_token_length(char *t, int tl) {
+       unsigned char *b = t;
+       return (((size_t)(b[3]) << 8) | b[4]) + 5;
+}
+
 static int
 recv_token(int sock, void **token, size_t *token_length, struct timeval *to)
 {
@@ -325,6 +331,7 @@ recv_token(int sock, void **token, size_t *token_length, struct timeval *to)
    char *t = NULL;
    char *tmp;
    size_t tl = 0;
+   size_t expect = 0;
    fd_set fds;
    struct timeval timeout,before,after;
    int ret;
@@ -335,6 +342,7 @@ recv_token(int sock, void **token, size_t *token_length, struct timeval *to)
    }
 
    ret = 0;
+   expect = SSL_TOKEN_HEADER_LENGTH;
    do {
       FD_ZERO(&fds);
       FD_SET(sock,&fds);
@@ -349,7 +357,7 @@ recv_token(int sock, void **token, size_t *token_length, struct timeval *to)
            break;
       }
       
-      count = read(sock, buf, sizeof(buf));
+      count = read(sock, buf, MIN(expect - tl, sizeof(buf)));
       if (count < 0) {
         if (errno == EINTR)
            continue;
@@ -368,7 +376,13 @@ recv_token(int sock, void **token, size_t *token_length, struct timeval *to)
       t = tmp;
       memcpy(t + tl, buf, count);
       tl += count;
-   } while (count == sizeof(buf));
+
+      if ((expect == SSL_TOKEN_HEADER_LENGTH) && 
+               (tl >= SSL_TOKEN_HEADER_LENGTH)) {
+        expect = ssl_token_length(t, tl);
+      }
+
+   } while ((count == 0) || (tl < expect));
 
 end:
    if (to) {