smbd: Fix opening the quota magic file
authorStefan Metzmacher <metze@samba.org>
Mon, 21 Dec 2009 15:26:34 +0000 (16:26 +0100)
committerKarolin Seeger <kseeger@samba.org>
Tue, 12 Jan 2010 11:51:09 +0000 (12:51 +0100)
This fixes bug #6642 and bug #6919.

metze

source3/smbd/reply.c

index acd84d689de1c13fef4897b35275ae20c8e6e868..23fa3e885b0c25bd662b82e312c91a8a17cc5fbd 100644 (file)
@@ -46,9 +46,9 @@ static NTSTATUS check_path_syntax_internal(char *path,
 {
        char *d = path;
        const char *s = path;
-       NTSTATUS ret = NT_STATUS_OK;
        bool start_of_name_component = True;
        bool stream_started = false;
+       bool check_quota = false;
 
        *p_last_component_contains_wcard = False;
 
@@ -66,7 +66,7 @@ static NTSTATUS check_path_syntax_internal(char *path,
                                        return NT_STATUS_OBJECT_NAME_INVALID;
                                }
                                if (StrCaseCmp(s, ":$DATA") != 0) {
-                                       return NT_STATUS_INVALID_PARAMETER;
+                                       check_quota = true;
                                }
                                break;
                        }
@@ -127,8 +127,7 @@ static NTSTATUS check_path_syntax_internal(char *path,
 
                                /* Are we at the start ? Can't go back further if so. */
                                if (d <= path) {
-                                       ret = NT_STATUS_OBJECT_PATH_SYNTAX_BAD;
-                                       break;
+                                       return NT_STATUS_OBJECT_PATH_SYNTAX_BAD;
                                }
                                /* Go back one level... */
                                /* We know this is safe as '/' cannot be part of a mb sequence. */
@@ -201,7 +200,13 @@ static NTSTATUS check_path_syntax_internal(char *path,
 
        *d = '\0';
 
-       return ret;
+       if (check_quota) {
+               if (StrCaseCmp(path, FAKE_FILE_NAME_QUOTA_UNIX) != 0) {
+                       return NT_STATUS_INVALID_PARAMETER;
+               }
+       }
+
+       return NT_STATUS_OK;
 }
 
 /****************************************************************************