diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index 022e127c031..552dd1f080b 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -223,22 +223,29 @@ void _mbccpy(unsigned char* dest, const unsigned char* src) */ unsigned char* _mbsncpy(unsigned char* dst, const unsigned char* src, MSVCRT_size_t n) { + unsigned char* ret = dst; if(!n) return dst; if(MSVCRT___mb_cur_max > 1) { - unsigned char* ret = dst; - while (*src && n--) + while (*src && n) { + n--; *dst++ = *src; if (MSVCRT_isleadbyte(*src++)) *dst++ = *src++; } - while(n--) - *dst++ = '\0'; - return ret; } - return strncpy(dst, src, n); /* ASCII CP */ + else + { + while (n) + { + n--; + if (!(*dst++ = *src++)) break; + } + } + while (n--) *dst++ = 0; + return ret; } /********************************************************************* @@ -246,13 +253,14 @@ unsigned char* _mbsncpy(unsigned char* dst, const unsigned char* src, MSVCRT_siz */ unsigned char* _mbsnbcpy(unsigned char* dst, const unsigned char* src, MSVCRT_size_t n) { + unsigned char* ret = dst; if(!n) return dst; if(MSVCRT___mb_cur_max > 1) { - unsigned char* ret = dst; - while (*src && (n-- > 1)) + while (*src && (n > 1)) { + n--; *dst++ = *src; if (MSVCRT_isleadbyte(*src++)) { @@ -268,11 +276,17 @@ unsigned char* _mbsnbcpy(unsigned char* dst, const unsigned char* src, MSVCRT_si *dst++ = *src; n--; } - while (n--) - *dst++ = '\0'; - return ret; } - return strncpy(dst, src, n); /* ASCII CP */ + else + { + while (n) + { + n--; + if (!(*dst++ = *src++)) break; + } + } + while (n--) *dst++ = 0; + return ret; } /********************************************************************* diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c index 845cf7406d0..a589e7f229a 100644 --- a/dlls/ntdll/file.c +++ b/dlls/ntdll/file.c @@ -1515,9 +1515,9 @@ NTSTATUS WINAPI NtQueryVolumeInformationFile( HANDLE handle, PIO_STATUS_BLOCK io mach_port_t masterPort; char bsdName[6]; /* disk#\0 */ - - strncpy(bsdName, stfs.f_mntfromname+strlen(_PATH_DEV) , 5); - bsdName[5] = 0; + const char *name = stfs.f_mntfromname + strlen(_PATH_DEV); + memcpy( bsdName, name, min(strlen(name)+1,sizeof(bsdName)) ); + bsdName[sizeof(bsdName)-1] = 0; kernResult = IOMasterPort(MACH_PORT_NULL, &masterPort); diff --git a/include/wine/library.h b/include/wine/library.h index ecd9d7f6cf4..adcb1ea08fd 100644 --- a/include/wine/library.h +++ b/include/wine/library.h @@ -39,9 +39,9 @@ extern void wine_exec_wine_binary( const char *name, char **argv, char **envp, i typedef void (*load_dll_callback_t)( void *, const char * ); -extern void *wine_dlopen( const char *filename, int flag, char *error, int errorsize ); -extern void *wine_dlsym( void *handle, const char *symbol, char *error, int errorsize ); -extern int wine_dlclose( void *handle, char *error, int errorsize ); +extern void *wine_dlopen( const char *filename, int flag, char *error, size_t errorsize ); +extern void *wine_dlsym( void *handle, const char *symbol, char *error, size_t errorsize ); +extern int wine_dlclose( void *handle, char *error, size_t errorsize ); extern void wine_dll_set_callback( load_dll_callback_t load ); extern void *wine_dll_load( const char *filename, char *error, int errorsize, int *file_exists ); extern void *wine_dll_load_main_exe( const char *name, char *error, int errorsize, diff --git a/libs/wine/debug.c b/libs/wine/debug.c index 44d2fd614f4..a25e46832e9 100644 --- a/libs/wine/debug.c +++ b/libs/wine/debug.c @@ -121,13 +121,15 @@ void wine_dbg_add_option( const char *name, unsigned char set, unsigned char cle { struct dll *dll = first_dll; struct debug_option *opt; + size_t len = strlen(name); if (!(opt = malloc( sizeof(*opt) ))) return; opt->next = NULL; opt->set = set; opt->clear = clear; - strncpy( opt->name, name, sizeof(opt->name) ); - opt->name[sizeof(opt->name)-1] = 0; + if (len >= sizeof(opt->name)) len = sizeof(opt->name) - 1; + memcpy( opt->name, name, len ); + opt->name[len] = 0; if (last_option) last_option->next = opt; else first_option = opt; last_option = opt; diff --git a/libs/wine/loader.c b/libs/wine/loader.c index 90b94c04b03..d007398f0c6 100644 --- a/libs/wine/loader.c +++ b/libs/wine/loader.c @@ -558,7 +558,7 @@ void wine_init( int argc, char *argv[], char *error, int error_size ) /*********************************************************************** * wine_dlopen */ -void *wine_dlopen( const char *filename, int flag, char *error, int errorsize ) +void *wine_dlopen( const char *filename, int flag, char *error, size_t errorsize ) { #ifdef HAVE_DLOPEN void *ret; @@ -566,18 +566,26 @@ void *wine_dlopen( const char *filename, int flag, char *error, int errorsize ) dlerror(); dlerror(); ret = dlopen( filename, flag ); s = dlerror(); - if (error) + if (error && errorsize) { - strncpy( error, s ? s : "", errorsize ); - error[errorsize - 1] = '\0'; + if (s) + { + size_t len = strlen(s); + if (len >= errorsize) len = errorsize - 1; + memcpy( error, s, len ); + error[len] = 0; + } + else error[0] = 0; } dlerror(); return ret; #else if (error) { - strncpy( error, "dlopen interface not detected by configure", errorsize ); - error[errorsize - 1] = '\0'; + static const char msg[] = "dlopen interface not detected by configure"; + size_t len = min( errorsize, sizeof(msg) ); + memcpy( error, msg, len ); + error[len - 1] = 0; } return NULL; #endif @@ -586,7 +594,7 @@ void *wine_dlopen( const char *filename, int flag, char *error, int errorsize ) /*********************************************************************** * wine_dlsym */ -void *wine_dlsym( void *handle, const char *symbol, char *error, int errorsize ) +void *wine_dlsym( void *handle, const char *symbol, char *error, size_t errorsize ) { #ifdef HAVE_DLOPEN void *ret; @@ -594,18 +602,26 @@ void *wine_dlsym( void *handle, const char *symbol, char *error, int errorsize ) dlerror(); dlerror(); ret = dlsym( handle, symbol ); s = dlerror(); - if (error) + if (error && errorsize) { - strncpy( error, s ? s : "", errorsize ); - error[errorsize - 1] = '\0'; + if (s) + { + size_t len = strlen(s); + if (len >= errorsize) len = errorsize - 1; + memcpy( error, s, len ); + error[len] = 0; + } + else error[0] = 0; } dlerror(); return ret; #else if (error) { - strncpy( error, "dlopen interface not detected by configure", errorsize ); - error[errorsize - 1] = '\0'; + static const char msg[] = "dlopen interface not detected by configure"; + size_t len = min( errorsize, sizeof(msg) ); + memcpy( error, msg, len ); + error[len - 1] = 0; } return NULL; #endif @@ -614,7 +630,7 @@ void *wine_dlsym( void *handle, const char *symbol, char *error, int errorsize ) /*********************************************************************** * wine_dlclose */ -int wine_dlclose( void *handle, char *error, int errorsize ) +int wine_dlclose( void *handle, char *error, size_t errorsize ) { #ifdef HAVE_DLOPEN int ret; @@ -622,18 +638,26 @@ int wine_dlclose( void *handle, char *error, int errorsize ) dlerror(); dlerror(); ret = dlclose( handle ); s = dlerror(); - if (error) + if (error && errorsize) { - strncpy( error, s ? s : "", errorsize ); - error[errorsize - 1] = '\0'; + if (s) + { + size_t len = strlen(s); + if (len >= errorsize) len = errorsize - 1; + memcpy( error, s, len ); + error[len] = 0; + } + else error[0] = 0; } dlerror(); return ret; #else if (error) { - strncpy( error, "dlopen interface not detected by configure", errorsize ); - error[errorsize - 1] = '\0'; + static const char msg[] = "dlopen interface not detected by configure"; + size_t len = min( errorsize, sizeof(msg) ); + memcpy( error, msg, len ); + error[len - 1] = 0; } return 1; #endif diff --git a/tools/sfnt2fnt.c b/tools/sfnt2fnt.c index d3d912405d5..83874212385 100644 --- a/tools/sfnt2fnt.c +++ b/tools/sfnt2fnt.c @@ -163,7 +163,6 @@ static void fill_fontinfo(FT_Face face, int enc, FILE *fp, int dpi, unsigned cha int num_names; const union cptable *cptable; FT_SfntName sfntname; - char namebuf[4096]; TT_OS2 *os2; cptable = wine_cp_get_table(enc); if(!cptable) { @@ -207,13 +206,12 @@ static void fill_fontinfo(FT_Face face, int enc, FILE *fp, int dpi, unsigned cha num_names = FT_Get_Sfnt_Name_Count(face); for(i = 0; i = sizeof(buf)) len = sizeof(buf) - 1; + memcpy( buf, str, len ); + buf[len] = 0; return buf; }