On 2016-06-28 21:21, hbelusca(a)svn.reactos.org wrote:
> --- trunk/reactos/base/system/subst/subst.c [iso-8859-1] (original)
> +++ trunk/reactos/base/system/subst/subst.c [iso-8859-1] Tue Jun 28 19:21:08 2016
> @@ -75,81 +75,71 @@
> if (_tcslen(Drive) > 2)
> return FALSE;
>
> - dwSize = sizeof(TCHAR) * MAX_PATH;
> - lpTargetPath = (LPTSTR) malloc(sizeof(TCHAR) * MAX_PATH);
> - if ( lpTargetPath)
> - {
> + dwSize = MAX_PATH;
> + lpTargetPath = (LPTSTR)malloc(sizeof(TCHAR) * dwSize);
> + if (!lpTargetPath)
> + return FALSE;
> +
> + CharCount = QueryDosDevice(Drive,
> + lpTargetPath,
> + dwSize);
> + while (!CharCount &&
> + GetLastError() == ERROR_INSUFFICIENT_BUFFER)
> + {
> + lpTargetPath = (LPTSTR)realloc(lpTargetPath, sizeof(TCHAR) * dwSize);
This is not how you use realloc, this causes a memory leak in case of
failure.
Also, why is there a cast here (also, for malloc above)?
Thanks.
-Thomas
> + if (lpTargetPath)
> + {
> + CharCount = QueryDosDevice(Drive,
> + lpTargetPath,
> + dwSize);
> + }
> + }
> +
> + if (CharCount)
> + {
> + Result = _tcsncmp(lpTargetPath, _T("\\??\\"), 4) == 0 &&
> + ( (lpTargetPath[4] >= _T('A') &&
> + lpTargetPath[4] <= _T('Z')) ||
> + (lpTargetPath[4] >= _T('a') &&
> + lpTargetPath[4] <= _T('z')) );
> + }
> +
> + free(lpTargetPath);
> +
> + return Result;
> +}