diff --git a/ext/dtls/gstdtlsagent.c b/ext/dtls/gstdtlsagent.c index 212c5a07394ea8a6f6e460c07546737cf92d3d91..06dbdc2eda2027aa989cf35f0c95a687b9217cea 100644 --- a/ext/dtls/gstdtlsagent.c +++ b/ext/dtls/gstdtlsagent.c @@ -164,6 +164,14 @@ gst_dtls_agent_class_init (GstDtlsAgentClass * klass) _gst_dtls_init_openssl (); } +static int +ssl_warn_cb (const char *str, size_t len, void *u) +{ + GstDtlsAgent *self = u; + GST_WARNING_OBJECT (self, "ssl error: %s", str); + return 0; +} + static void gst_dtls_agent_init (GstDtlsAgent * self) { @@ -178,12 +186,10 @@ gst_dtls_agent_init (GstDtlsAgent * self) priv->ssl_context = SSL_CTX_new (DTLSv1_method ()); #endif if (ERR_peek_error () || !priv->ssl_context) { - char buf[512]; - priv->ssl_context = NULL; - GST_WARNING_OBJECT (self, "Error creating SSL Context: %s", - ERR_error_string (ERR_get_error (), buf)); + GST_WARNING_OBJECT (self, "Error creating SSL Context"); + ERR_print_errors_cb (ssl_warn_cb, self); g_return_if_reached (); } diff --git a/ext/dtls/gstdtlsconnection.c b/ext/dtls/gstdtlsconnection.c index 372b9b9eef69506b4895dd32fb28d791d69ffe85..6b6e90c5386a0c6633adadab00b2ca002e579916 100644 --- a/ext/dtls/gstdtlsconnection.c +++ b/ext/dtls/gstdtlsconnection.c @@ -42,7 +42,12 @@ #include #include +#ifdef G_OS_WIN32 +#include +#else #include +#include +#endif GST_DEBUG_CATEGORY_STATIC (gst_dtls_connection_debug); #define GST_CAT_DEFAULT gst_dtls_connection_debug @@ -597,13 +602,13 @@ log_state (GstDtlsConnection * self, const gchar * str) GstDtlsConnectionPrivate *priv = self->priv; guint states = 0; - states |= (! !SSL_is_init_finished (priv->ssl) << 0); - states |= (! !SSL_in_init (priv->ssl) << 4); - states |= (! !SSL_in_before (priv->ssl) << 8); - states |= (! !SSL_in_connect_init (priv->ssl) << 12); - states |= (! !SSL_in_accept_init (priv->ssl) << 16); - states |= (! !SSL_want_write (priv->ssl) << 20); - states |= (! !SSL_want_read (priv->ssl) << 24); + states |= (!!SSL_is_init_finished (priv->ssl) << 0); + states |= (!!SSL_in_init (priv->ssl) << 4); + states |= (!!SSL_in_before (priv->ssl) << 8); + states |= (!!SSL_in_connect_init (priv->ssl) << 12); + states |= (!!SSL_in_accept_init (priv->ssl) << 16); + states |= (!!SSL_want_write (priv->ssl) << 20); + states |= (!!SSL_want_read (priv->ssl) << 24); #if OPENSSL_VERSION_NUMBER < 0x10100001L GST_LOG_OBJECT (self, "%s: role=%s buf=(%d,%p:%d/%d) %x|%x %s", @@ -707,36 +712,53 @@ beach: self->priv->keys_exported = TRUE; } +static int +ssl_warn_cb (const char *str, size_t len, void *u) +{ + GstDtlsConnection *self = u; + GST_WARNING_OBJECT (self, "ssl error: %s", str); + return 0; +} + +static int +ssl_err_cb (const char *str, size_t len, void *u) +{ + GstDtlsConnection *self = u; + GST_ERROR_OBJECT (self, "ssl error: %s", str); + return 0; +} + static void openssl_poll (GstDtlsConnection * self) { int ret; - char buf[512]; int error; log_state (self, "poll: before handshake"); + ERR_clear_error (); ret = SSL_do_handshake (self->priv->ssl); log_state (self, "poll: after handshake"); - if (ret == 1) { - if (!self->priv->keys_exported) { - GST_INFO_OBJECT (self, - "handshake just completed successfully, exporting keys"); - export_srtp_keys (self); - } else { - GST_INFO_OBJECT (self, "handshake is completed"); - } - return; - } else { - if (ret == 0) { + switch (ret) { + case 1: + if (!self->priv->keys_exported) { + GST_INFO_OBJECT (self, + "handshake just completed successfully, exporting keys"); + export_srtp_keys (self); + } else { + GST_INFO_OBJECT (self, "handshake is completed"); + } + return; + case 0: GST_DEBUG_OBJECT (self, "do_handshake encountered EOF"); - } else if (ret == -1) { - GST_WARNING_OBJECT (self, "do_handshake encountered BIO error"); - } else { + break; + case -1: + GST_DEBUG_OBJECT (self, "do_handshake encountered BIO error"); + break; + default: GST_DEBUG_OBJECT (self, "do_handshake returned %d", ret); - } } error = SSL_get_error (self->priv->ssl, ret); @@ -746,9 +768,9 @@ openssl_poll (GstDtlsConnection * self) GST_WARNING_OBJECT (self, "no error, handshake should be done"); break; case SSL_ERROR_SSL: - GST_LOG_OBJECT (self, "SSL error %d: %s", error, - ERR_error_string (ERR_get_error (), buf)); - break; + GST_ERROR_OBJECT (self, "SSL error"); + ERR_print_errors_cb (ssl_err_cb, self); + return; case SSL_ERROR_WANT_READ: GST_LOG_OBJECT (self, "SSL wants read"); break; @@ -756,12 +778,26 @@ openssl_poll (GstDtlsConnection * self) GST_LOG_OBJECT (self, "SSL wants write"); break; case SSL_ERROR_SYSCALL:{ - GST_LOG_OBJECT (self, "SSL syscall (error) : %lu", ERR_get_error ()); + gchar message[1024] = ""; + gint syserror; +#ifdef G_OS_WIN32 + syserror = WSAGetLastError (); + FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM, NULL, syserror, 0, message, + sizeof message, NULL); +#else + syserror = errno; + strerror_r (syserror, message, sizeof message); +#endif + GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT, + syserror != 0 ? GST_LEVEL_WARNING : GST_LEVEL_LOG, + self, "SSL syscall error: errno %d: %s", syserror, message); break; } default: GST_WARNING_OBJECT (self, "Unknown SSL error: %d, ret: %d", error, ret); } + + ERR_print_errors_cb (ssl_warn_cb, self); } static int