From: Zdeněk Salvet Date: Wed, 3 May 2006 14:40:32 +0000 (+0000) Subject: Fix for bug #16577 (connection hang in recv_token). X-Git-Tag: gridsite-core_R_1_1_19~47 X-Git-Url: http://scientific.zcu.cz/git/?a=commitdiff_plain;h=79473204cce678fe9c54c5170c1692fdd8a0ae14;p=jra1mw.git Fix for bug #16577 (connection hang in recv_token). --- diff --git a/org.glite.security.gsoap-plugin/src/glite_gss.c b/org.glite.security.gsoap-plugin/src/glite_gss.c index 7f79063..02dc1bb 100644 --- a/org.glite.security.gsoap-plugin/src/glite_gss.c +++ b/org.glite.security.gsoap-plugin/src/glite_gss.c @@ -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) {