From 2a2f525eb3cb220759c1079b2c9c96bc98667ec2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B3zef=20Kucia?= Date: Thu, 31 Aug 2017 19:22:55 +0200 Subject: [PATCH] msvcrt: Fix precision handling for string arguments. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Józef Kucia Signed-off-by: Piotr Caban Signed-off-by: Alexandre Julliard --- dlls/msvcrt/msvcrt.h | 2 ++ dlls/msvcrt/printf.h | 18 ++++++++++++++---- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/dlls/msvcrt/msvcrt.h b/dlls/msvcrt/msvcrt.h index 845b2677e54..c39becaeab1 100644 --- a/dlls/msvcrt/msvcrt.h +++ b/dlls/msvcrt/msvcrt.h @@ -1094,6 +1094,8 @@ char*** __cdecl MSVCRT___p__environ(void); int* __cdecl __p___mb_cur_max(void); unsigned int* __cdecl __p__fmode(void); MSVCRT_wchar_t* __cdecl MSVCRT__wcsdup(const MSVCRT_wchar_t*); +MSVCRT_size_t __cdecl MSVCRT_strnlen(const char *,MSVCRT_size_t); +MSVCRT_size_t __cdecl MSVCRT_wcsnlen(const MSVCRT_wchar_t*,MSVCRT_size_t); MSVCRT_wchar_t*** __cdecl MSVCRT___p__wenviron(void); INT __cdecl MSVCRT_wctomb(char*,MSVCRT_wchar_t); char* __cdecl MSVCRT__strdate(char* date); diff --git a/dlls/msvcrt/printf.h b/dlls/msvcrt/printf.h index 8bb3382b397..fe1e127c76f 100644 --- a/dlls/msvcrt/printf.h +++ b/dlls/msvcrt/printf.h @@ -165,8 +165,13 @@ static inline int FUNC_NAME(pf_output_format_wstr)(FUNC_NAME(puts_clbk) pf_puts, { int r, ret; - if(len < 0) - len = strlenW(str); + if(len < 0) { + /* Do not search past the length specified by the precision. */ + if(flags->Precision>=0) + len = MSVCRT_wcsnlen(str, flags->Precision); + else + len = strlenW(str); + } if(flags->Precision>=0 && flags->PrecisionPrecision; @@ -190,8 +195,13 @@ static inline int FUNC_NAME(pf_output_format_str)(FUNC_NAME(puts_clbk) pf_puts, { int r, ret; - if(len < 0) - len = strlen(str); + if(len < 0) { + /* Do not search past the length specified by the precision. */ + if(flags->Precision>=0) + len = MSVCRT_strnlen(str, flags->Precision); + else + len = strlen(str); + } if(flags->Precision>=0 && flags->PrecisionPrecision;