summaryrefslogtreecommitdiff
path: root/Fixed-format-string-for-Stream_CheckAndLogRequiredLe.patch
diff options
context:
space:
mode:
Diffstat (limited to 'Fixed-format-string-for-Stream_CheckAndLogRequiredLe.patch')
-rw-r--r--Fixed-format-string-for-Stream_CheckAndLogRequiredLe.patch122
1 files changed, 122 insertions, 0 deletions
diff --git a/Fixed-format-string-for-Stream_CheckAndLogRequiredLe.patch b/Fixed-format-string-for-Stream_CheckAndLogRequiredLe.patch
new file mode 100644
index 0000000..3cda0db
--- /dev/null
+++ b/Fixed-format-string-for-Stream_CheckAndLogRequiredLe.patch
@@ -0,0 +1,122 @@
+From 6ed2f7d1a379f69cca102e8166d20eb5ed38652b Mon Sep 17 00:00:00 2001
+From: akallabeth <akallabeth@posteo.net>
+Date: Fri, 22 Apr 2022 16:27:21 +0200
+Subject: [PATCH] Fixed format string for Stream_CheckAndLogRequiredLength
+
+__LINE__ requires %d and not %PRIuz
+
+(cherry picked from commit 74c1a006e940308b0653427d25a87ea5a24cb573)
+---
+ winpr/include/winpr/stream.h | 14 ++++++++
+ winpr/libwinpr/utils/stream.c | 65 +++++++++++++++++++++++++++++++++++
+ 2 files changed, 79 insertions(+)
+
+diff --git a/winpr/include/winpr/stream.h b/winpr/include/winpr/stream.h
+index f351eaa15..ed637f034 100644
+--- a/winpr/include/winpr/stream.h
++++ b/winpr/include/winpr/stream.h
+@@ -27,6 +27,8 @@
+ #include <winpr/wtypes.h>
+ #include <winpr/endian.h>
+ #include <winpr/synch.h>
++#include <winpr/wlog.h>
++#include <winpr/debug.h>
+
+ #ifdef __cplusplus
+ extern "C"
+@@ -56,6 +57,19 @@ extern "C"
+ WINPR_API void Stream_StaticInit(wStream* s, BYTE* buffer, size_t size);
+ WINPR_API void Stream_Free(wStream* s, BOOL bFreeBuffer);
+
++#define Stream_CheckAndLogRequiredLength(tag, s, len) \
++ Stream_CheckAndLogRequiredLengthEx(tag, WLOG_WARN, s, len, "%s(%s:%d)", __FUNCTION__, \
++ __FILE__, __LINE__)
++ WINPR_API BOOL Stream_CheckAndLogRequiredLengthEx(const char* tag, DWORD level, wStream* s,
++ UINT64 len, const char* fmt, ...);
++ WINPR_API BOOL Stream_CheckAndLogRequiredLengthExVa(const char* tag, DWORD level, wStream* s,
++ UINT64 len, const char* fmt, va_list args);
++ WINPR_API BOOL Stream_CheckAndLogRequiredLengthWLogEx(wLog* log, DWORD level, wStream* s,
++ UINT64 len, const char* fmt, ...);
++ WINPR_API BOOL Stream_CheckAndLogRequiredLengthWLogExVa(wLog* log, DWORD level, wStream* s,
++ UINT64 len, const char* fmt,
++ va_list args);
++
+ static INLINE void Stream_Seek(wStream* s, size_t _offset)
+ {
+ s->pointer += (_offset);
+diff --git a/winpr/libwinpr/utils/stream.c b/winpr/libwinpr/utils/stream.c
+index 1271981b7..cc119c771 100644
+--- a/winpr/libwinpr/utils/stream.c
++++ b/winpr/libwinpr/utils/stream.c
+@@ -132,3 +132,68 @@ void Stream_Free(wStream* s, BOOL bFreeBuffer)
+ free(s);
+ }
+ }
++
++BOOL Stream_CheckAndLogRequiredLengthEx(const char* tag, DWORD level, wStream* s, UINT64 len,
++ const char* fmt, ...)
++{
++ const size_t actual = Stream_GetRemainingLength(s);
++
++ if (actual < len)
++ {
++ va_list args;
++
++ va_start(args, fmt);
++ Stream_CheckAndLogRequiredLengthExVa(tag, level, s, len, fmt, args);
++ va_end(args);
++
++ return FALSE;
++ }
++ return TRUE;
++}
++
++BOOL Stream_CheckAndLogRequiredLengthExVa(const char* tag, DWORD level, wStream* s, UINT64 len,
++ const char* fmt, va_list args)
++{
++ const size_t actual = Stream_GetRemainingLength(s);
++
++ if (actual < len)
++ return Stream_CheckAndLogRequiredLengthWLogExVa(WLog_Get(tag), level, s, len, fmt, args);
++ return TRUE;
++}
++
++BOOL Stream_CheckAndLogRequiredLengthWLogEx(wLog* log, DWORD level, wStream* s, UINT64 len,
++ const char* fmt, ...)
++{
++ const size_t actual = Stream_GetRemainingLength(s);
++
++ if (actual < len)
++ {
++ va_list args;
++
++ va_start(args, fmt);
++ Stream_CheckAndLogRequiredLengthWLogExVa(log, level, s, len, fmt, args);
++ va_end(args);
++
++ return FALSE;
++ }
++ return TRUE;
++}
++
++BOOL Stream_CheckAndLogRequiredLengthWLogExVa(wLog* log, DWORD level, wStream* s, UINT64 len,
++ const char* fmt, va_list args)
++{
++ const size_t actual = Stream_GetRemainingLength(s);
++
++ if (actual < len)
++ {
++ char prefix[1024] = { 0 };
++
++ vsnprintf(prefix, sizeof(prefix), fmt, args);
++
++ WLog_Print(log, level, "[%s] invalid length, got %" PRIuz ", require at least %" PRIu64,
++ prefix, actual, len);
++ winpr_log_backtrace_ex(log, level, 20);
++ return FALSE;
++ }
++ return TRUE;
++}
+--
+2.38.1
+