r11909: Implement 'reset on zero vc'. This kills other connections when a session
[ira/wip.git] / source3 / smbd / mangle_hash2.c
index 6a8462ee3d06a5ccd81054366304951c404f7052..335ba8e2ef9315e21e1f4240c7a47d14c85b2e27 100644 (file)
@@ -212,7 +212,7 @@ static BOOL is_mangled_component(const char *name, size_t len)
 {
        unsigned int i;
 
-       M_DEBUG(10,("is_mangled_component %s (len %u) ?\n", name, (unsigned int)len));
+       M_DEBUG(10,("is_mangled_component %s (len %lu) ?\n", name, (unsigned long)len));
 
        /* check the length */
        if (len > 12 || len < 8)
@@ -250,7 +250,7 @@ static BOOL is_mangled_component(const char *name, size_t len)
                }
        }
 
-       M_DEBUG(10,("is_mangled_component %s (len %u) -> yes\n", name, (unsigned int)len));
+       M_DEBUG(10,("is_mangled_component %s (len %lu) -> yes\n", name, (unsigned long)len));
 
        return True;
 }
@@ -445,6 +445,7 @@ static BOOL is_reserved_name(const char *name)
 /*
  See if a filename is a legal long filename.
  A filename ending in a '.' is not legal unless it's "." or "..". JRA.
+ A filename ending in ' ' is not legal either. See bug id #2769.
 */
 
 static BOOL is_legal_name(const char *name)
@@ -480,6 +481,10 @@ static BOOL is_legal_name(const char *name)
                } else {
                        alldots = False;
                }
+               if ((name[0] == ' ') && (name[1] == '\0')) {
+                       /* Can't end in ' ' */
+                       return False;
+               }
                name++;
        }
 
@@ -491,7 +496,6 @@ static BOOL is_legal_name(const char *name)
                if (dot_pos[1] == '\0')
                        return False;
        }
-
        return True;
 }
 
@@ -633,6 +637,11 @@ static void init_tables(void)
        memset(char_flags, 0, sizeof(char_flags));
 
        for (i=1;i<128;i++) {
+               if (i <= 0x1f) {
+                       /* Control characters. */
+                       char_flags[i] |= FLAG_ILLEGAL;
+               }
+
                if ((i >= '0' && i <= '9') || 
                    (i >= 'a' && i <= 'z') || 
                    (i >= 'A' && i <= 'Z')) {
@@ -711,3 +720,42 @@ struct mangle_fns *mangle_hash2_init(void)
 
        return &mangle_fns;
 }
+
+static void posix_mangle_reset(void)
+{;}
+
+static BOOL posix_is_mangled(const char *s, int snum)
+{
+       return False;
+}
+
+static BOOL posix_is_8_3(const char *fname, BOOL check_case, BOOL allow_wildcards, int snum)
+{
+       return False;
+}
+
+static BOOL posix_check_cache( char *s, size_t maxlen, int snum )
+{
+       return False;
+}
+
+static void posix_name_map(char *OutName, BOOL need83, BOOL cache83, int default_case, int snum)
+{
+       if (need83) {
+               memset(OutName, '\0', 13);
+       }
+}
+
+/* POSIX paths backend - no mangle. */
+static struct mangle_fns posix_mangle_fns = {
+        posix_mangle_reset,
+        posix_is_mangled,
+        posix_is_8_3,
+        posix_check_cache,
+        posix_name_map
+};
+
+struct mangle_fns *posix_mangle_init(void)
+{
+       return &posix_mangle_fns;
+}