From: John Wolfe Date: Fri, 21 Oct 2022 18:39:49 +0000 (-0700) Subject: Fix a regression caused by the previous guestOps ListFiles() change. X-Git-Tag: stable-12.2.0~56 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6d934775155d5b1ee000056319290780e4e79b80;p=thirdparty%2Fopen-vm-tools.git Fix a regression caused by the previous guestOps ListFiles() change. If maxResults is 0, return an empty file list plus the remaining number of files. --- diff --git a/open-vm-tools/services/plugins/vix/vixTools.c b/open-vm-tools/services/plugins/vix/vixTools.c index 7f957550b..397f12f7e 100644 --- a/open-vm-tools/services/plugins/vix/vixTools.c +++ b/open-vm-tools/services/plugins/vix/vixTools.c @@ -6635,17 +6635,30 @@ VixToolsListFiles(VixCommandRequestHeader *requestMsg, // IN offset = (int)listRequest->offset; index = listRequest->index; maxResults = listRequest->maxResults; - if (offset >= maxResults) { - g_warning("%s: Invalid offset, offset is %d, maxResults is %d\n", - __FUNCTION__, offset, maxResults); - err = VIX_E_INVALID_ARG; - goto quit; - } + /* + * bora/vmx/automation/guestOps.c::GuestOpsListFiles() throws + * VIX_E_INVALID_ARG if (index < 0) || (maxResults < 0) is TRUE. + */ + ASSERT(offset >= 0 && index >= 0 && maxResults >= 0); /* - * This is the maximum number of results that can be returned in this call. + * Do not fail the API if maxResults is 0, instead, return an empty file + * list plus the remaining number of files. */ - maxOffsetResults = maxResults - offset; + if (maxResults > 0) { + if (offset >= maxResults) { + g_warning("%s: Invalid offset, offset is %d, maxResults is %d\n", + __FUNCTION__, offset, maxResults); + err = VIX_E_INVALID_ARG; + goto quit; + } + + /* + * This is the maximum number of results that can be returned + * in this call. + */ + maxOffsetResults = maxResults - offset; + } err = VMAutomationRequestParserGetString(&parser, listRequest->guestPathNameLength, @@ -6769,38 +6782,43 @@ VixToolsListFiles(VixCommandRequestHeader *requestMsg, // IN numFiles = newNumFiles; } - for (fileNum = index + offset; - fileNum < numFiles; - fileNum++) { + if (maxResults > 0) { + for (fileNum = index + offset; + fileNum < numFiles; + fileNum++) { - currentFileName = fileNameList[fileNum]; + currentFileName = fileNameList[fileNum]; - if (listingSingleFile) { - resultBufferSize += VixToolsGetFileExtendedInfoLength(currentFileName, - currentFileName); - } else { - pathName = Str_SafeAsprintf(NULL, "%s%s%s", dirPathName, DIRSEPS, - currentFileName); - resultBufferSize += VixToolsGetFileExtendedInfoLength(pathName, - currentFileName); - free(pathName); - } + if (listingSingleFile) { + resultBufferSize += VixToolsGetFileExtendedInfoLength( + currentFileName, currentFileName); + } else { + pathName = Str_SafeAsprintf(NULL, "%s%s%s", dirPathName, DIRSEPS, + currentFileName); + resultBufferSize += VixToolsGetFileExtendedInfoLength( + pathName, currentFileName); + free(pathName); + } - if (resultBufferSize < maxBufferSize) { - lastGoodResultBufferSize = resultBufferSize; - count++; - if (count == maxOffsetResults) { - remaining = numFiles - fileNum - 1; + if (resultBufferSize < maxBufferSize) { + lastGoodResultBufferSize = resultBufferSize; + count++; + if (count == maxOffsetResults) { + remaining = numFiles - fileNum - 1; + break; + } + } else { + truncated = TRUE; + remaining = numFiles - fileNum; break; } - } else { - truncated = TRUE; - remaining = numFiles - fileNum; - break; } + resultBufferSize = lastGoodResultBufferSize; + numResults = count; + } else { + remaining = (index < numFiles) ? (numFiles - index) : 0; + numResults = 0; } - resultBufferSize = lastGoodResultBufferSize; - numResults = count; /* * Print the result buffer.