summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Frisch <afrisch@make.tv>2018-03-29 13:33:10 +0200
committerSebastian Dröge <sebastian@centricular.com>2018-11-07 23:29:45 +0200
commit472976f21d960876a1dae85364a58af029b71b9d (patch)
tree11ca870700a3a2c30ef1d24429180e5bfd5f03a5
parent47565aa310148744e4eb32ba0cfbfec861e8e7ae (diff)
downloadgstreamer-plugins-bad-472976f21d960876a1dae85364a58af029b71b9d.tar.gz
dtls: Properly display all errors/warnings from ERR queue
Print out all errors from the OpenSSL error queue instead of just looking at the topmost error. Using the callback interface also removes the need for formatting using a buffer on the stack.
-rw-r--r--ext/dtls/gstdtlsagent.c14
-rw-r--r--ext/dtls/gstdtlsconnection.c27
2 files changed, 32 insertions, 9 deletions
diff --git a/ext/dtls/gstdtlsagent.c b/ext/dtls/gstdtlsagent.c
index 55500f95b..2b059c19b 100644
--- a/ext/dtls/gstdtlsagent.c
+++ b/ext/dtls/gstdtlsagent.c
@@ -168,6 +168,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)
{
@@ -182,12 +190,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 e444fd661..382dca215 100644
--- a/ext/dtls/gstdtlsconnection.c
+++ b/ext/dtls/gstdtlsconnection.c
@@ -708,11 +708,26 @@ 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");
@@ -749,9 +764,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;
@@ -759,12 +774,14 @@ 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 ());
+ GST_LOG_OBJECT (self, "SSL syscall error");
break;
}
default:
GST_WARNING_OBJECT (self, "Unknown SSL error: %d, ret: %d", error, ret);
}
+
+ ERR_print_errors_cb (ssl_warn_cb, self);
}
static int