From: Arran Cudbard-Bell Date: Tue, 26 Feb 2019 14:01:27 +0000 (+0800) Subject: Fix libcurl's apparently random line termination and concatenation in debug output X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=80a522ea13f46e80253f3978ae3d367e5d5cbf3a;p=thirdparty%2Ffreeradius-server.git Fix libcurl's apparently random line termination and concatenation in debug output --- diff --git a/src/modules/rlm_rest/rest.c b/src/modules/rlm_rest/rest.c index 9da18c292e4..ccc4d0b2a5c 100644 --- a/src/modules/rlm_rest/rest.c +++ b/src/modules/rlm_rest/rest.c @@ -1688,45 +1688,67 @@ error: */ static int rest_debug_log(UNUSED CURL *candle, curl_infotype type, char *data, size_t len, void *uctx) { - REQUEST *request = talloc_get_type_abort(uctx, REQUEST); + REQUEST *request = talloc_get_type_abort(uctx, REQUEST); + char const *p = data, *q, *end = p + len; switch (type) { case CURLINFO_TEXT: - RDEBUG3("libcurl - %pV", fr_box_strvalue_len(data, len)); + /* + * Curl debug output has trailing newlines, and could conceivably + * span multiple lines. Take care of both cases. + */ + while (p < end) { + q = memchr(p, '\n', end - p); + RDEBUG3("libcurl - %pV", fr_box_strvalue_len(p, q ? q - p : p - end)); + p = q + 1; + } + break; case CURLINFO_HEADER_IN: - if (RDEBUG_ENABLED4) { - RHEXDUMP(L_DBG_LVL_4, (uint8_t const *)data, len, - "<<< recv header: %pV", fr_box_strvalue_len(data, len)); - } else { - RDEBUG3("<<< recv header: %pV", fr_box_strvalue_len(data, len)); + while (p < end) { + q = memchr(p, '\n', end - p); + if (RDEBUG_ENABLED4) { + RHEXDUMP(L_DBG_LVL_4, (uint8_t const *)data, len, + "received header: %pV", + fr_box_strvalue_len(p, q ? (q - p) + 1 : p - end)); + } else { + RDEBUG3("received header: %pV", + fr_box_strvalue_len(p, q ? (q - p) + 1 : p - end)); + } + p = q + 1; } break; case CURLINFO_HEADER_OUT: - if (RDEBUG_ENABLED4) { - RHEXDUMP(L_DBG_LVL_4, (uint8_t const *)data, len, - ">>> send header: %pV", fr_box_strvalue_len(data, len)); - } else { - RDEBUG3(">>> send header: %pV", fr_box_strvalue_len(data, len)); + while (p < end) { + q = memchr(p, '\n', end - p); + if (RDEBUG_ENABLED4) { + RHEXDUMP(L_DBG_LVL_4, (uint8_t const *)data, len, + "sending header: %pV", + fr_box_strvalue_len(p, q ? (q - p) + 1 : p - end)); + } else { + RDEBUG3("sending header: %pV", + fr_box_strvalue_len(p, q ? (q - p) + 1 : p - end)); + } + p = q + 1; } break; case CURLINFO_DATA_IN: - RHEXDUMP(L_DBG_LVL_4, (uint8_t const *)data, len, "<<< recv data[length %zu]", len); + RHEXDUMP(L_DBG_LVL_4, (uint8_t const *)data, len, "received data[length %zu]", len); break; case CURLINFO_DATA_OUT: - RHEXDUMP(L_DBG_LVL_4, (uint8_t const *)data, len, ">>> send data[length %zu]", len); + RHEXDUMP(L_DBG_LVL_4, (uint8_t const *)data, len, "sending data[length %zu]", len); break; case CURLINFO_SSL_DATA_OUT: - RHEXDUMP(L_DBG_LVL_4, (uint8_t const *)data, len, ">>> send ssl-data[length %zu]", len); + RHEXDUMP(L_DBG_LVL_4, (uint8_t const *)data, len, "sending ssl-data[length %zu]", len); break; case CURLINFO_SSL_DATA_IN: - RHEXDUMP(L_DBG_LVL_4, (uint8_t const *)data, len, "<<< recv ssl-data[length %zu]", len); + RHEXDUMP(L_DBG_LVL_4, (uint8_t const *)data, len, "received ssl-data[length %zu]", len); break; default: