فهرست منبع

Correct "const SSL*" argument in callback

In many docus examples SSL callback defined without const specifier
 'void (*)(SSL *, int, int)'   See:

https://www.openssl.org/docs/man1.0.2/ssl/ssl.html
https://www.openssl.org/docs/man1.1.0/ssl/ssl.html

But in the source code const SSL is used:
 'void (*)(const SSL *, int, int)' See:

https://github.com/openssl/openssl/blob/1d97c8435171a7af575f73c526d79e1ef0ee5960/ssl/ssl.h#L1173

Problem about wrong documentation described, but not resolved:
 https://bugs.launchpad.net/ubuntu/+source/openssl/+bug/1147526

Wrong const cast ignored on C or can be suppressed by compiler flags.
But when compiled with modern C++ compiler, correct const should be
provided
Sergey Linev 6 سال پیش
والد
کامیت
fa82d1a2e1
1فایلهای تغییر یافته به همراه11 افزوده شده و 27 حذف شده
  1. 11 27
      src/civetweb.c

+ 11 - 27
src/civetweb.c

@@ -15576,7 +15576,7 @@ ssl_get_protocol(int version_id)
  * definitions of this function, having a warning in one version or
  * another is unavoidable. */
 static void
-ssl_info_callback(SSL *ssl, int what, int ret)
+ssl_info_callback(const SSL *ssl, int what, int ret)
 {
 	(void)ret;
 
@@ -15705,40 +15705,24 @@ init_ssl_ctx_impl(struct mg_context *phys_ctx,
 	SSL_CTX_set_ecdh_auto(dom_ctx->ssl_ctx, 1);
 #endif /* NO_SSL_DL */
 
-#if defined(__clang__)
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wincompatible-pointer-types"
-#endif
-#if defined(GCC_DIAGNOSTIC)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wincompatible-pointer-types"
-#endif
-	/* Depending on the OpenSSL version, the callback may be
-	 * 'void (*)(SSL *, int, int)' or 'void (*)(const SSL *, int, int)'
-	 * yielding in an "incompatible-pointer-type" warning for the other
-	 * version. It seems to be "unclear" what is correct:
+	/* In SSL documentation examples callback defined without const specifier
+	 * 'void (*)(SSL *, int, int)'   See:
+    * https://www.openssl.org/docs/man1.0.2/ssl/ssl.html
+    * https://www.openssl.org/docs/man1.1.0/ssl/ssl.html
+	 * But in the source code const SSL is used:
+	 * 'void (*)(const SSL *, int, int)' See:
+    * https://github.com/openssl/openssl/blob/1d97c8435171a7af575f73c526d79e1ef0ee5960/ssl/ssl.h#L1173
+	 * Problem about wrong documentation described, but not resolved:
 	 * https://bugs.launchpad.net/ubuntu/+source/openssl/+bug/1147526
-	 * https://www.openssl.org/docs/man1.0.2/ssl/ssl.html
-	 * https://www.openssl.org/docs/man1.1.0/ssl/ssl.html
-	 * https://github.com/openssl/openssl/blob/1d97c8435171a7af575f73c526d79e1ef0ee5960/ssl/ssl.h#L1173
-	 * Disable this warning here.
-	 * Alternative would be a version dependent ssl_info_callback and
-	 * a const-cast to call 'char *SSL_get_app_data(SSL *ssl)' there.
+	 * Wrong const cast ignored on C or can be suppressed by compiler flags.
+	 * But when compiled with modern C++ compiler, correct const should be provided
 	 */
 	SSL_CTX_set_info_callback(dom_ctx->ssl_ctx, ssl_info_callback);
 
-
 	SSL_CTX_set_tlsext_servername_callback(dom_ctx->ssl_ctx,
 	                                       ssl_servername_callback);
 	SSL_CTX_set_tlsext_servername_arg(dom_ctx->ssl_ctx, phys_ctx);
 
-#if defined(GCC_DIAGNOSTIC)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__clang__)
-#pragma clang diagnostic pop
-#endif
-
 	/* If a callback has been specified, call it. */
 	callback_ret = (phys_ctx->callbacks.init_ssl == NULL)
 	                   ? 0