From: Daniel KouĊ™il Date: Tue, 8 Feb 2005 16:24:04 +0000 (+0000) Subject: Don't use static buffer for cached data but allocate a dynamic one. Should fix proble... X-Git-Tag: glite-lb-common_R_1_1_4~61 X-Git-Url: http://scientific.zcu.cz/git/?a=commitdiff_plain;h=3beba7e13361d55ecd0ff5032576acbd70ddc46c;p=jra1mw.git Don't use static buffer for cached data but allocate a dynamic one. Should fix problems with large GSSAPI tokens. --- diff --git a/org.glite.lb.common/interface/lb_gss.h b/org.glite.lb.common/interface/lb_gss.h index 047b718..3dd4903 100644 --- a/org.glite.lb.common/interface/lb_gss.h +++ b/org.glite.lb.common/interface/lb_gss.h @@ -21,7 +21,7 @@ enum { typedef struct _edg_wll_GssConnection { gss_ctx_id_t context; int sock; - char buffer[BUFSIZ]; + char *buffer; size_t bufsize; } edg_wll_GssConnection; diff --git a/org.glite.lb.common/src/lb_gss.c b/org.glite.lb.common/src/lb_gss.c index 19dfe1d..0142a83 100644 --- a/org.glite.lb.common/src/lb_gss.c +++ b/org.glite.lb.common/src/lb_gss.c @@ -793,11 +793,14 @@ edg_wll_gss_read(edg_wll_GssConnection *connection, void *buf, size_t bufsize, len = (connection->bufsize < bufsize) ? connection->bufsize : bufsize; memcpy(buf, connection->buffer, len); - connection->bufsize -= len; - if (connection->bufsize > 0) { - for (i = 0; i < sizeof(connection->buffer) - len; i++) + if (connection->bufsize - len == 0) { + free(connection->buffer); + connection->buffer = NULL; + } else { + for (i = 0; i < connection->bufsize - len; i++) connection->buffer[i] = connection->buffer[i+len]; } + connection->bufsize -= len; return len; } @@ -819,15 +822,21 @@ edg_wll_gss_read(edg_wll_GssConnection *connection, void *buf, size_t bufsize, } while (maj_stat == 0 && output_token.length == 0 && output_token.value == NULL); if (output_token.length > bufsize) { - if (output_token.length - bufsize > sizeof(connection->buffer)) - return EINVAL; connection->bufsize = output_token.length - bufsize; + connection->buffer = malloc(connection->bufsize); + if (connection->buffer == NULL) { + connection->bufsize = 0; + ret = EDG_WLL_GSS_ERROR_ERRNO; + goto end; + } memcpy(connection->buffer, output_token.value + bufsize, connection->bufsize); output_token.length = bufsize; } - memcpy(buf, output_token.value, output_token.length); + memcpy(buf, output_token.value, output_token.length); ret = output_token.length; + +end: gss_release_buffer(&min_stat, &output_token); return ret; @@ -844,14 +853,16 @@ edg_wll_gss_read_full(edg_wll_GssConnection *connection, void *buf, if (connection->bufsize > 0) { size_t len; - len = (connection->bufsize < bufsize) ? connection->bufsize : bufsize; memcpy(buf, connection->buffer, len); - connection->bufsize -= len; - if (connection->bufsize > 0) { - for (i = 0; i < sizeof(connection->buffer) - len; i++) + if (connection->bufsize - len == 0) { + free(connection->buffer); + connection->buffer = NULL; + } else { + for (i = 0; i < connection->bufsize - len; i++) connection->buffer[i] = connection->buffer[i+len]; } + connection->bufsize -= len; *total = len; } @@ -910,6 +921,8 @@ edg_wll_gss_close(edg_wll_GssConnection *con, struct timeval *timeout) if (con->sock >= 0) close(con->sock); } + if (con->buffer) + free(con->buffer); memset(con, 0, sizeof(*con)); con->context = GSS_C_NO_CONTEXT; con->sock = -1;