Commit 8db96878efbfef0d065b130d94c5d04d8d8b3f6e
1 parent
23039bb8
Exists in
master
and in
3 other branches
CRL download buffer is now dynamic.
Showing
1 changed file
with
27 additions
and
14 deletions
Show diff stats
src/lib3270/ssl/linux/getcrl.c
@@ -33,7 +33,7 @@ | @@ -33,7 +33,7 @@ | ||
33 | * | 33 | * |
34 | */ | 34 | */ |
35 | 35 | ||
36 | -#define CRL_DATA_LENGTH 16384 | 36 | +#define CRL_DATA_LENGTH 2048 |
37 | 37 | ||
38 | #include <config.h> | 38 | #include <config.h> |
39 | 39 | ||
@@ -117,14 +117,25 @@ typedef struct _curldata | @@ -117,14 +117,25 @@ typedef struct _curldata | ||
117 | H3270 * hSession; | 117 | H3270 * hSession; |
118 | SSL_ERROR_MESSAGE * message; | 118 | SSL_ERROR_MESSAGE * message; |
119 | char errbuf[CURL_ERROR_SIZE]; | 119 | char errbuf[CURL_ERROR_SIZE]; |
120 | - unsigned char contents[CRL_DATA_LENGTH]; | 120 | + struct { |
121 | + size_t length; | ||
122 | + unsigned char * contents; | ||
123 | + } data; | ||
121 | } CURLDATA; | 124 | } CURLDATA; |
122 | 125 | ||
123 | static inline void lib3270_autoptr_cleanup_CURLDATA(CURLDATA **ptr) | 126 | static inline void lib3270_autoptr_cleanup_CURLDATA(CURLDATA **ptr) |
124 | { | 127 | { |
125 | debug("%s(%p)",__FUNCTION__,*ptr); | 128 | debug("%s(%p)",__FUNCTION__,*ptr); |
126 | if(*ptr) | 129 | if(*ptr) |
127 | - lib3270_free(*ptr); | 130 | + { |
131 | + CURLDATA *cdata = *ptr; | ||
132 | + | ||
133 | + if(cdata->data.contents) { | ||
134 | + lib3270_free(cdata->data.contents); | ||
135 | + cdata->data.contents = NULL; | ||
136 | + } | ||
137 | + lib3270_free(cdata); | ||
138 | + } | ||
128 | *ptr = NULL; | 139 | *ptr = NULL; |
129 | } | 140 | } |
130 | 141 | ||
@@ -146,10 +157,10 @@ static size_t internal_curl_write_callback(void *contents, size_t size, size_t n | @@ -146,10 +157,10 @@ static size_t internal_curl_write_callback(void *contents, size_t size, size_t n | ||
146 | 157 | ||
147 | debug("%s size=%d data->length=%d crldatalength=%d",__FUNCTION__,(int) size, (int) data->length, CRL_DATA_LENGTH); | 158 | debug("%s size=%d data->length=%d crldatalength=%d",__FUNCTION__,(int) size, (int) data->length, CRL_DATA_LENGTH); |
148 | 159 | ||
149 | - if((size + data->length) > CRL_DATA_LENGTH) | 160 | + if((realsize + data->length) > data->data.length) |
150 | { | 161 | { |
151 | - debug("CRL Data block is bigger than allocated block (%u bytes)",(unsigned int) size); | ||
152 | - return 0; | 162 | + data->data.length += (CRL_DATA_LENGTH + realsize); |
163 | + data->data.contents = lib3270_realloc(data->data.contents,data->data.length); | ||
153 | } | 164 | } |
154 | 165 | ||
155 | debug("%s",__FUNCTION__); | 166 | debug("%s",__FUNCTION__); |
@@ -166,7 +177,7 @@ static size_t internal_curl_write_callback(void *contents, size_t size, size_t n | @@ -166,7 +177,7 @@ static size_t internal_curl_write_callback(void *contents, size_t size, size_t n | ||
166 | 177 | ||
167 | debug("%s",__FUNCTION__); | 178 | debug("%s",__FUNCTION__); |
168 | 179 | ||
169 | - memcpy(&(data->contents[data->length]),contents,realsize); | 180 | + memcpy(&(data->data.contents[data->length]),contents,realsize); |
170 | data->length += realsize; | 181 | data->length += realsize; |
171 | 182 | ||
172 | debug("%s",__FUNCTION__); | 183 | debug("%s",__FUNCTION__); |
@@ -413,12 +424,14 @@ int lib3270_get_X509_CRL(H3270 *hSession, SSL_ERROR_MESSAGE * message) | @@ -413,12 +424,14 @@ int lib3270_get_X509_CRL(H3270 *hSession, SSL_ERROR_MESSAGE * message) | ||
413 | #ifdef HAVE_LIBCURL | 424 | #ifdef HAVE_LIBCURL |
414 | 425 | ||
415 | // Use CURL to download the CRL | 426 | // Use CURL to download the CRL |
416 | - lib3270_autoptr(CURLDATA) crl_data = lib3270_malloc(sizeof(CURLDATA)); | ||
417 | - lib3270_autoptr(CURL) hCurl = curl_easy_init(); | 427 | + lib3270_autoptr(CURLDATA) crl_data = lib3270_malloc(sizeof(CURLDATA)); |
428 | + lib3270_autoptr(CURL) hCurl = curl_easy_init(); | ||
418 | 429 | ||
419 | memset(crl_data,0,sizeof(CURLDATA)); | 430 | memset(crl_data,0,sizeof(CURLDATA)); |
420 | - crl_data->message = message; | ||
421 | - crl_data->hSession = hSession; | 431 | + crl_data->message = message; |
432 | + crl_data->hSession = hSession; | ||
433 | + crl_data->data.length = CRL_DATA_LENGTH; | ||
434 | + crl_data->data.contents = lib3270_malloc(crl_data->data.length); | ||
422 | 435 | ||
423 | if(hCurl) | 436 | if(hCurl) |
424 | { | 437 | { |
@@ -478,7 +491,7 @@ int lib3270_get_X509_CRL(H3270 *hSession, SSL_ERROR_MESSAGE * message) | @@ -478,7 +491,7 @@ int lib3270_get_X509_CRL(H3270 *hSession, SSL_ERROR_MESSAGE * message) | ||
478 | 491 | ||
479 | if(ct) | 492 | if(ct) |
480 | { | 493 | { |
481 | - const unsigned char * data = crl_data->contents; | 494 | + const unsigned char * data = crl_data->data.contents; |
482 | 495 | ||
483 | if(strcasecmp(ct,"application/pkix-crl") == 0) | 496 | if(strcasecmp(ct,"application/pkix-crl") == 0) |
484 | { | 497 | { |
@@ -504,13 +517,13 @@ int lib3270_get_X509_CRL(H3270 *hSession, SSL_ERROR_MESSAGE * message) | @@ -504,13 +517,13 @@ int lib3270_get_X509_CRL(H3270 *hSession, SSL_ERROR_MESSAGE * message) | ||
504 | else if(strncasecmp(consturl,"ldap://",7) == 0) | 517 | else if(strncasecmp(consturl,"ldap://",7) == 0) |
505 | { | 518 | { |
506 | // It's an LDAP query, assumes a base64 data. | 519 | // It's an LDAP query, assumes a base64 data. |
507 | - char * data = strstr((char *) crl_data->contents,":: "); | 520 | + char * data = strstr((char *) crl_data->data.contents,":: "); |
508 | if(!data) | 521 | if(!data) |
509 | { | 522 | { |
510 | message->error = hSession->ssl.error = ERR_get_error(); | 523 | message->error = hSession->ssl.error = ERR_get_error(); |
511 | message->title = N_( "Security error" ); | 524 | message->title = N_( "Security error" ); |
512 | message->text = N_( "Got an invalid CRL from LDAP server" ); | 525 | message->text = N_( "Got an invalid CRL from LDAP server" ); |
513 | - lib3270_write_log(hSession,"ssl","%s: invalid format:\n%s\n",consturl, crl_data->contents); | 526 | + lib3270_write_log(hSession,"ssl","%s: invalid format:\n%s\n",consturl, crl_data->data.contents); |
514 | return -1; | 527 | return -1; |
515 | } | 528 | } |
516 | data += 3; | 529 | data += 3; |