Module: wine Branch: master Commit: c9bf52502ce986ae73a712146f81a0430afdc24f URL: https://source.winehq.org/git/wine.git/?a=commit;h=c9bf52502ce986ae73a712146...
Author: Alexandre Julliard julliard@winehq.org Date: Wed Apr 3 14:16:29 2019 +0200
ntdll: Store offsets instead of pointers in the debug_info structure.
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntdll/debugtools.c | 30 ++++++++++++------------------ dlls/ntdll/ntdll_misc.h | 8 ++++---- dlls/ntdll/thread.c | 3 +-- 3 files changed, 17 insertions(+), 24 deletions(-)
diff --git a/dlls/ntdll/debugtools.c b/dlls/ntdll/debugtools.c index 790af11..64355ab 100644 --- a/dlls/ntdll/debugtools.c +++ b/dlls/ntdll/debugtools.c @@ -47,25 +47,20 @@ static const char * const debug_classes[] = { "fixme", "err", "warn", "trace" }; /* get the debug info pointer for the current thread */ static inline struct debug_info *get_info(void) { - if (!init_done) - { - if (!initial_info.str_pos) initial_info.str_pos = initial_info.strings; - if (!initial_info.out_pos) initial_info.out_pos = initial_info.output; - return &initial_info; - } + if (!init_done) return &initial_info; return ntdll_get_thread_data()->debug_info; }
/* add a string to the output buffer */ static int append_output( struct debug_info *info, const char *str, size_t len ) { - if (len >= sizeof(info->output) - (info->out_pos - info->output)) + if (len >= sizeof(info->output) - info->out_pos) { fprintf( stderr, "wine_dbg_output: debugstr buffer overflow (contents: '%s')\n", info->output ); - info->out_pos = info->output; + info->out_pos = 0; abort(); } - memcpy( info->out_pos, str, len ); + memcpy( info->output + info->out_pos, str, len ); info->out_pos += len; return len; } @@ -223,12 +218,13 @@ unsigned char __cdecl __wine_dbg_get_channel_flags( struct __wine_debug_channel const char * __cdecl __wine_dbg_strdup( const char *str ) { struct debug_info *info = get_info(); - char *res = info->str_pos; + unsigned int pos = info->str_pos; size_t n = strlen( str ) + 1;
- if (res + n > &info->strings[sizeof(info->strings)]) res = info->strings; - info->str_pos = res + n; - return strcpy( res, str ); + assert( n <= sizeof(info->strings) ); + if (pos + n > sizeof(info->strings)) pos = 0; + info->str_pos = pos + n; + return memcpy( info->strings + pos, str, n ); }
/*********************************************************************** @@ -243,8 +239,8 @@ int __cdecl __wine_dbg_output( const char *str ) if (end) { ret += append_output( info, str, end + 1 - str ); - write( 2, info->output, info->out_pos - info->output ); - info->out_pos = info->output; + write( 2, info->output, info->out_pos ); + info->out_pos = 0; str = end + 1; } if (*str) ret += append_output( info, str, strlen( str )); @@ -264,7 +260,7 @@ int __cdecl __wine_dbg_header( enum __wine_debug_class cls, struct __wine_debug_ if (!(__wine_dbg_get_channel_flags( channel ) & (1 << cls))) return -1;
/* only print header if we are at the beginning of the line */ - if (info->out_pos > info->output) return 0; + if (info->out_pos) return 0;
if (init_done) { @@ -288,8 +284,6 @@ int __cdecl __wine_dbg_header( enum __wine_debug_class cls, struct __wine_debug_ */ void debug_init(void) { - if (!initial_info.str_pos) initial_info.str_pos = initial_info.strings; - if (!initial_info.out_pos) initial_info.out_pos = initial_info.output; ntdll_get_thread_data()->debug_info = &initial_info; init_done = TRUE; } diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h index ca04583..6a60912 100644 --- a/dlls/ntdll/ntdll_misc.h +++ b/dlls/ntdll/ntdll_misc.h @@ -221,10 +221,10 @@ extern enum loadorder get_load_order( const WCHAR *app_name, const UNICODE_STRIN
struct debug_info { - char *str_pos; /* current position in strings buffer */ - char *out_pos; /* current position in output buffer */ - char strings[1024]; /* buffer for temporary strings */ - char output[1024]; /* current output line */ + unsigned int str_pos; /* current position in strings buffer */ + unsigned int out_pos; /* current position in output buffer */ + char strings[1024]; /* buffer for temporary strings */ + char output[1024]; /* current output line */ };
/* thread private data, stored in NtCurrentTeb()->GdiTebBatch */ diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c index 6445ec6..be46218 100644 --- a/dlls/ntdll/thread.c +++ b/dlls/ntdll/thread.c @@ -367,8 +367,7 @@ static void start_thread( struct startup_info *info ) struct ntdll_thread_data *thread_data = (struct ntdll_thread_data *)&teb->GdiTebBatch; struct debug_info debug_info;
- debug_info.str_pos = debug_info.strings; - debug_info.out_pos = debug_info.output; + debug_info.str_pos = debug_info.out_pos = 0; thread_data->debug_info = &debug_info; thread_data->pthread_id = pthread_self();