From: Bernhard Übelacker bernhardu@mailbox.org
--- programs/cmd/directory.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/programs/cmd/directory.c b/programs/cmd/directory.c index 0fb9ad7fdd6..788ef2a84c4 100644 --- a/programs/cmd/directory.c +++ b/programs/cmd/directory.c @@ -242,7 +242,8 @@ static void WCMD_getfileowner(WCHAR *filename, WCHAR *owner, int ownerlen) { static RETURN_CODE WCMD_list_directory (DIRECTORY_STACK *inputparms, int level, DIRECTORY_STACK **outputparms) {
WCHAR string[1024], datestring[32], timestring[32]; - WCHAR real_path[MAX_PATH]; + WCHAR *real_path = NULL; + int real_path_chars = 0; WIN32_FIND_DATAW *fd; FILETIME ft; SYSTEMTIME st; @@ -272,6 +273,10 @@ static RETURN_CODE WCMD_list_directory (DIRECTORY_STACK *inputparms, int level, concurrentDirs++;
/* Work out the full path + filename */ + if (real_path_chars < (lstrlenW(parms->dirName) + lstrlenW(parms->fileName) + 1)) { + real_path_chars = max(MAX_PATH, lstrlenW(parms->dirName) + lstrlenW(parms->fileName) + 1); + real_path = xrealloc(real_path, real_path_chars * sizeof(*real_path)); + } lstrcpyW(real_path, parms->dirName); lstrcatW(real_path, parms->fileName);
@@ -313,6 +318,7 @@ static RETURN_CODE WCMD_list_directory (DIRECTORY_STACK *inputparms, int level, /* Move to next parm */ parms = parms->next; } + free(real_path);
/* Handle case where everything is filtered out */ if (entry_count > 0) {