Do not call SMB_VFS_GET_REAL_FILENAME if the name is mangled
[ira/wip.git] / source3 / smbd / filename.c
index 774ab27a74b958ba0834ff8fe2f9ce312539adf8..0d5529b6b0c338776c9042fb98d44ec1f63712c0 100644 (file)
@@ -791,16 +791,14 @@ static bool fname_equal(const char *name1, const char *name2,
 
 static int get_real_filename_full_scan(connection_struct *conn,
                                       const char *path, const char *name,
+                                      bool mangled,
                                       TALLOC_CTX *mem_ctx, char **found_name)
 {
        struct smb_Dir *cur_dir;
        const char *dname;
-       bool mangled;
        char *unmangled_name = NULL;
        long curpos;
 
-       mangled = mangle_is_mangled(name, conn->params);
-
        /* handle null paths */
        if ((path == NULL) || (*path == 0)) {
                path = ".";
@@ -897,6 +895,14 @@ int get_real_filename(connection_struct *conn, const char *path,
                      char **found_name)
 {
        int ret;
+       bool mangled;
+
+       mangled = mangle_is_mangled(name, conn->params);
+
+       if (mangled) {
+               return get_real_filename_full_scan(conn, path, name, mangled,
+                                                  mem_ctx, found_name);
+       }
 
        /* Try the vfs first to take advantage of case-insensitive stat. */
        ret = SMB_VFS_GET_REAL_FILENAME(conn, path, name, mem_ctx, found_name);
@@ -910,9 +916,8 @@ int get_real_filename(connection_struct *conn, const char *path,
                return ret;
        }
 
-       ret = get_real_filename_full_scan(conn, path, name, mem_ctx,
-                                         found_name);
-       return ret;
+       return get_real_filename_full_scan(conn, path, name, mangled, mem_ctx,
+                                          found_name);
 }
 
 static NTSTATUS build_stream_path(TALLOC_CTX *mem_ctx,