Can't set allocation size on directories, return correct error code on
authorJeremy Allison <jra@samba.org>
Sat, 28 Feb 2004 01:53:30 +0000 (01:53 +0000)
committerJeremy Allison <jra@samba.org>
Sat, 28 Feb 2004 01:53:30 +0000 (01:53 +0000)
fail if file exists and target is a directory. gentest.
Jeremy.
(This used to be commit f4a7ea6dc2b9f379a9c735670a49ac63818754c7)

source3/libsmb/errormap.c
source3/smbd/nttrans.c
source3/smbd/open.c

index 116d2cefe152669262afa93477d59d13e1d863d7..aeb68b6596c504d3043fa002acbeb52c7fbcc228 100644 (file)
@@ -1503,6 +1503,7 @@ const struct unix_error_map unix_dos_nt_errmap[] = {
        { EMFILE, ERRDOS, ERRnofids, NT_STATUS_TOO_MANY_OPENED_FILES },
        { ENOSPC, ERRHRD, ERRdiskfull, NT_STATUS_DISK_FULL },
        { ENOMEM, ERRDOS, ERRnomem, NT_STATUS_NO_MEMORY },
+       { EISDIR, ERRDOS, ERRnoaccess, NT_STATUS_FILE_IS_A_DIRECTORY},
 #ifdef EDQUOT
        { EDQUOT, ERRHRD, ERRdiskfull, NT_STATUS_DISK_FULL },
 #endif
index 8c3d1eefba8cc57a3cfb5019747aacae35866383..7b02c600013ba17f272377cabae5c45ab891d11c 100644 (file)
@@ -895,6 +895,12 @@ create_options = 0x%x root_dir_fid = 0x%x\n", flags, desired_access, file_attrib
 #endif
        if (allocation_size && (allocation_size > (SMB_BIG_UINT)file_len)) {
                fsp->initial_allocation_size = SMB_ROUNDUP(allocation_size,SMB_ROUNDUP_ALLOCATION_SIZE);
+               if (fsp->is_directory) {
+                       close_file(fsp,False);
+                       END_PROFILE(SMBntcreateX);
+                       /* Can't set allocation size on a directory. */
+                       return ERROR_NT(NT_STATUS_ACCESS_DENIED);
+               }
                if (vfs_allocate_file_space(fsp, fsp->initial_allocation_size) == -1) {
                        close_file(fsp,False);
                        END_PROFILE(SMBntcreateX);
@@ -1404,6 +1410,12 @@ static int call_nt_transact_create(connection_struct *conn, char *inbuf, char *o
 #endif
        if (allocation_size && (allocation_size > file_len)) {
                fsp->initial_allocation_size = SMB_ROUNDUP(allocation_size,SMB_ROUNDUP_ALLOCATION_SIZE);
+               if (fsp->is_directory) {
+                       close_file(fsp,False);
+                       END_PROFILE(SMBntcreateX);
+                       /* Can't set allocation size on a directory. */
+                       return ERROR_NT(NT_STATUS_ACCESS_DENIED);
+               }
                if (vfs_allocate_file_space(fsp, fsp->initial_allocation_size) == -1) {
                        close_file(fsp,False);
                        return ERROR_NT(NT_STATUS_DISK_FULL);
index dd10a8705583a766165801bb5f152524c18c0763..e688f8de485971cfb9447ca3254377ecebb751e5 100644 (file)
@@ -866,7 +866,11 @@ files_struct *open_file_shared1(connection_struct *conn,char *fname, SMB_STRUCT_
                DEBUG(5,("open_file_shared: create new requested for file %s and file already exists.\n",
                        fname ));
                file_free(fsp);
-               errno = EEXIST;
+               if (S_ISDIR(psbuf->st_mode)) {
+                       errno = EISDIR;
+               } else {
+                       errno = EEXIST;
+               }
                return NULL;
        }