[PATCH 1/2] ntdll: Add DECLSPEC_HOTPATCH to string functions.
Roman Pišl
rpisl at seznam.cz
Wed Dec 8 05:55:55 CST 2021
This fixes LLVM ASAN an the ASAN then works as expected with Wine.
Would something like this be acceptable for upstream?
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=50993
Signed-off-by: Roman Pišl <rpisl at seznam.cz>
---
dlls/ntdll/string.c | 98 ++++++++++++++++++++++-----------------------
1 file changed, 49 insertions(+), 49 deletions(-)
diff --git a/dlls/ntdll/string.c b/dlls/ntdll/string.c
index 0fa83821d21..7370bf3631b 100644
--- a/dlls/ntdll/string.c
+++ b/dlls/ntdll/string.c
@@ -69,7 +69,7 @@ static const unsigned short ctypes[257] =
/*********************************************************************
* memchr (NTDLL.@)
*/
-void * __cdecl memchr( const void *ptr, int c, size_t n )
+void * __cdecl DECLSPEC_HOTPATCH memchr( const void *ptr, int c, size_t n )
{
const unsigned char *p = ptr;
@@ -81,7 +81,7 @@ void * __cdecl memchr( const void *ptr, int c, size_t n )
/*********************************************************************
* memcmp (NTDLL.@)
*/
-int __cdecl memcmp( const void *ptr1, const void *ptr2, size_t n )
+int __cdecl DECLSPEC_HOTPATCH memcmp( const void *ptr1, const void *ptr2, size_t n )
{
const unsigned char *p1, *p2;
@@ -100,7 +100,7 @@ int __cdecl memcmp( const void *ptr1, const void *ptr2, size_t n )
* NOTES
* Behaves like memmove.
*/
-void * __cdecl memcpy( void *dst, const void *src, size_t n )
+void * __cdecl DECLSPEC_HOTPATCH memcpy( void *dst, const void *src, size_t n )
{
volatile unsigned char *d = dst; /* avoid gcc optimizations */
const unsigned char *s = src;
@@ -122,7 +122,7 @@ void * __cdecl memcpy( void *dst, const void *src, size_t n )
/*********************************************************************
* memmove (NTDLL.@)
*/
-void * __cdecl memmove( void *dst, const void *src, size_t n )
+void * __cdecl DECLSPEC_HOTPATCH memmove( void *dst, const void *src, size_t n )
{
volatile unsigned char *d = dst; /* avoid gcc optimizations */
const unsigned char *s = src;
@@ -157,7 +157,7 @@ static inline void memset_aligned_32( unsigned char *d, uint64_t v, size_t n )
/*********************************************************************
* memset (NTDLL.@)
*/
-void *__cdecl memset( void *dst, int c, size_t n )
+void *__cdecl DECLSPEC_HOTPATCH memset( void *dst, int c, size_t n )
{
typedef uint64_t DECLSPEC_ALIGN(1) unaligned_ui64;
typedef uint32_t DECLSPEC_ALIGN(1) unaligned_ui32;
@@ -214,7 +214,7 @@ void *__cdecl memset( void *dst, int c, size_t n )
/*********************************************************************
* strcat (NTDLL.@)
*/
-char * __cdecl strcat( char *dst, const char *src )
+char * __cdecl DECLSPEC_HOTPATCH strcat( char *dst, const char *src )
{
char *d = dst;
while (*d) d++;
@@ -226,7 +226,7 @@ char * __cdecl strcat( char *dst, const char *src )
/*********************************************************************
* strchr (NTDLL.@)
*/
-char * __cdecl strchr( const char *str, int c )
+char * __cdecl DECLSPEC_HOTPATCH strchr( const char *str, int c )
{
do { if (*str == (char)c) return (char *)(ULONG_PTR)str; } while (*str++);
return NULL;
@@ -236,7 +236,7 @@ char * __cdecl strchr( const char *str, int c )
/*********************************************************************
* strcmp (NTDLL.@)
*/
-int __cdecl strcmp( const char *str1, const char *str2 )
+int __cdecl DECLSPEC_HOTPATCH strcmp( const char *str1, const char *str2 )
{
while (*str1 && *str1 == *str2) { str1++; str2++; }
if ((unsigned char)*str1 > (unsigned char)*str2) return 1;
@@ -248,7 +248,7 @@ int __cdecl strcmp( const char *str1, const char *str2 )
/*********************************************************************
* strcpy (NTDLL.@)
*/
-char * __cdecl strcpy( char *dst, const char *src )
+char * __cdecl DECLSPEC_HOTPATCH strcpy( char *dst, const char *src )
{
char *d = dst;
while ((*d++ = *src++));
@@ -259,7 +259,7 @@ char * __cdecl strcpy( char *dst, const char *src )
/*********************************************************************
* strcspn (NTDLL.@)
*/
-size_t __cdecl strcspn( const char *str, const char *reject )
+size_t __cdecl DECLSPEC_HOTPATCH strcspn( const char *str, const char *reject )
{
const char *ptr;
for (ptr = str; *ptr; ptr++) if (strchr( reject, *ptr )) break;
@@ -270,7 +270,7 @@ size_t __cdecl strcspn( const char *str, const char *reject )
/*********************************************************************
* strlen (NTDLL.@)
*/
-size_t __cdecl strlen( const char *str )
+size_t __cdecl DECLSPEC_HOTPATCH strlen( const char *str )
{
const char *s = str;
while (*s) s++;
@@ -281,7 +281,7 @@ size_t __cdecl strlen( const char *str )
/*********************************************************************
* strncat (NTDLL.@)
*/
-char * __cdecl strncat( char *dst, const char *src, size_t len )
+char * __cdecl DECLSPEC_HOTPATCH strncat( char *dst, const char *src, size_t len )
{
char *d = dst;
while (*d) d++;
@@ -294,7 +294,7 @@ char * __cdecl strncat( char *dst, const char *src, size_t len )
/*********************************************************************
* strncmp (NTDLL.@)
*/
-int __cdecl strncmp( const char *str1, const char *str2, size_t len )
+int __cdecl DECLSPEC_HOTPATCH strncmp( const char *str1, const char *str2, size_t len )
{
if (!len) return 0;
while (--len && *str1 && *str1 == *str2) { str1++; str2++; }
@@ -306,7 +306,7 @@ int __cdecl strncmp( const char *str1, const char *str2, size_t len )
* strncpy (NTDLL.@)
*/
#undef strncpy
-char * __cdecl strncpy( char *dst, const char *src, size_t len )
+char * __cdecl DECLSPEC_HOTPATCH strncpy( char *dst, const char *src, size_t len )
{
char *d;
for (d = dst; len && *src; d++, src++, len--) *d = *src;
@@ -318,7 +318,7 @@ char * __cdecl strncpy( char *dst, const char *src, size_t len )
/*********************************************************************
* strnlen (NTDLL.@)
*/
-size_t __cdecl strnlen( const char *str, size_t len )
+size_t __cdecl DECLSPEC_HOTPATCH strnlen( const char *str, size_t len )
{
const char *s = str;
for (s = str; len && *s; s++, len--) ;
@@ -329,7 +329,7 @@ size_t __cdecl strnlen( const char *str, size_t len )
/*********************************************************************
* strpbrk (NTDLL.@)
*/
-char * __cdecl strpbrk( const char *str, const char *accept )
+char * __cdecl DECLSPEC_HOTPATCH strpbrk( const char *str, const char *accept )
{
for ( ; *str; str++) if (strchr( accept, *str )) return (char *)(ULONG_PTR)str;
return NULL;
@@ -339,7 +339,7 @@ char * __cdecl strpbrk( const char *str, const char *accept )
/*********************************************************************
* strrchr (NTDLL.@)
*/
-char * __cdecl strrchr( const char *str, int c )
+char * __cdecl DECLSPEC_HOTPATCH strrchr( const char *str, int c )
{
char *ret = NULL;
do { if (*str == (char)c) ret = (char *)(ULONG_PTR)str; } while (*str++);
@@ -350,7 +350,7 @@ char * __cdecl strrchr( const char *str, int c )
/*********************************************************************
* strspn (NTDLL.@)
*/
-size_t __cdecl strspn( const char *str, const char *accept )
+size_t __cdecl DECLSPEC_HOTPATCH strspn( const char *str, const char *accept )
{
const char *ptr;
for (ptr = str; *ptr; ptr++) if (!strchr( accept, *ptr )) break;
@@ -361,7 +361,7 @@ size_t __cdecl strspn( const char *str, const char *accept )
/*********************************************************************
* strstr (NTDLL.@)
*/
-char * __cdecl strstr( const char *str, const char *sub )
+char * __cdecl DECLSPEC_HOTPATCH strstr( const char *str, const char *sub )
{
while (*str)
{
@@ -377,7 +377,7 @@ char * __cdecl strstr( const char *str, const char *sub )
/*********************************************************************
* _memccpy (NTDLL.@)
*/
-void * __cdecl _memccpy( void *dst, const void *src, int c, size_t n )
+void * __cdecl DECLSPEC_HOTPATCH _memccpy( void *dst, const void *src, int c, size_t n )
{
unsigned char *d = dst;
const unsigned char *s = src;
@@ -389,7 +389,7 @@ void * __cdecl _memccpy( void *dst, const void *src, int c, size_t n )
/*********************************************************************
* tolower (NTDLL.@)
*/
-int __cdecl tolower( int c )
+int __cdecl DECLSPEC_HOTPATCH tolower( int c )
{
return (char)c >= 'A' && (char)c <= 'Z' ? c - 'A' + 'a' : c;
}
@@ -413,7 +413,7 @@ int __cdecl tolower( int c )
* Any Nul characters in s1 or s2 are ignored. This function always
* compares up to len bytes or the first place where s1 and s2 differ.
*/
-int __cdecl _memicmp( const void *str1, const void *str2, size_t len )
+int __cdecl DECLSPEC_HOTPATCH _memicmp( const void *str1, const void *str2, size_t len )
{
const unsigned char *s1 = str1, *s2 = str2;
int ret = 0;
@@ -430,7 +430,7 @@ int __cdecl _memicmp( const void *str1, const void *str2, size_t len )
/*********************************************************************
* _strnicmp (NTDLL.@)
*/
-int __cdecl _strnicmp( LPCSTR str1, LPCSTR str2, size_t n )
+int __cdecl DECLSPEC_HOTPATCH _strnicmp( LPCSTR str1, LPCSTR str2, size_t n )
{
int l1, l2;
@@ -455,7 +455,7 @@ int __cdecl _strnicmp( LPCSTR str1, LPCSTR str2, size_t n )
* _stricmp (NTDLL.@)
* _strcmpi (NTDLL.@)
*/
-int __cdecl _stricmp( LPCSTR str1, LPCSTR str2 )
+int __cdecl DECLSPEC_HOTPATCH _stricmp( LPCSTR str1, LPCSTR str2 )
{
return _strnicmp( str1, str2, -1 );
}
@@ -473,7 +473,7 @@ int __cdecl _stricmp( LPCSTR str1, LPCSTR str2 )
* str. There is no error return, if str is NULL or invalid, this
* function will crash.
*/
-LPSTR __cdecl _strupr( LPSTR str )
+LPSTR __cdecl DECLSPEC_HOTPATCH _strupr( LPSTR str )
{
LPSTR ret = str;
for ( ; *str; str++) *str = RtlUpperChar(*str);
@@ -493,7 +493,7 @@ LPSTR __cdecl _strupr( LPSTR str )
* str. There is no error return, if str is NULL or invalid, this
* function will crash.
*/
-LPSTR __cdecl _strlwr( LPSTR str )
+LPSTR __cdecl DECLSPEC_HOTPATCH _strlwr( LPSTR str )
{
LPSTR ret = str;
for ( ; *str; str++) *str = tolower(*str);
@@ -504,7 +504,7 @@ LPSTR __cdecl _strlwr( LPSTR str )
/*********************************************************************
* toupper (NTDLL.@)
*/
-int __cdecl toupper( int c )
+int __cdecl DECLSPEC_HOTPATCH toupper( int c )
{
char str[2], *p = str;
WCHAR wc;
@@ -523,7 +523,7 @@ int __cdecl toupper( int c )
/*********************************************************************
* isalnum (NTDLL.@)
*/
-int __cdecl isalnum( int c )
+int __cdecl DECLSPEC_HOTPATCH isalnum( int c )
{
return ctypes[c + 1] & (C1_LOWER | C1_UPPER | C1_DIGIT);
}
@@ -532,7 +532,7 @@ int __cdecl isalnum( int c )
/*********************************************************************
* isalpha (NTDLL.@)
*/
-int __cdecl isalpha( int c )
+int __cdecl DECLSPEC_HOTPATCH isalpha( int c )
{
return ctypes[c + 1] & (C1_LOWER | C1_UPPER);
}
@@ -541,7 +541,7 @@ int __cdecl isalpha( int c )
/*********************************************************************
* iscntrl (NTDLL.@)
*/
-int __cdecl iscntrl( int c )
+int __cdecl DECLSPEC_HOTPATCH iscntrl( int c )
{
return ctypes[c + 1] & C1_CNTRL;
}
@@ -550,7 +550,7 @@ int __cdecl iscntrl( int c )
/*********************************************************************
* isdigit (NTDLL.@)
*/
-int __cdecl isdigit( int c )
+int __cdecl DECLSPEC_HOTPATCH isdigit( int c )
{
return ctypes[c + 1] & C1_DIGIT;
}
@@ -559,7 +559,7 @@ int __cdecl isdigit( int c )
/*********************************************************************
* isgraph (NTDLL.@)
*/
-int __cdecl isgraph( int c )
+int __cdecl DECLSPEC_HOTPATCH isgraph( int c )
{
return ctypes[c + 1] & (C1_LOWER | C1_UPPER | C1_DIGIT | C1_PUNCT);
}
@@ -568,7 +568,7 @@ int __cdecl isgraph( int c )
/*********************************************************************
* islower (NTDLL.@)
*/
-int __cdecl islower( int c )
+int __cdecl DECLSPEC_HOTPATCH islower( int c )
{
return ctypes[c + 1] & C1_LOWER;
}
@@ -577,7 +577,7 @@ int __cdecl islower( int c )
/*********************************************************************
* isprint (NTDLL.@)
*/
-int __cdecl isprint( int c )
+int __cdecl DECLSPEC_HOTPATCH isprint( int c )
{
return ctypes[c + 1] & (C1_LOWER | C1_UPPER | C1_DIGIT | C1_PUNCT | C1_BLANK);
}
@@ -586,7 +586,7 @@ int __cdecl isprint( int c )
/*********************************************************************
* ispunct (NTDLL.@)
*/
-int __cdecl ispunct( int c )
+int __cdecl DECLSPEC_HOTPATCH ispunct( int c )
{
return ctypes[c + 1] & C1_PUNCT;
}
@@ -595,7 +595,7 @@ int __cdecl ispunct( int c )
/*********************************************************************
* isspace (NTDLL.@)
*/
-int __cdecl isspace( int c )
+int __cdecl DECLSPEC_HOTPATCH isspace( int c )
{
return ctypes[c + 1] & C1_SPACE;
}
@@ -604,7 +604,7 @@ int __cdecl isspace( int c )
/*********************************************************************
* isupper (NTDLL.@)
*/
-int __cdecl isupper( int c )
+int __cdecl DECLSPEC_HOTPATCH isupper( int c )
{
return ctypes[c + 1] & C1_UPPER;
}
@@ -613,7 +613,7 @@ int __cdecl isupper( int c )
/*********************************************************************
* isxdigit (NTDLL.@)
*/
-int __cdecl isxdigit( int c )
+int __cdecl DECLSPEC_HOTPATCH isxdigit( int c )
{
return ctypes[c + 1] & C1_XDIGIT;
}
@@ -684,7 +684,7 @@ static int char_to_int( char c )
/*********************************************************************
* strtol (NTDLL.@)
*/
-__msvcrt_long __cdecl strtol( const char *s, char **end, int base )
+__msvcrt_long __cdecl DECLSPEC_HOTPATCH strtol( const char *s, char **end, int base )
{
BOOL negative = FALSE, empty = TRUE;
LONG ret = 0;
@@ -731,7 +731,7 @@ __msvcrt_long __cdecl strtol( const char *s, char **end, int base )
/*********************************************************************
* strtoul (NTDLL.@)
*/
-__msvcrt_ulong __cdecl strtoul( const char *s, char **end, int base )
+__msvcrt_ulong __cdecl DECLSPEC_HOTPATCH strtoul( const char *s, char **end, int base )
{
BOOL negative = FALSE, empty = TRUE;
ULONG ret = 0;
@@ -786,7 +786,7 @@ __msvcrt_ulong __cdecl strtoul( const char *s, char **end, int base )
* - Does not check if radix is in the range of 2 to 36.
* - If str is NULL it crashes, as the native function does.
*/
-char * __cdecl _ultoa( __msvcrt_ulong value, char *str, int radix )
+char * __cdecl DECLSPEC_HOTPATCH _ultoa( __msvcrt_ulong value, char *str, int radix )
{
char buffer[33];
char *pos;
@@ -825,7 +825,7 @@ char * __cdecl _ultoa( __msvcrt_ulong value, char *str, int radix )
* - Does not check if radix is in the range of 2 to 36.
* - If str is NULL it crashes, as the native function does.
*/
-char * __cdecl _ltoa( __msvcrt_long value, char *str, int radix )
+char * __cdecl DECLSPEC_HOTPATCH _ltoa( __msvcrt_long value, char *str, int radix )
{
ULONG val;
int negative;
@@ -878,7 +878,7 @@ char * __cdecl _ltoa( __msvcrt_long value, char *str, int radix )
* - Does not check if radix is in the range of 2 to 36.
* - If str is NULL it crashes, as the native function does.
*/
-char * __cdecl _itoa(
+char * __cdecl DECLSPEC_HOTPATCH _itoa(
int value, /* [I] Value to be converted */
char *str, /* [O] Destination for the converted value */
int radix) /* [I] Number base for conversion */
@@ -901,7 +901,7 @@ char * __cdecl _itoa(
* - Does not check if radix is in the range of 2 to 36.
* - If str is NULL it crashes, as the native function does.
*/
-char * __cdecl _ui64toa(
+char * __cdecl DECLSPEC_HOTPATCH _ui64toa(
ULONGLONG value, /* [I] Value to be converted */
char *str, /* [O] Destination for the converted value */
int radix) /* [I] Number base for conversion */
@@ -952,7 +952,7 @@ char * __cdecl _ui64toa(
* The native msvcrt _i64toa function and our ntdll _i64toa function
* do not have this bug.
*/
-char * __cdecl _i64toa(
+char * __cdecl DECLSPEC_HOTPATCH _i64toa(
LONGLONG value, /* [I] Value to be converted */
char *str, /* [O] Destination for the converted value */
int radix) /* [I] Number base for conversion */
@@ -1011,7 +1011,7 @@ char * __cdecl _i64toa(
* - No check is made for value overflow, only the lower 64 bits are assigned.
* - If str is NULL it crashes, as the native function does.
*/
-LONGLONG __cdecl _atoi64( const char *str )
+LONGLONG __cdecl DECLSPEC_HOTPATCH _atoi64( const char *str )
{
ULONGLONG RunningTotal = 0;
BOOL bMinus = FALSE;
@@ -1039,7 +1039,7 @@ LONGLONG __cdecl _atoi64( const char *str )
/*********************************************************************
* atoi (NTDLL.@)
*/
-int __cdecl atoi( const char *nptr )
+int __cdecl DECLSPEC_HOTPATCH atoi( const char *nptr )
{
return _atoi64( nptr );
}
@@ -1048,7 +1048,7 @@ int __cdecl atoi( const char *nptr )
/*********************************************************************
* atol (NTDLL.@)
*/
-__msvcrt_long __cdecl atol( const char *nptr )
+__msvcrt_long __cdecl DECLSPEC_HOTPATCH atol( const char *nptr )
{
return _atoi64( nptr );
}
@@ -1528,7 +1528,7 @@ int WINAPIV sscanf( const char *str, const char *format, ... )
* RETURNS
* Nothing.
*/
-void __cdecl _splitpath(const char* inpath, char * drv, char * dir,
+void __cdecl DECLSPEC_HOTPATCH _splitpath(const char* inpath, char * drv, char * dir,
char* fname, char * ext )
{
const char *p, *end;
--
2.30.2
More information about the wine-devel
mailing list