New macro ntbtls_check_context.
authorWerner Koch <wk@gnupg.org>
Tue, 21 Feb 2017 10:05:15 +0000 (11:05 +0100)
committerWerner Koch <wk@gnupg.org>
Tue, 21 Feb 2017 10:05:15 +0000 (11:05 +0100)
* src/ntbtls.h.in (ntbtls_check_context): New macro.
* src/visibility.c (_ntbtls_check_context): New function.
* src/libntbtls.def, src/libntbtls.vers: Add _ntbtls_check_context.
* configure.ac (SIZEOF_UNSIGNED_LONG): Define.
* src/context.h (NTBTLS_CONTEXT_MAGIC): New constant.
(_ntbtls_context_s): New field 'magic'.
* src/debug.c (_ntbtls_debug_bug): Always print a message.
* src/protocol.c (_ntbtls_new): Set MAGIC.
(_ntbtls_release): Test MAGIC.
--

This macro allows to assert that a TLS context, which might have been
conveyed using an opaque pointer, is valid.  The function does not
abort but merely logs and returns error.

Signed-off-by: Werner Koch <wk@gnupg.org>
configure.ac
src/context.h
src/debug.c
src/libntbtls.def
src/libntbtls.vers
src/ntbtls.h.in
src/protocol.c
src/visibility.c
src/visibility.h

index fec870a..6cb2bd5 100644 (file)
@@ -316,6 +316,7 @@ AC_MSG_NOTICE([checking for system characteristics])
 AC_C_CONST
 AC_C_INLINE
 AC_C_VOLATILE
+AC_CHECK_SIZEOF(unsigned long)
 AC_TYPE_SIZE_T
 AC_TYPE_MODE_T
 AC_TYPE_SIGNAL
index 61616bc..4934c6e 100644 (file)
@@ -259,11 +259,20 @@ typedef struct _ntbtls_ticket_keys_s *ticket_keys_t;
 
 
 \f
+
+#if SIZEOF_UNSIGNED_LONG == 8
+# define NTBTLS_CONTEXT_MAGIC 0x6e7462746c736378 /* "ntbtlscx" */
+#else
+# define NTBTLS_CONTEXT_MAGIC 0x6e746243         /* "ntbC" */
+#endif
+
 /*
  * The TLS context object.
  */
 struct _ntbtls_context_s
 {
+  unsigned long magic;
+
   /*
    * Miscellaneous
    */
index d2b7c59..385953b 100644 (file)
@@ -110,13 +110,10 @@ _ntbtls_debug_bug (const char *file, int line)
 {
   const char *s;
 
-  if (!debug_level)
-    return;
-
   s = strrchr (file, '/');
   if (s)
     file = s + 1;
-  _ntbtls_debug_msg (0, "bug detected at %s:%d\n", file, line);
+  _ntbtls_debug_msg (-1, "bug detected at %s:%d\n", file, line);
 }
 
 
index 69b3f1d..8526d10 100644 (file)
@@ -41,4 +41,5 @@ EXPORTS
     ntbtls_x509_get_peer_cert             @13
     ntbtls_set_log_handler                @14
     ntbtls_get_hostname                   @15
+    _ntbtls_check_context                 @16
 ; END
index 0359cec..fa0b175 100644 (file)
@@ -26,6 +26,7 @@ NTBTLS_1.0 {
     ntbtls_set_log_handler;
 
     ntbtls_new;
+    _ntbtls_check_context;
     ntbtls_release;
     ntbtls_set_transport;
     ntbtls_get_stream;
index 1d2486d..f628698 100644 (file)
@@ -101,6 +101,10 @@ gpg_error_t ntbtls_new (ntbtls_t *r_tls, unsigned int flags);
 /* Destroy a TLS context.  */
 void        ntbtls_release (ntbtls_t tls);
 
+/* Check that TLS is not NULL and valid.  (Use only the macro). */
+gpg_error_t _ntbtls_check_context (ntbtls_t tls, const char *file, int line);
+#define ntbtls_check_context(t) _ntbtls_check_context ((t), __FILE__, __LINE__)
+
 /* Create a new X509 certificate chain.  */
 gpg_error_t ntbtls_x509_cert_new (x509_cert_t *r_cert);
 
index b5dbb51..a931cd0 100644 (file)
@@ -2627,6 +2627,8 @@ _ntbtls_new (ntbtls_t *r_tls, unsigned int flags)
   if (!tls)
     return gpg_error_from_syserror ();  /* Return immediately.  */
 
+  tls->magic = NTBTLS_CONTEXT_MAGIC;
+
   tls->min_major_ver = TLS_MIN_MAJOR_VERSION;
   tls->min_minor_ver = TLS_MIN_MINOR_VERSION;
   tls->max_major_ver = TLS_MAX_MAJOR_VERSION;
@@ -2719,6 +2721,8 @@ _ntbtls_release (ntbtls_t tls)
     return;
 
   debug_msg (2, "release");
+  if (tls->magic != NTBTLS_CONTEXT_MAGIC)
+    debug_bug ();
 
   if (tls->out_ctr)
     {
index 0ab8b4a..40cb3ee 100644 (file)
@@ -52,6 +52,21 @@ ntbtls_new (ntbtls_t *r_tls, unsigned int flags)
 }
 
 
+/* Check that TLS is valid.  FILE and LINE are printed in case of a
+ * failure.  Returns True on failure.  This should be called using the
+ * corresponding macro.  */
+gpg_error_t
+_ntbtls_check_context (ntbtls_t tls, const char *file, int line)
+{
+  if (!tls || tls->magic != NTBTLS_CONTEXT_MAGIC)
+    {
+      _ntbtls_debug_bug (file, line);
+      return gpg_error (GPG_ERR_BUG);
+    }
+  return 0;
+}
+
+
 void
 ntbtls_release (ntbtls_t tls)
 {
index 249d9d2..8ac6c9e 100644 (file)
@@ -45,6 +45,7 @@ MARK_VISIBLE (ntbtls_check_version)
 MARK_VISIBLE (ntbtls_set_debug)
 MARK_VISIBLE (ntbtls_set_log_handler)
 MARK_VISIBLE (ntbtls_new)
+MARK_VISIBLE (_ntbtls_check_context)
 MARK_VISIBLE (ntbtls_release)
 MARK_VISIBLE (ntbtls_set_transport)
 MARK_VISIBLE (ntbtls_get_stream)