https://git.reactos.org/?p=reactos.git;a=commitdiff;h=c1145f0c89177d828a20eb2b1747a69307120c2a
commit c1145f0c89177d828a20eb2b1747a69307120c2a Author: Timo Kreuzer <timo.kreu...@reactos.org> AuthorDate: Sun Nov 10 16:36:08 2024 +0200 Commit: Timo Kreuzer <timo.kreu...@reactos.org> CommitDate: Wed Jan 22 18:56:08 2025 +0200 [UCRT] Properly implement parameter checking macros Partly copied from corecrt_internal_strtox.h, partly imported from dotnet runtime (https://github.com/dotnet/runtime/blob/release/8.0/src/coreclr/pal/src/safecrt/internal.h) --- sdk/lib/ucrt/inc/internal_shared.h | 87 +++++++++++++++++++++++++++++++------- 1 file changed, 71 insertions(+), 16 deletions(-) diff --git a/sdk/lib/ucrt/inc/internal_shared.h b/sdk/lib/ucrt/inc/internal_shared.h index d4234e7cdf7..08c1cb79463 100644 --- a/sdk/lib/ucrt/inc/internal_shared.h +++ b/sdk/lib/ucrt/inc/internal_shared.h @@ -75,29 +75,84 @@ extern char __ImageBase; #define _CRT_SECURITYCRITICAL_ATTRIBUTE #define _CRT_SECURITYSAFECRITICAL_ATTRIBUTE -#define _VALIDATE_RETURN(expr, errorcode, retexpr) \ - if (!(expr)) return (retexpr); +//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// +// Parameter validation macros +// Partly duplicated in corecrt_internal_strtox.h +// +//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +#ifdef _DEBUG + #define _INVALID_PARAMETER(expr) _invalid_parameter(expr, __FUNCTIONW__, __FILEW__, __LINE__, 0) +#else + #define _INVALID_PARAMETER(expr) _invalid_parameter_noinfo() +#endif -#define _VALIDATE_RETURN_VOID(expr, errorcode) \ - if (!(expr)) return; +#define _VALIDATE_RETURN(expr, errorcode, retexpr) \ + { \ + int _Expr_val = !!(expr); \ + _ASSERT_EXPR((_Expr_val), _CRT_WIDE(#expr)); \ + if (!(_Expr_val)) \ + { \ + *_errno() = (errorcode); \ + _INVALID_PARAMETER(_CRT_WIDE(#expr)); \ + return (retexpr); \ + } \ + } -#define _VALIDATE_RETURN_NOERRNO(expr, retexpr) \ - if (!(expr)) return (retexpr); +#define _VALIDATE_RETURN_VOID(expr, errorcode) \ + { \ + int _Expr_val = !!(expr); \ + _ASSERT_EXPR((_Expr_val), _CRT_WIDE(#expr)); \ + if (!(_Expr_val)) \ + { \ + *_errno() = (errorcode); \ + _INVALID_PARAMETER(_CRT_WIDE(#expr)); \ + return; \ + } \ + } -#define _VALIDATE_RETURN_ERRCODE(expr, errorcode) \ - if (!(expr)) return (errorcode); +#define _VALIDATE_RETURN_NOERRNO(expr, retexpr) \ + { \ + int _Expr_val = !!(expr); \ + _ASSERT_EXPR((_Expr_val), _CRT_WIDE(#expr)); \ + if (!(_Expr_val)) \ + { \ + _INVALID_PARAMETER(_CRT_WIDE(#expr)); \ + return (retexpr); \ + } \ + } -#define _VALIDATE_CLEAR_OSSERR_RETURN(expr, errorcode, retexpr) \ - if (!(expr)) return (retexpr); +#define _VALIDATE_RETURN_ERRCODE(expr, errorcode) \ + _VALIDATE_RETURN(expr, errorcode, errorcode) + +#define _VALIDATE_CLEAR_OSSERR_RETURN(expr, errorcode, retexpr) \ + { \ + int _Expr_val = !!(expr); \ + _ASSERT_EXPR((_Expr_val), _CRT_WIDE(#expr)); \ + if (!(_Expr_val)) \ + { \ + *__doserrno() = 0L; \ + *_errno() = errorcode; \ + _INVALID_PARAMETER(_CRT_WIDE(#expr) ); \ + return (retexpr); \ + } \ + } -#define _VALIDATE_CLEAR_OSSERR_RETURN_ERRCODE(expr, errorcode) \ - if (!(expr)) return (errorcode); +#define _VALIDATE_CLEAR_OSSERR_RETURN_ERRCODE(expr, errorcode) \ + _VALIDATE_CLEAR_OSSERR_RETURN(expr, errorcode, errorcode) -#define _VALIDATE_RETURN_NOEXC(expr, errorcode, retexpr) \ - if (!(expr)) return (retexpr); +#define _VALIDATE_RETURN_NOEXC(expr, errorcode, retexpr) \ + { \ + if (!(expr)) \ + { \ + *_errno() = errorcode; \ + return (retexpr); \ + } \ + } -#define _VALIDATE_RETURN_ERRCODE_NOEXC(expr, errorcode) \ - if (!(expr)) return (errorcode); +#define _VALIDATE_RETURN_ERRCODE_NOEXC(expr, errorcode) \ + _VALIDATE_RETURN_NOEXC(expr, errorcode, errorcode) #define _malloc_crt malloc #define _free_crt free