From: Brendan Shanks bshanks@codeweavers.com
--- server/request.c | 49 ++++++++++++++++++++++++------------------------ server/unicode.c | 10 ++-------- 2 files changed, 27 insertions(+), 32 deletions(-)
diff --git a/server/request.c b/server/request.c index 82b4a722d61..9d5c45db146 100644 --- a/server/request.c +++ b/server/request.c @@ -601,9 +601,10 @@ static void create_dir( const char *name, struct stat *st ) static char *create_server_dir( int force ) { const char *prefix = getenv( "WINEPREFIX" ); + int n; char *p, *config_dir; struct stat st, st2; - size_t len = sizeof("/server-") + 2 * sizeof(st.st_dev) + 2 * sizeof(st.st_ino) + 2; + char tmp[2 * sizeof(st.st_dev) + 2 * sizeof(st.st_ino) + 2];
/* open the configuration directory */
@@ -643,36 +644,36 @@ static char *create_server_dir( int force ) if (st.st_uid != getuid()) fatal_error( "%s is not owned by you\n", config_dir );
- /* create the base directory if needed */ - -#ifdef __ANDROID__ /* there's no /tmp dir on Android */ - len += strlen( config_dir ) + sizeof("/.wineserver"); - if (!(server_dir = malloc( len ))) fatal_error( "out of memory\n" ); - strcpy( server_dir, config_dir ); - strcat( server_dir, "/.wineserver" ); -#else - len += sizeof("/tmp/.wine-") + 12; - if (!(server_dir = malloc( len ))) fatal_error( "out of memory\n" ); - sprintf( server_dir, "/tmp/.wine-%u", getuid() ); -#endif - create_dir( server_dir, &st2 ); - - /* now create the server directory */ - - strcat( server_dir, "/server-" ); - p = server_dir + strlen(server_dir); + /* set the server directory */
if (st.st_dev != (unsigned long)st.st_dev) - p += sprintf( p, "%lx%08lx-", (unsigned long)((unsigned long long)st.st_dev >> 32), + n = snprintf( tmp, sizeof(tmp), "%lx%08lx-", (unsigned long)((unsigned long long)st.st_dev >> 32), (unsigned long)st.st_dev ); else - p += sprintf( p, "%lx-", (unsigned long)st.st_dev ); + n = snprintf( tmp, sizeof(tmp), "%lx-", (unsigned long)st.st_dev );
if (st.st_ino != (unsigned long)st.st_ino) - sprintf( p, "%lx%08lx", (unsigned long)((unsigned long long)st.st_ino >> 32), - (unsigned long)st.st_ino ); + snprintf( tmp + n, sizeof(tmp) - n, "%lx%08lx", (unsigned long)((unsigned long long)st.st_ino >> 32), + (unsigned long)st.st_ino ); else - sprintf( p, "%lx", (unsigned long)st.st_ino ); + snprintf( tmp + n, sizeof(tmp) - n, "%lx", (unsigned long)st.st_ino ); + +#ifdef __ANDROID__ /* there's no /tmp dir on Android */ + if (asprintf( &server_dir, "%s/.wineserver/server-%s", config_dir, tmp ) == -1) + fatal_error( "out of memory\n" ); +#else + if (asprintf( &server_dir, "/tmp/.wine-%u/server-%s", getuid(), tmp ) == -1) + fatal_error( "out of memory\n" ); +#endif + + /* create the base directory if needed */ + + p = strrchr( server_dir, '/' ); + *p = '\0'; + create_dir( server_dir, &st2 ); + *p = '/'; + + /* now create the server directory */
create_dir( server_dir, &st );
diff --git a/server/unicode.c b/server/unicode.c index f84520580d7..abc3367be75 100644 --- a/server/unicode.c +++ b/server/unicode.c @@ -265,11 +265,7 @@ static char *get_nls_dir(void) } *(++p) = 0; if (p > dir + 8 && !strcmp( p - 8, "/server/" )) nlsdir = "../nls"; /* inside build tree */ - if ((ret = malloc( strlen(dir) + strlen( nlsdir ) + 1 ))) - { - strcpy( ret, dir ); - strcat( ret, nlsdir ); - } + asprintf( &ret, "%s%s", dir, nlsdir ); free( dir ); return ret; } @@ -292,9 +288,7 @@ struct fd *load_intl_file(void) for (i = 0; i < ARRAY_SIZE( nls_dirs ); i++) { if (!nls_dirs[i]) continue; - if (!(path = malloc( strlen(nls_dirs[i]) + sizeof("/l_intl.nls" )))) continue; - strcpy( path, nls_dirs[i] ); - strcat( path, "/l_intl.nls" ); + if (asprintf( &path, "%s/l_intl.nls", nls_dirs[i] ) == -1) continue; if ((fd = open_fd( NULL, path, nt_name, O_RDONLY, &mode, FILE_READ_DATA, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT ))) break;