curl-library
[PATCH 1/4] lib: remove some uses of malloc in favor of stack alloc
Date: Mon, 6 May 2013 14:19:48 -0400
These are all cases where we're alloc'ing a fixed size buffer and not
returning it to the caller, or explicitly avoiding large allocations on
the stack.
The overall effect of this is actually a small net shrinkage in library
size:
$ bloat-o-meter libcurl.so.before libcurl.so.after
add/remove: 1/2 grow/shrink: 0/3 up/down: 4038/-4077 (-39)
function old new delta
static.get_cert_chain - 4038 +4038
Curl_cookie_init 429 404 -25
Curl_cookie_add 3180 3112 -68
static.X509_signature 178 - -178
X509V3_ext 557 - -557
servercert 5476 2227 -3249
--- This sort of change can be applied elsewhere in the lib, but it means getting involved with the tedium of changing internal struct definitions and probably some attention with bloat-o-meter to make sure the changes are worthwhile. lib/cookie.c | 40 ++++++++++++++++------------------------ lib/ssluse.c | 30 +++++++++++------------------- 2 files changed, 27 insertions(+), 43 deletions(-) diff --git a/lib/cookie.c b/lib/cookie.c index a67204e..fad8364 100644 --- a/lib/cookie.c +++ b/lib/cookie.c @@ -221,13 +221,7 @@ Curl_cookie_add(struct SessionHandle *data, /* This line was read off a HTTP-header */ const char *ptr; const char *semiptr; - char *what; - - what = malloc(MAX_COOKIE_LINE); - if(!what) { - free(co); - return NULL; - } + char what[MAX_COOKIE_LINE]; semiptr=strchr(lineptr, ';'); /* first, find a semicolon */ @@ -757,26 +751,24 @@ struct CookieInfo *Curl_cookie_init(struct SessionHandle *data, if(fp) { char *lineptr; bool headerline; + char line[MAX_COOKIE_LINE]; - char *line = malloc(MAX_COOKIE_LINE); - if(line) { - while(fgets(line, MAX_COOKIE_LINE, fp)) { - if(checkprefix("Set-Cookie:", line)) { - /* This is a cookie line, get it! */ - lineptr=&line[11]; - headerline=TRUE; - } - else { - lineptr=line; - headerline=FALSE; - } - while(*lineptr && ISBLANK(*lineptr)) - lineptr++; - - Curl_cookie_add(data, c, headerline, lineptr, NULL, NULL); + while(fgets(line, MAX_COOKIE_LINE, fp)) { + if(checkprefix("Set-Cookie:", line)) { + /* This is a cookie line, get it! */ + lineptr=&line[11]; + headerline=TRUE; + } + else { + lineptr=line; + headerline=FALSE; } - free(line); /* free the line buffer */ + while(*lineptr && ISBLANK(*lineptr)) + lineptr++; + + Curl_cookie_add(data, c, headerline, lineptr, NULL, NULL); } + if(fromfile) fclose(fp); } diff --git a/lib/ssluse.c b/lib/ssluse.c index a6709d9..14e3f4b 100644 --- a/lib/ssluse.c +++ b/lib/ssluse.c @@ -2010,23 +2010,17 @@ static CURLcode get_cert_chain(struct connectdata *conn, { STACK_OF(X509) *sk; int i; - char *bufp; + char bufp[CERTBUFFERSIZE]; struct SessionHandle *data = conn->data; int numcerts; - bufp = malloc(CERTBUFFERSIZE); - if(!bufp) - return CURLE_OUT_OF_MEMORY; - sk = SSL_get_peer_cert_chain(connssl->handle); if(!sk) { - free(bufp); return CURLE_OUT_OF_MEMORY; } numcerts = sk_X509_num(sk); if(init_certinfo(data, numcerts)) { - free(bufp); return CURLE_OUT_OF_MEMORY; } @@ -2048,27 +2042,27 @@ static CURLcode get_cert_chain(struct connectdata *conn, int j; char *ptr; - (void)x509_name_oneline(X509_get_subject_name(x), bufp, CERTBUFFERSIZE); + (void)x509_name_oneline(X509_get_subject_name(x), bufp, sizeof(bufp)); infof(data, "%2d Subject: %s\n", i, bufp); push_certinfo(data, i, "Subject", bufp); - (void)x509_name_oneline(X509_get_issuer_name(x), bufp, CERTBUFFERSIZE); + (void)x509_name_oneline(X509_get_issuer_name(x), bufp, sizeof(bufp)); infof(data, " Issuer: %s\n", bufp); push_certinfo(data, i, "Issuer", bufp); value = X509_get_version(x); infof(data, " Version: %lu (0x%lx)\n", value+1, value); - snprintf(bufp, CERTBUFFERSIZE, "%lx", value); + snprintf(bufp, sizeof(bufp), "%lx", value); push_certinfo(data, i, "Version", bufp); /* hex */ num=X509_get_serialNumber(x); if(num->length <= 4) { value = ASN1_INTEGER_get(num); infof(data," Serial Number: %ld (0x%lx)\n", value, value); - snprintf(bufp, CERTBUFFERSIZE, "%lx", value); + snprintf(bufp, sizeof(bufp), "%lx", value); } else { - int left = CERTBUFFERSIZE; + int left = sizeof(bufp); ptr = bufp; *ptr++ = 0; @@ -2092,23 +2086,23 @@ static CURLcode get_cert_chain(struct connectdata *conn, cinf = x->cert_info; - j = asn1_object_dump(cinf->signature->algorithm, bufp, CERTBUFFERSIZE); + j = asn1_object_dump(cinf->signature->algorithm, bufp, sizeof(bufp)); if(!j) { infof(data, " Signature Algorithm: %s\n", bufp); push_certinfo(data, i, "Signature Algorithm", bufp); } certdate = X509_get_notBefore(x); - asn1_output(certdate, bufp, CERTBUFFERSIZE); + asn1_output(certdate, bufp, sizeof(bufp)); infof(data, " Start date: %s\n", bufp); push_certinfo(data, i, "Start date", bufp); certdate = X509_get_notAfter(x); - asn1_output(certdate, bufp, CERTBUFFERSIZE); + asn1_output(certdate, bufp, sizeof(bufp)); infof(data, " Expire date: %s\n", bufp); push_certinfo(data, i, "Expire date", bufp); - j = asn1_object_dump(cinf->key->algor->algorithm, bufp, CERTBUFFERSIZE); + j = asn1_object_dump(cinf->key->algor->algorithm, bufp, sizeof(bufp)); if(!j) { infof(data, " Public Key Algorithm: %s\n", bufp); push_certinfo(data, i, "Public Key Algorithm", bufp); @@ -2122,7 +2116,7 @@ static CURLcode get_cert_chain(struct connectdata *conn, case EVP_PKEY_RSA: infof(data, " RSA Public Key (%d bits)\n", BN_num_bits(pubkey->pkey.rsa->n)); - snprintf(bufp, CERTBUFFERSIZE, "%d", BN_num_bits(pubkey->pkey.rsa->n)); + snprintf(bufp, sizeof(bufp), "%d", BN_num_bits(pubkey->pkey.rsa->n)); push_certinfo(data, i, "RSA Public Key", bufp); print_pubkey_BN(rsa, n, i); @@ -2163,8 +2157,6 @@ static CURLcode get_cert_chain(struct connectdata *conn, dumpcert(data, x, i); } - free(bufp); - return CURLE_OK; } -- 1.8.2.2 ------------------------------------------------------------------- List admin: http://cool.haxx.se/list/listinfo/curl-library Etiquette: http://curl.haxx.se/mail/etiquette.htmlReceived on 2013-05-06