Skip to content
Snippets Groups Projects
Commit 034e39b2 authored by Alexandre Julliard's avatar Alexandre Julliard
Browse files

Check access rights before renaming or deleting files (based on

patches by Uwe Bonnes and Dmitry Timoshkov).
parent ccab2877
No related branches found
No related tags found
No related merge requests found
......@@ -49,6 +49,8 @@ static void test__hread( void )
long bytes_wanted;
UINT i;
SetFileAttributesA(filename,FILE_ATTRIBUTE_NORMAL); /* be sure to remove stale files */
DeleteFileA( filename );
filehandle = _lcreat( filename, 0 );
if (filehandle == HFILE_ERROR)
{
......@@ -224,14 +226,11 @@ static void test__lcreat( void )
ok( INVALID_HANDLE_VALUE != FindFirstFileA( filename, &search_results ), "should be able to find file" );
todo_wine
{
ok( 0 == DeleteFileA( filename ), "shouldn't be able to delete a readonly file" );
ok( 0 == DeleteFileA( filename ), "shouldn't be able to delete a readonly file" );
ok( SetFileAttributesA(filename, FILE_ATTRIBUTE_NORMAL ) != 0, "couldn't change attributes on file" );
ok( SetFileAttributesA(filename, FILE_ATTRIBUTE_NORMAL ) != 0, "couldn't change attributes on file" );
ok( DeleteFileA( filename ) != 0, "now it should be possible to delete the file!" );
}
ok( DeleteFileA( filename ) != 0, "now it should be possible to delete the file!" );
filehandle = _lcreat( filename, 2 );
ok( HFILE_ERROR != filehandle, "couldn't create file \"%s\" (err=%d)", filename, GetLastError( ) );
......
......@@ -2149,6 +2149,7 @@ BOOL16 WINAPI DeleteFile16( LPCSTR path )
BOOL WINAPI DeleteFileA( LPCSTR path )
{
DOS_FULL_NAME full_name;
HANDLE hFile;
if (!path)
{
......@@ -2170,11 +2171,20 @@ BOOL WINAPI DeleteFileA( LPCSTR path )
}
if (!DOSFS_GetFullName( path, TRUE, &full_name )) return FALSE;
/* check if we are allowed to delete the source */
hFile = FILE_CreateFile( full_name.long_name, GENERIC_READ|GENERIC_WRITE, 0,
NULL, OPEN_EXISTING, 0, 0, TRUE,
GetDriveTypeA( full_name.short_name ) );
if (!hFile) return FALSE;
if (unlink( full_name.long_name ) == -1)
{
FILE_SetDosError();
CloseHandle(hFile);
return FALSE;
}
CloseHandle(hFile);
return TRUE;
}
......@@ -2317,6 +2327,7 @@ static BOOL FILE_AddBootRenameEntry( const char *fn1, const char *fn2, DWORD fla
BOOL WINAPI MoveFileExA( LPCSTR fn1, LPCSTR fn2, DWORD flag )
{
DOS_FULL_NAME full_name1, full_name2;
HANDLE hFile;
TRACE("(%s,%s,%04lx)\n", fn1, fn2, flag);
......@@ -2385,6 +2396,21 @@ BOOL WINAPI MoveFileExA( LPCSTR fn1, LPCSTR fn2, DWORD flag )
return FILE_AddBootRenameEntry( fn1, fn2, flag );
}
/* check if we are allowed to delete the source */
hFile = FILE_CreateFile( full_name1.long_name, GENERIC_READ|GENERIC_WRITE, 0,
NULL, OPEN_EXISTING, 0, 0, TRUE,
GetDriveTypeA( full_name1.short_name ) );
if (!hFile) return FALSE;
CloseHandle(hFile);
/* check, if we are allowed to delete the destination,
** (but the file not being there is fine) */
hFile = FILE_CreateFile( full_name2.long_name, GENERIC_READ|GENERIC_WRITE, 0,
NULL, OPEN_EXISTING, 0, 0, TRUE,
GetDriveTypeA( full_name2.short_name ) );
if(!hFile && GetLastError() != ERROR_FILE_NOT_FOUND) return FALSE;
CloseHandle(hFile);
if (full_name1.drive != full_name2.drive)
{
/* use copy, if allowed */
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment