From 79473204cce678fe9c54c5170c1692fdd8a0ae14 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Zden=C4=9Bk=20Salvet?= Date: Wed, 3 May 2006 14:40:32 +0000 Subject: [PATCH] Fix for bug #16577 (connection hang in recv_token). --- org.glite.security.gsoap-plugin/src/glite_gss.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) 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) { -- 1.8.2.3