/* Cleaning buffers */
memset(csp->server_certs_chain.info_buf, 0,
sizeof(csp->server_certs_chain.info_buf));
- memset(csp->server_certs_chain.file_buf, 0,
- sizeof(csp->server_certs_chain.file_buf));
+ freez(csp->server_certs_chain.file_buf);
+
csp->server_certs_chain.next = NULL;
/* Freeing memory in whole linked list */
{
struct certs_chain *cert_for_free = cert;
cert = cert->next;
+
+ /* Cleaning buffers */
+ memset(cert_for_free->info_buf, 0, sizeof(cert_for_free->info_buf));
+ freez(cert_for_free->file_buf);
+
freez(cert_for_free);
}
}
"<p><a href=\"https://" CGI_SITE_2_HOST "/\">Privoxy</a> was unable "
"to securely connect to the destination server.</p>"
"<p>Reason: ";
- const char message_end[] = "</body></html>\r\n\r\n";
+ const char message_end[] = "</body></html>\n";
char reason[INVALID_CERT_INFO_BUF_SIZE];
memset(reason, 0, sizeof(reason));
cert = &(csp->server_certs_chain);
while (cert->next != NULL)
{
- size_t base64_len = 4 * ((strlen(cert->file_buf) + 2) / 3) + 1;
+ size_t base64_len;
- message_len += strlen(cert->info_buf) + strlen("<pre></pre>\n")
- + base64_len + strlen("<a href=\"data:application"
- "/x-x509-ca-cert;base64,\">Download certificate</a>");
+ if (cert->file_buf != NULL)
+ {
+ base64_len = 4 * ((strlen(cert->file_buf) + 2) / 3) + 1;
+
+ message_len += strlen(cert->info_buf) + strlen("<pre></pre>\n")
+ + base64_len + strlen("<a href=\"data:application"
+ "/x-x509-ca-cert;base64,\">Download certificate</a>");
+ }
+ else
+ {
+ log_error(LOG_LEVEL_ERROR,
+ "Incomplete certificate information for %s.",
+ csp->http->hostport);
+ }
cert = cert->next;
}
cert = &(csp->server_certs_chain);
while (cert->next != NULL)
{
- size_t olen = 0;
- size_t base64_len = 4 * ((strlen(cert->file_buf) + 2) / 3) + 1; /* +1 for terminating null*/
- char base64_buf[base64_len];
- memset(base64_buf, 0, base64_len);
-
- /* Encoding certificate into base64 code */
- ret = ssl_base64_encode((unsigned char*)base64_buf,
- base64_len, &olen, (const unsigned char*)cert->file_buf,
- strlen(cert->file_buf));
- if (ret != 0)
+ if (cert->file_buf != NULL)
{
- log_error(LOG_LEVEL_ERROR,
- "Encoding to base64 failed, buffer is to small");
+ /* +1 for terminating null */
+ size_t base64_len = 4 * ((strlen(cert->file_buf) + 2) / 3) + 1;
+ size_t olen = 0;
+ char base64_buf[base64_len];
+
+ memset(base64_buf, 0, base64_len);
+
+ /* Encoding certificate into base64 code */
+ ret = ssl_base64_encode((unsigned char*)base64_buf,
+ base64_len, &olen, (const unsigned char*)cert->file_buf,
+ strlen(cert->file_buf));
+ if (ret != 0)
+ {
+ log_error(LOG_LEVEL_ERROR,
+ "Encoding to base64 failed, buffer is to small");
+ }
+
+ strlcat(message, "<pre>", message_len);
+ strlcat(message, cert->info_buf, message_len);
+ strlcat(message, "</pre>\n", message_len);
+
+ if (ret == 0)
+ {
+ strlcat(message, "<a href=\"data:application/x-x509-ca-cert;base64,",
+ message_len);
+ strlcat(message, base64_buf, message_len);
+ strlcat(message, "\">Download certificate</a>", message_len);
+ }
}
- strlcat(message, "<pre>", message_len);
- strlcat(message, cert->info_buf, message_len);
- strlcat(message, "</pre>\n", message_len);
+ cert = cert->next;
+ }
+ strlcat(message, message_end, message_len);
- if (ret == 0)
+ if (0 == strcmpic(csp->http->gpc, "HEAD"))
+ {
+ /* Cut off body */
+ char *header_end = strstr(message, "\r\n\r\n");
+ if (header_end != NULL)
{
- strlcat(message, "<a href=\"data:application/x-x509-ca-cert;base64,",
- message_len);
- strlcat(message, base64_buf, message_len);
- strlcat(message, "\">Download certificate</a>", message_len);
+ header_end[3] = '\0';
}
-
- cert = cert->next;
}
- strlcat(message, message_end, message_len);
/*
* Sending final message to client
log_error(LOG_LEVEL_CRUNCH, "Certificate error: %s: https://%s%s",
reason, csp->http->hostport, csp->http->path);
- log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s https://%s%s %s\" 200 %lu",
+ log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s https://%s%s %s\" 403 %lu",
csp->ip_addr_str, csp->http->gpc, csp->http->hostport, csp->http->path,
csp->http->version, message_len-head_length);
}
-/*********************************************************************
- *
- * Function : host_is_ip_address
- *
- * Description : Checks whether or not a host is specified by
- * IP address. Does not actually validate the
- * address.
- *
- * Parameters :
- * 1 : host = The host name to check
- *
- * Returns : 1 => Yes
- * 0 => No
- *
- *********************************************************************/
-extern int host_is_ip_address(const char *host)
-{
- const char *p;
-
- if (NULL != strstr(host, ":"))
- {
- /* Assume an IPv6 address. */
- return 1;
- }
-
- for (p = host; *p; p++)
- {
- if ((*p != '.') && !privoxy_isdigit(*p))
- {
- /* Not a dot or digit so it can't be an IPv4 address. */
- return 0;
- }
- }
-
- /*
- * Host only consists of dots and digits so
- * assume that is an IPv4 address.
- */
- return 1;
-
-}
-
-
/*********************************************************************
*
* Function : enforce_sane_certificate_state