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)
{
char *t = NULL;
char *tmp;
size_t tl = 0;
+ size_t expect = 0;
fd_set fds;
struct timeval timeout,before,after;
int ret;
}
ret = 0;
+ expect = SSL_TOKEN_HEADER_LENGTH;
do {
FD_ZERO(&fds);
FD_SET(sock,&fds);
break;
}
- count = read(sock, buf, sizeof(buf));
+ count = read(sock, buf, MIN(expect - tl, sizeof(buf)));
if (count < 0) {
if (errno == EINTR)
continue;
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) {