diff --git a/SystemTools.cxx b/SystemTools.cxx
index 394d65e0d98ba8411244d2e9fb87aa49bf68f3e8..158217e195e6b242a7f3299975876eed62d00650 100644
--- a/SystemTools.cxx
+++ b/SystemTools.cxx
@@ -2742,14 +2742,23 @@ bool SystemTools::FileIsDirectory(const char* name)
     }
 
   // Remove any trailing slash from the name except in a root component.
-  char buffer[KWSYS_SYSTEMTOOLS_MAXPATH];
+  char local_buffer[KWSYS_SYSTEMTOOLS_MAXPATH];
+  std::string string_buffer;
   size_t last = length-1;
   if(last > 0 && (name[last] == '/' || name[last] == '\\')
     && strcmp(name, "/") !=0 && name[last-1] != ':')
     {
-    memcpy(buffer, name, last);
-    buffer[last] = 0;
-    name = buffer;
+    if(last < sizeof(local_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.