Changeset 765cac2 in mod_gnutls for src/gnutls_hooks.c


Ignore:
Timestamp:
Feb 23, 2014, 1:45:01 PM (6 years ago)
Author:
Daniel Kahn Gillmor <dkg@…>
Branches:
debian/master, debian/stretch-backports, jessie-backports, master, upstream
Children:
031acac, 8a30d35
Parents:
2aaf4f5
Message:

clean up MGS_SIDE abuse of apr_pstrcat

We were allocating twice as many sections of RAM when exporting
environment variables as we needed to (the names of each env var as
well as the content).

This change statically allocates the names of most of the environment
variables, reducing the number of function calls and dynamic
allocations at runtime.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/gnutls_hooks.c

    r2aaf4f5 r765cac2  
    33 *  Copyright 2008 Nikos Mavrogiannopoulos
    44 *  Copyright 2011 Dash Shendy
     5 *  Copyright 2013-2014 Daniel Kahn Gillmor
    56 *
    67 *  Licensed under the Apache License, Version 2.0 (the "License");
     
    897898 * to use for the PEM-encoded certificate (0 means do not export)
    898899 */
    899 #define MGS_SIDE ((side==0)?"SSL_SERVER":"SSL_CLIENT")
     900#define MGS_SIDE(suffix) ((side==0) ? "SSL_SERVER" suffix : "SSL_CLIENT" suffix)
    900901
    901902static void mgs_add_common_cert_vars(request_rec * r, gnutls_x509_crt_t cert, int side, int export_cert_size) {
     
    918919        if (ret == GNUTLS_E_SHORT_MEMORY_BUFFER) {
    919920            if (len >= export_cert_size) {
    920                 apr_table_setn(env, apr_pstrcat(r->pool, MGS_SIDE, "_CERT", NULL),
    921                                "GNUTLS_CERTIFICATE_SIZE_LIMIT_EXCEEDED");
     921                apr_table_setn(env, MGS_SIDE("_CERT"), "GNUTLS_CERTIFICATE_SIZE_LIMIT_EXCEEDED");
    922922                ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r,
    923923                              "GnuTLS: Failed to export too-large X.509 certificate to environment");
     
    926926                if (cert_buf != NULL && gnutls_x509_crt_export(cert, GNUTLS_X509_FMT_PEM, cert_buf, &len) >= 0) {
    927927                    cert_buf[len] = 0;
    928                     apr_table_setn(env, apr_pstrcat(r->pool, MGS_SIDE, "_CERT", NULL), cert_buf);
     928                    apr_table_setn(env, MGS_SIDE("_CERT"), cert_buf);
    929929                } else {
    930930                    ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, r,
     
    940940    len = sizeof (buf);
    941941    gnutls_x509_crt_get_dn(cert, buf, &len);
    942     apr_table_setn(env, apr_pstrcat(r->pool, MGS_SIDE, "_S_DN", NULL),
    943             apr_pstrmemdup(r->pool, buf, len));
     942    apr_table_setn(env, MGS_SIDE("_S_DN"), apr_pstrmemdup(r->pool, buf, len));
    944943
    945944    len = sizeof (buf);
    946945    gnutls_x509_crt_get_issuer_dn(cert, buf, &len);
    947     apr_table_setn(env, apr_pstrcat(r->pool, MGS_SIDE, "_I_DN", NULL),
    948             apr_pstrmemdup(r->pool, buf, len));
     946    apr_table_setn(env, MGS_SIDE("_I_DN"), apr_pstrmemdup(r->pool, buf, len));
    949947
    950948    len = sizeof (sbuf);
    951949    gnutls_x509_crt_get_serial(cert, sbuf, &len);
    952950    tmp = mgs_session_id2sz(sbuf, len, buf, sizeof (buf));
    953     apr_table_setn(env,
    954             apr_pstrcat(r->pool, MGS_SIDE, "_M_SERIAL", NULL),
    955             apr_pstrdup(r->pool, tmp));
     951    apr_table_setn(env, MGS_SIDE("_M_SERIAL"), apr_pstrdup(r->pool, tmp));
    956952
    957953    ret = gnutls_x509_crt_get_version(cert);
    958954    if (ret > 0)
    959         apr_table_setn(env,
    960             apr_pstrcat(r->pool, MGS_SIDE, "_M_VERSION",
    961             NULL), apr_psprintf(r->pool,
    962             "%u", ret));
    963 
    964     apr_table_setn(env,
    965             apr_pstrcat(r->pool, MGS_SIDE, "_CERT_TYPE", NULL),
    966             "X.509");
     955        apr_table_setn(env, MGS_SIDE("_M_VERSION"),
     956                       apr_psprintf(r->pool, "%u", ret));
     957
     958    apr_table_setn(env, MGS_SIDE("_CERT_TYPE"), "X.509");
    967959
    968960    tmp =
    969961            mgs_time2sz(gnutls_x509_crt_get_expiration_time
    970962            (cert), buf, sizeof (buf));
    971     apr_table_setn(env, apr_pstrcat(r->pool, MGS_SIDE, "_V_END", NULL),
    972             apr_pstrdup(r->pool, tmp));
     963    apr_table_setn(env, MGS_SIDE("_V_END"), apr_pstrdup(r->pool, tmp));
    973964
    974965    tmp =
    975966            mgs_time2sz(gnutls_x509_crt_get_activation_time
    976967            (cert), buf, sizeof (buf));
    977     apr_table_setn(env,
    978             apr_pstrcat(r->pool, MGS_SIDE, "_V_START", NULL),
    979             apr_pstrdup(r->pool, tmp));
     968    apr_table_setn(env, MGS_SIDE("_V_START"), apr_pstrdup(r->pool, tmp));
    980969
    981970    ret = gnutls_x509_crt_get_signature_algorithm(cert);
    982971    if (ret >= 0) {
    983         apr_table_setn(env,
    984                 apr_pstrcat(r->pool, MGS_SIDE, "_A_SIG",
    985                 NULL),
     972        apr_table_setn(env, MGS_SIDE("_A_SIG"),
    986973                gnutls_sign_algorithm_get_name(ret));
    987974    }
     
    989976    ret = gnutls_x509_crt_get_pk_algorithm(cert, NULL);
    990977    if (ret >= 0) {
    991         apr_table_setn(env,
    992                 apr_pstrcat(r->pool, MGS_SIDE, "_A_KEY",
    993                 NULL),
     978        apr_table_setn(env, MGS_SIDE("_A_KEY"),
    994979                gnutls_pk_algorithm_get_name(ret));
    995980    }
     
    997982    /* export all the alternative names (DNS, RFC822 and URI) */
    998983    for (i = 0; !(ret < 0); i++) {
     984        const char *san, *sanlabel;
    999985        len = 0;
    1000986        ret = gnutls_x509_crt_get_subject_alt_name(cert, i,
     
    1012998            tmp2[len] = 0;
    1013999
     1000            sanlabel = apr_psprintf(r->pool, "%s%u", MGS_SIDE("_S_AN"), i);
    10141001            if (ret == GNUTLS_SAN_DNSNAME) {
    1015                 apr_table_setn(env,
    1016                         apr_psprintf(r->pool,
    1017                         "%s_S_AN%u",
    1018                         MGS_SIDE, i),
    1019                         apr_psprintf(r->pool,
    1020                         "DNSNAME:%s",
    1021                         tmp2));
     1002                san = apr_psprintf(r->pool, "DNSNAME:%s", tmp2);
    10221003            } else if (ret == GNUTLS_SAN_RFC822NAME) {
    1023                 apr_table_setn(env,
    1024                         apr_psprintf(r->pool,
    1025                         "%s_S_AN%u",
    1026                         MGS_SIDE, i),
    1027                         apr_psprintf(r->pool,
    1028                         "RFC822NAME:%s",
    1029                         tmp2));
     1004                san = apr_psprintf(r->pool, "RFC822NAME:%s", tmp2);
    10301005            } else if (ret == GNUTLS_SAN_URI) {
    1031                 apr_table_setn(env,
    1032                         apr_psprintf(r->pool,
    1033                         "%s_S_AN%u",
    1034                         MGS_SIDE, i),
    1035                         apr_psprintf(r->pool,
    1036                         "URI:%s",
    1037                         tmp2));
     1006                san = apr_psprintf(r->pool, "URI:%s", tmp2);
    10381007            } else {
    1039                 apr_table_setn(env,
    1040                         apr_psprintf(r->pool,
    1041                         "%s_S_AN%u",
    1042                         MGS_SIDE, i),
    1043                         "UNSUPPORTED");
     1008                san = "UNSUPPORTED";
    10441009            }
     1010            apr_table_setn(env, sanlabel, san);
    10451011        }
    10461012    }
     
    10721038        if (ret == GNUTLS_E_SHORT_MEMORY_BUFFER) {
    10731039            if (len >= export_cert_size) {
    1074                 apr_table_setn(env, apr_pstrcat(r->pool, MGS_SIDE, "_CERT", NULL),
     1040                apr_table_setn(env, MGS_SIDE("_CERT"),
    10751041                               "GNUTLS_CERTIFICATE_SIZE_LIMIT_EXCEEDED");
    10761042                ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r,
     
    10801046                if (cert_buf != NULL && gnutls_openpgp_crt_export(cert, GNUTLS_OPENPGP_FMT_BASE64, cert_buf, &len) >= 0) {
    10811047                    cert_buf[len] = 0;
    1082                     apr_table_setn(env, apr_pstrcat(r->pool, MGS_SIDE, "_CERT", NULL), cert_buf);
     1048                    apr_table_setn(env, MGS_SIDE("_CERT"), cert_buf);
    10831049                } else {
    10841050                    ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, r,
     
    10941060    len = sizeof (buf);
    10951061    gnutls_openpgp_crt_get_name(cert, 0, buf, &len);
    1096     apr_table_setn(env, apr_pstrcat(r->pool, MGS_SIDE, "_NAME", NULL),
    1097             apr_pstrmemdup(r->pool, buf, len));
     1062    apr_table_setn(env, MGS_SIDE("_NAME"), apr_pstrmemdup(r->pool, buf, len));
    10981063
    10991064    len = sizeof (sbuf);
    11001065    gnutls_openpgp_crt_get_fingerprint(cert, sbuf, &len);
    11011066    tmp = mgs_session_id2sz(sbuf, len, buf, sizeof (buf));
    1102     apr_table_setn(env,
    1103             apr_pstrcat(r->pool, MGS_SIDE, "_FINGERPRINT",
    1104             NULL), apr_pstrdup(r->pool, tmp));
     1067    apr_table_setn(env, MGS_SIDE("_FINGERPRINT"), apr_pstrdup(r->pool, tmp));
    11051068
    11061069    ret = gnutls_openpgp_crt_get_version(cert);
    11071070    if (ret > 0)
    1108         apr_table_setn(env,
    1109             apr_pstrcat(r->pool, MGS_SIDE, "_M_VERSION",
    1110             NULL), apr_psprintf(r->pool,
    1111             "%u", ret));
    1112 
    1113     apr_table_setn(env,
    1114             apr_pstrcat(r->pool, MGS_SIDE, "_CERT_TYPE", NULL),
    1115             "OPENPGP");
     1071        apr_table_setn(env, MGS_SIDE("_M_VERSION"),
     1072                       apr_psprintf(r->pool, "%u", ret));
     1073
     1074    apr_table_setn(env, MGS_SIDE("_CERT_TYPE"), "OPENPGP");
    11161075
    11171076    tmp =
    11181077            mgs_time2sz(gnutls_openpgp_crt_get_expiration_time
    11191078            (cert), buf, sizeof (buf));
    1120     apr_table_setn(env, apr_pstrcat(r->pool, MGS_SIDE, "_V_END", NULL),
    1121             apr_pstrdup(r->pool, tmp));
     1079    apr_table_setn(env, MGS_SIDE("_V_END"), apr_pstrdup(r->pool, tmp));
    11221080
    11231081    tmp =
    11241082            mgs_time2sz(gnutls_openpgp_crt_get_creation_time
    11251083            (cert), buf, sizeof (buf));
    1126     apr_table_setn(env,
    1127             apr_pstrcat(r->pool, MGS_SIDE, "_V_START", NULL),
    1128             apr_pstrdup(r->pool, tmp));
     1084    apr_table_setn(env, MGS_SIDE("_V_START"), apr_pstrdup(r->pool, tmp));
    11291085
    11301086    ret = gnutls_openpgp_crt_get_pk_algorithm(cert, NULL);
    11311087    if (ret >= 0) {
    1132         apr_table_setn(env,
    1133                 apr_pstrcat(r->pool, MGS_SIDE, "_A_KEY",
    1134                 NULL),
    1135                 gnutls_pk_algorithm_get_name(ret));
     1088        apr_table_setn(env, MGS_SIDE("_A_KEY"), gnutls_pk_algorithm_get_name(ret));
    11361089    }
    11371090
Note: See TracChangeset for help on using the changeset viewer.