typecheck: accept expressions for option/info parameters

As expressions can have side effects, evaluate only once.

To enable deprecation reporting only once, get rid of the __typeof__
use to define the local temporary variable and use the target type
(CURLoption/CURLINFO). This also avoids multiple reports on type
conflicts (if some) by the curlcheck_* macros.

Note that CURLOPT_* and CURLINFO_* symbols may be deprecated, but not
their values: a curl_easy_setopt call with an integer constant as option
will never report a deprecation.

Reported-by: Thomas Klausner
Fixes #10148
Closes #10149
This commit is contained in:
Patrick Monnerat 2022-12-23 15:35:27 +01:00 committed by Daniel Stenberg
parent ef07452a5c
commit e2aed00430
No known key found for this signature in database
GPG Key ID: 5CC908FDB71E12C2

View File

@ -42,9 +42,8 @@
*/
#define curl_easy_setopt(handle, option, value) \
__extension__({ \
CURL_IGNORE_DEPRECATION(__typeof__(option) _curl_opt = option;) \
CURLoption _curl_opt = (option); \
if(__builtin_constant_p(_curl_opt)) { \
(void) option; \
CURL_IGNORE_DEPRECATION( \
if(curlcheck_long_option(_curl_opt)) \
if(!curlcheck_long(value)) \
@ -120,9 +119,8 @@
/* wraps curl_easy_getinfo() with typechecking */
#define curl_easy_getinfo(handle, info, arg) \
__extension__({ \
CURL_IGNORE_DEPRECATION(__typeof__(info) _curl_info = info;) \
CURLINFO _curl_info = (info); \
if(__builtin_constant_p(_curl_info)) { \
(void) info; \
CURL_IGNORE_DEPRECATION( \
if(curlcheck_string_info(_curl_info)) \
if(!curlcheck_arr((arg), char *)) \