KWSys: Fix SystemTools::FileIsDirectory with long paths (#14176)
Allocate a buffer large enough to hold the input path when removing a trailing slash. Use a local stack buffer when it is large enough and fall back to heap allocation otherwise.
This commit is contained in:
parent
5dd8c01429
commit
045d6ae0b0
|
@ -2742,14 +2742,23 @@ bool SystemTools::FileIsDirectory(const char* name)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove any trailing slash from the name.
|
// Remove any trailing slash from the name.
|
||||||
char buffer[KWSYS_SYSTEMTOOLS_MAXPATH];
|
char local_buffer[KWSYS_SYSTEMTOOLS_MAXPATH];
|
||||||
|
std::string string_buffer;
|
||||||
size_t last = length-1;
|
size_t last = length-1;
|
||||||
if(last > 0 && (name[last] == '/' || name[last] == '\\')
|
if(last > 0 && (name[last] == '/' || name[last] == '\\')
|
||||||
&& strcmp(name, "/") !=0)
|
&& strcmp(name, "/") !=0)
|
||||||
{
|
{
|
||||||
memcpy(buffer, name, last);
|
if(last < sizeof(local_buffer))
|
||||||
buffer[last] = 0;
|
{
|
||||||
name = buffer;
|
memcpy(local_buffer, name, last);
|
||||||
|
local_buffer[last] = 0;
|
||||||
|
name = local_buffer;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
string_buffer.append(name, last);
|
||||||
|
name = string_buffer.c_str();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now check the file node type.
|
// Now check the file node type.
|
||||||
|
|
Loading…
Reference in New Issue