mirror of
https://github.com/reactos/reactos.git
synced 2024-10-02 15:34:13 +00:00
[CRT]
Rewritten _tfullpath(). This: - Fixes memory leak - Fixes null pointer use - Adds missing features - Sets errno svn path=/trunk/; revision=53782
This commit is contained in:
parent
e91d38160f
commit
0194a753c7
|
@ -1,11 +1,9 @@
|
|||
/*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS system libraries
|
||||
* FILE: lib/msvcrt/stdlib/fullpath.c
|
||||
* PROJECT: ReactOS CRT library
|
||||
* FILE: lib/sdk/crt/stdlib/fullpath.c
|
||||
* PURPOSE: Gets the fullpathname
|
||||
* PROGRAMER: Ariadne
|
||||
* UPDATE HISTORY:
|
||||
* 28/12/98: Created
|
||||
* PROGRAMER: Pierre Schweitzer (pierre.schweitzer@reactos.org)
|
||||
*/
|
||||
|
||||
#include <precomp.h>
|
||||
|
@ -16,18 +14,60 @@
|
|||
*/
|
||||
_TCHAR* _tfullpath(_TCHAR* absPath, const _TCHAR* relPath, size_t maxLength)
|
||||
{
|
||||
_TCHAR* lpBuffer;
|
||||
_TCHAR* lpFilePart;
|
||||
DWORD copied;
|
||||
DWORD retval;
|
||||
|
||||
if (!absPath)
|
||||
/* First check if entry relative path was given */
|
||||
if (!relPath || relPath[0] == 0)
|
||||
{
|
||||
maxLength = MAX_PATH;
|
||||
absPath = malloc(maxLength);
|
||||
/* If not, just try to return current dir */
|
||||
return _tgetcwd(absPath, maxLength);
|
||||
}
|
||||
|
||||
copied = GetFullPathName(relPath,(DWORD)maxLength,absPath,&lpFilePart);
|
||||
if (copied == 0 || copied > maxLength)
|
||||
return NULL;
|
||||
/* If no output buffer was given */
|
||||
if (!absPath)
|
||||
{
|
||||
/* Allocate one with fixed length */
|
||||
maxLength = MAX_PATH;
|
||||
lpBuffer = malloc(maxLength);
|
||||
if (!lpBuffer)
|
||||
{
|
||||
errno = ENOMEM;
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
lpBuffer = absPath;
|
||||
}
|
||||
|
||||
return absPath;
|
||||
/* Really get full path */
|
||||
retval = GetFullPathName(relPath, (DWORD)maxLength, lpBuffer, &lpFilePart);
|
||||
/* Check for failures */
|
||||
if (retval > maxLength)
|
||||
{
|
||||
/* Path too long, free (if needed) and return */
|
||||
if (!absPath)
|
||||
{
|
||||
free(lpBuffer);
|
||||
}
|
||||
|
||||
errno = ERANGE;
|
||||
return NULL;
|
||||
}
|
||||
else if (!retval)
|
||||
{
|
||||
/* Other error, free (if needed), translate error, and return */
|
||||
if (!absPath)
|
||||
{
|
||||
free(lpBuffer);
|
||||
}
|
||||
|
||||
_dosmaperr(GetLastError());
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Return buffer. Up to the caller to free if needed */
|
||||
return lpBuffer;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue