winspool: Filter invalid characters when creating the PPD filename.

Fixes potential crash when trying to print if a CUPS printer name
contains an asterisk.

Signed-off-by: Owen Rudge <orudge@codeweavers.com>
Signed-off-by: Huw Davies <huw@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Owen Rudge 2021-03-10 12:26:50 +00:00 committed by Alexandre Julliard
parent 1a82fbf433
commit 6b906e8237
1 changed files with 10 additions and 5 deletions

View File

@ -721,13 +721,18 @@ fail:
static WCHAR *get_ppd_filename( const WCHAR *dir, const WCHAR *file_name )
{
static const WCHAR dot_ppd[] = {'.','p','p','d',0};
int len = (strlenW( dir ) + strlenW( file_name )) * sizeof(WCHAR) + sizeof(dot_ppd);
WCHAR *ppd = HeapAlloc( GetProcessHeap(), 0, len );
static const WCHAR invalid_chars[] = {'*','?','<','>','|','"','/','\\',0};
int dir_len = strlenW( dir ), file_len = strlenW( file_name );
int len = (dir_len + file_len + ARRAY_SIZE( dot_ppd )) * sizeof(WCHAR);
WCHAR *ppd = HeapAlloc( GetProcessHeap(), 0, len ), *p;
if (!ppd) return NULL;
strcpyW( ppd, dir );
strcatW( ppd, file_name );
strcatW( ppd, dot_ppd );
memcpy( ppd, dir, dir_len * sizeof(WCHAR) );
memcpy( ppd + dir_len, file_name, file_len * sizeof(WCHAR) );
memcpy( ppd + dir_len + file_len, dot_ppd, sizeof(dot_ppd) );
p = ppd + dir_len;
while ((p = strpbrkW( p, invalid_chars ))) *p++ = '_';
return ppd;
}