From: Barath Kannan <barathrk11@gmail.com> Signed-off-by: Barath Kannan <barathrk11@gmail.com> --- programs/cmd/builtins.c | 90 +++++++++++++++++++++++++++++++++++------ 1 file changed, 78 insertions(+), 12 deletions(-) diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c index 1c9074b75d3..1f96ce09543 100644 --- a/programs/cmd/builtins.c +++ b/programs/cmd/builtins.c @@ -30,6 +30,7 @@ #include "wcmd.h" #include <shellapi.h> +#include "shlwapi.h" #include "winternl.h" #include "winioctl.h" #include "ddk/ntifs.h" @@ -2365,7 +2366,7 @@ RETURN_CODE WCMD_setshow_default(const WCHAR *args) WCHAR ext[MAX_PATH]; /* Convert path into actual directory spec */ - if (!WCMD_get_fullpath(string, ARRAY_SIZE(fpath), fpath, NULL)) + if (!WCMD_get_fullpath(string, ARRAY_SIZE(fpath), fpath, NULL)) return errorlevel = ERROR_INVALID_FUNCTION; _wsplitpath(fpath, drive, dir, fname, ext); @@ -3439,6 +3440,11 @@ RETURN_CODE WCMD_type(WCHAR *args) int argno = 0; WCHAR *argN = args; BOOL writeHeaders = FALSE; + BOOL foundOnlyDirectories = TRUE; + WIN32_FIND_DATAW fd; + HANDLE hff = INVALID_HANDLE_VALUE; + WCHAR *fileNamePart; + WCHAR srcpath[MAX_PATH]; if (param1[0] == 0x00) { WCMD_output_stderr(WCMD_LoadMessage(WCMD_NOARG)); @@ -3454,26 +3460,86 @@ RETURN_CODE WCMD_type(WCHAR *args) HANDLE hIn, hOut; DWORD console_mode; + DWORD arg_len; + DWORD file_name_part_len; if (!argN) break; - WINE_TRACE("type: Processing arg '%s'\n", wine_dbgstr_w(thisArg)); - hIn = CreateFileW(thisArg, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, NULL, OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, NULL); - if (hIn == INVALID_HANDLE_VALUE) { + arg_len = wcslen(thisArg); + + if (arg_len > MAX_PATH) { + SetLastError(ERROR_FILENAME_EXCED_RANGE); + WCMD_print_error (); + WCMD_output_stderr(WCMD_LoadMessage(WCMD_READFAIL), thisArg); + return errorlevel = ERROR_FILENAME_EXCED_RANGE; + } + + lstrcpyW(srcpath, thisArg); + + writeHeaders = writeHeaders || (wcspbrk(srcpath, L"*?") ? TRUE : FALSE); + + fileNamePart = PathFindFileNameW(srcpath); + + hff = FindFirstFileW(srcpath, &fd); + + if (hff != INVALID_HANDLE_VALUE) { + do { + file_name_part_len = wcslen(fd.cFileName); + + if ((arg_len + file_name_part_len) > MAX_PATH) { + SetLastError(ERROR_FILENAME_EXCED_RANGE); + WCMD_print_error (); + WCMD_output_stderr(WCMD_LoadMessage(WCMD_READFAIL), thisArg); + FindClose(hff); + return errorlevel = ERROR_FILENAME_EXCED_RANGE; + } + + lstrcpyW(fileNamePart, fd.cFileName); + + WINE_TRACE("type: thisArg: '%s'\n", wine_dbgstr_w(srcpath)); + + hIn = CreateFileW(srcpath, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, NULL, OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, NULL); + if (hIn == INVALID_HANDLE_VALUE) { + if(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { + WINE_TRACE("Skipping directories\n"); + continue; + } + + WCMD_print_error (); + WCMD_output_stderr(WCMD_LoadMessage(WCMD_READFAIL), thisArg); + FindClose(hff); + return errorlevel = ERROR_INVALID_FUNCTION; + } + + foundOnlyDirectories = FALSE; + hOut = GetStdHandle(STD_OUTPUT_HANDLE); + + if (writeHeaders) { + WCMD_output_stderr(L"\n%1\n\n\n", srcpath); + } + + WCMD_copy_loop(hIn, hOut, GetConsoleMode(hIn, &console_mode) || GetConsoleMode(hOut, &console_mode)); + + return_code = NO_ERROR; + CloseHandle (hIn); + } while (FindNextFileW(hff, &fd) != 0); + } + else { + foundOnlyDirectories = FALSE; + return_code = ERROR_INVALID_FUNCTION; WCMD_print_error (); WCMD_output_stderr(WCMD_LoadMessage(WCMD_READFAIL), thisArg); - return errorlevel = ERROR_INVALID_FUNCTION; } - hOut = GetStdHandle(STD_OUTPUT_HANDLE); - if (writeHeaders) { - WCMD_output_stderr(L"\n%1\n\n\n", thisArg); + if (foundOnlyDirectories) { + return_code = ERROR_PATH_NOT_FOUND; + WCMD_print_error (); + WCMD_output_stderr(WCMD_LoadMessage(WCMD_READFAIL), thisArg); } - WCMD_copy_loop(hIn, hOut, GetConsoleMode(hIn, &console_mode) || GetConsoleMode(hOut, &console_mode)); - - CloseHandle (hIn); + foundOnlyDirectories = TRUE; + FindClose (hff); } return errorlevel = return_code; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11094