feat: clipboard files, audit (#12730)

Signed-off-by: fufesou <linlong1266@gmail.com>
This commit is contained in:
fufesou
2025-08-25 22:29:53 +08:00
committed by GitHub
parent f4fb31d7a1
commit 6381f43f01
9 changed files with 242 additions and 31 deletions

View File

@@ -239,6 +239,7 @@ struct wf_clipboard
size_t nFiles;
size_t file_array_size;
WCHAR **file_names;
size_t first_file_index;
FILEDESCRIPTORW **fileDescriptor;
BOOL legacyApi;
@@ -2024,6 +2025,7 @@ static void clear_file_array(wfClipboard *clipboard)
clipboard->file_array_size = 0;
clipboard->nFiles = 0;
clipboard->first_file_index = (size_t)-1;
}
static BOOL wf_cliprdr_get_file_contents(WCHAR *file_name, BYTE *buffer, LONG positionLow,
@@ -2179,6 +2181,11 @@ static BOOL wf_cliprdr_add_to_file_arrays(wfClipboard *clipboard, WCHAR *full_fi
return FALSE;
}
if ((clipboard->fileDescriptor[clipboard->nFiles]->dwFileAttributes &
FILE_ATTRIBUTE_DIRECTORY) == 0) {
clipboard->first_file_index = clipboard->nFiles;
}
clipboard->nFiles++;
return TRUE;
}
@@ -2968,6 +2975,14 @@ wf_cliprdr_server_file_contents_request(CliprdrClientContext *context,
{
LARGE_INTEGER dlibMove;
ULARGE_INTEGER dlibNewPosition;
if (clipboard->nFiles > 0 &&
fileContentsRequest->listIndex == (UINT32)clipboard->first_file_index &&
fileContentsRequest->nPositionLow == 0 &&
fileContentsRequest->nPositionHigh == 0) {
clipboard->context->HandleClipboardFiles(fileContentsRequest->connID, clipboard->nFiles, clipboard->file_names);
}
dlibMove.HighPart = fileContentsRequest->nPositionHigh;
dlibMove.LowPart = fileContentsRequest->nPositionLow;
hRet = IStream_Seek(pStreamStc, dlibMove, STREAM_SEEK_SET, &dlibNewPosition);
@@ -2999,6 +3014,13 @@ wf_cliprdr_server_file_contents_request(CliprdrClientContext *context,
rc = ERROR_INTERNAL_ERROR;
goto exit;
}
if (clipboard->nFiles > 0 &&
fileContentsRequest->listIndex == (UINT32)clipboard->first_file_index &&
fileContentsRequest->nPositionLow == 0 &&
fileContentsRequest->nPositionHigh == 0) {
clipboard->context->HandleClipboardFiles(fileContentsRequest->connID, clipboard->nFiles, clipboard->file_names);
}
bRet = wf_cliprdr_get_file_contents(
clipboard->file_names[fileContentsRequest->listIndex], pData,
fileContentsRequest->nPositionLow, fileContentsRequest->nPositionHigh, cbRequested,