Переглянути джерело

HPCC-13981 Fix isses with filenames with leading numeric characters

Signed-off-by: Jake Smith <jake.smith@lexisnexis.com>
Jake Smith 10 роки тому
батько
коміт
a351bfb823
3 змінених файлів з 17 додано та 19 видалено
  1. 4 6
      dali/base/dautils.cpp
  2. 13 0
      system/jlib/jptree.hpp
  3. 0 13
      system/jlib/jptree.ipp

+ 4 - 6
dali/base/dautils.cpp

@@ -884,16 +884,12 @@ StringBuffer &CDfsLogicalFileName::makeXPathLName(StringBuffer &lfnNodeName) con
 {
     const char *s=get(true);    // skip foreign
     // Ensure only chars that are accepted by jptree in an xpath element are used
-    bool first=true;
     loop
     {
         const char *e=strstr(s,"::");
         if ((e && 0 != strncmp(".", s, e-s)) || (!e && !streq(".", s))) // skip '.' scopes
         {
-            if (first)
-                first = false;
-            else
-                lfnNodeName.append('_');
+            lfnNodeName.append('_');
             while (s != e)
             {
                 char c = *s;
@@ -908,7 +904,9 @@ StringBuffer &CDfsLogicalFileName::makeXPathLName(StringBuffer &lfnNodeName) con
                     c = toupper(*s);
                     // fall through
                 default:
-                    if (isalnum(c))
+                    if ('_' == c)
+                        lfnNodeName.append("__"); // to avoid clash with use of '_' here was escape char.
+                    else if (isValidXPathChr(c))
                         lfnNodeName.append(c);
                     else
                         lfnNodeName.append('_').append((unsigned) (unsigned char) c);

+ 13 - 0
system/jlib/jptree.hpp

@@ -249,4 +249,17 @@ typedef IPropertyTree IPTree;
 typedef IPropertyTreeIterator IPTreeIterator;
 typedef Owned<IPTree> OwnedPTree;
 
+// http://www.w3.org/TR/REC-xml#xml-names
+static const char *validStartChrs = ":_";
+inline static bool isValidXPathStartChr(char c)
+{
+    return ('\0' != c && (isalpha(c) || strchr(validStartChrs, c)));
+}
+
+static const char *validChrs = ":_.-";
+inline static bool isValidXPathChr(char c)
+{
+    return ('\0' != c && (isalnum(c) || strchr(validChrs, c)));
+}
+
 #endif

+ 0 - 13
system/jlib/jptree.ipp

@@ -121,19 +121,6 @@ public:
 };
 
 
-// http://www.w3.org/TR/REC-xml#xml-names
-static const char *validStartChrs = ":_";
-inline static bool isValidXPathStartChr(char c)
-{
-    return ('\0' != c && (isalpha(c) || strchr(validStartChrs, c)));
-}
-
-static const char *validChrs = ":_.-";
-inline static bool isValidXPathChr(char c)
-{
-    return ('\0' != c && (isalnum(c) || strchr(validChrs, c)));
-}
-
 inline static int validJSONUtf8ChrLen(unsigned char c)
 {
     if (c <= 31)