https://git.reactos.org/?p=reactos.git;a=commitdiff;h=c1145f0c89177d828a20e…
commit c1145f0c89177d828a20eb2b1747a69307120c2a
Author: Timo Kreuzer <timo.kreuzer(a)reactos.org>
AuthorDate: Sun Nov 10 16:36:08 2024 +0200
Commit: Timo Kreuzer <timo.kreuzer(a)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/safe…)
---
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