1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-03 13:47:25 +03:00

r3193: improved the initial permissions choice for file create, based upon dos attribute

(This used to be commit f6fb1e3493a2a0734747f769cd1013215d967cde)
This commit is contained in:
Andrew Tridgell 2004-10-25 05:27:49 +00:00 committed by Gerald (Jerry) Carter
parent 3918ae351d
commit 1be85de588
2 changed files with 61 additions and 61 deletions

View File

@ -35,58 +35,6 @@
#define UNIX_TYPE_UNKNOWN 0xFFFFFFFF
/*
Return the major devicenumber for UNIX extensions.
*/
static uint32_t unix_dev_major(dev_t dev)
{
#if defined(HAVE_DEVICE_MAJOR_FN)
return (uint32)major(dev);
#else
return (uint32)(dev >> 8);
#endif
}
/*
Return the minor devicenumber for UNIX extensions.
*/
static uint32_t unix_dev_minor(dev_t dev)
{
#if defined(HAVE_DEVICE_MINOR_FN)
return (uint32)minor(dev);
#else
return (uint32)(dev & 0xff);
#endif
}
/*
Return the filetype for UNIX extensions
*/
static uint32_t unix_filetype(mode_t mode)
{
if (S_ISREG(mode)) return UNIX_TYPE_FILE;
if (S_ISDIR(mode)) return UNIX_TYPE_DIR;
#ifdef S_ISLNK
if (S_ISLNK(mode)) return UNIX_TYPE_SYMLINK;
#endif
#ifdef S_ISCHR
if (S_ISCHR(mode)) return UNIX_TYPE_CHARDEV;
#endif
#ifdef S_ISBLK
if (S_ISBLK(mode)) return UNIX_TYPE_BLKDEV;
#endif
#ifdef S_ISFIFO
if (S_ISFIFO(mode)) return UNIX_TYPE_FIFO;
#endif
#ifdef S_ISSOCK
if (S_ISSOCK(mode)) return UNIX_TYPE_SOCKET;
#endif
DEBUG(0,("unix_filetype: unknown filetype %u", (unsigned)mode));
return UNIX_TYPE_UNKNOWN;
}
/****************************************************************************
Change a unix mode to a dos mode.
****************************************************************************/
@ -153,3 +101,37 @@ NTSTATUS pvfs_fill_dos_info(struct pvfs_state *pvfs, struct pvfs_filename *name)
return NT_STATUS_OK;
}
/*
return a set of unix file permissions for a new file or directory
*/
mode_t pvfs_fileperms(struct pvfs_state *pvfs, uint32 attrib)
{
mode_t mode = S_IRUSR | S_IRGRP | S_IROTH;
if (attrib & FILE_ATTRIBUTE_DIRECTORY) {
mode |= S_IXUSR | S_IXGRP | S_IXOTH;
}
if (!(attrib & FILE_ATTRIBUTE_READONLY)) {
mode |= S_IWUSR;
}
if ((attrib & FILE_ATTRIBUTE_ARCHIVE) &&
(pvfs->flags & PVFS_FLAG_MAP_ARCHIVE)) {
mode |= S_IXUSR;
}
if ((attrib & FILE_ATTRIBUTE_SYSTEM) &&
(pvfs->flags & PVFS_FLAG_MAP_SYSTEM)) {
mode |= S_IXGRP;
}
if ((attrib & FILE_ATTRIBUTE_HIDDEN) &&
(pvfs->flags & PVFS_FLAG_MAP_HIDDEN)) {
mode |= S_IXOTH;
}
return mode;
}

View File

@ -150,7 +150,9 @@ static NTSTATUS pvfs_open_directory(struct pvfs_state *pvfs,
talloc_set_destructor(f, pvfs_dir_fd_destructor);
if (!name->exists) {
if (mkdir(name->full_name, 0755) == -1) {
uint32_t attrib = io->generic.in.file_attr | FILE_ATTRIBUTE_DIRECTORY;
mode_t mode = pvfs_fileperms(pvfs, attrib);
if (mkdir(name->full_name, mode) == -1) {
return pvfs_map_errno(pvfs,errno);
}
status = pvfs_resolve_name(pvfs, req, io->ntcreatex.in.fname,
@ -287,7 +289,17 @@ static NTSTATUS pvfs_create_file(struct pvfs_state *pvfs,
access_mask = GENERIC_RIGHTS_FILE_READ | GENERIC_RIGHTS_FILE_WRITE;
}
flags = O_RDWR;
switch (access_mask & (SA_RIGHT_FILE_READ_DATA | SA_RIGHT_FILE_WRITE_DATA)) {
case SA_RIGHT_FILE_READ_DATA:
flags = O_RDONLY;
break;
case SA_RIGHT_FILE_WRITE_DATA:
flags = O_WRONLY;
break;
case SA_RIGHT_FILE_WRITE_DATA|SA_RIGHT_FILE_READ_DATA:
flags = O_RDWR;
break;
}
f = talloc_p(req, struct pvfs_file);
if (f == NULL) {
@ -299,11 +311,7 @@ static NTSTATUS pvfs_create_file(struct pvfs_state *pvfs,
return NT_STATUS_TOO_MANY_OPENED_FILES;
}
if (io->ntcreatex.in.file_attr & FILE_ATTRIBUTE_READONLY) {
mode = 0444;
} else {
mode = 0644;
}
mode = pvfs_fileperms(pvfs, io->ntcreatex.in.file_attr);
/* create the file */
fd = open(name->full_name, flags | O_CREAT | O_EXCL, mode);
@ -434,7 +442,7 @@ NTSTATUS pvfs_open(struct ntvfs_module_context *ntvfs,
access_mask = io->generic.in.access_mask;
if (access_mask & SEC_RIGHT_MAXIMUM_ALLOWED) {
if (name->dos.attrib & FILE_ATTRIBUTE_READONLY) {
if (name->exists && (name->dos.attrib & FILE_ATTRIBUTE_READONLY)) {
access_mask = GENERIC_RIGHTS_FILE_READ;
} else {
access_mask = GENERIC_RIGHTS_FILE_READ | GENERIC_RIGHTS_FILE_WRITE;
@ -488,7 +496,17 @@ NTSTATUS pvfs_open(struct ntvfs_module_context *ntvfs,
return NT_STATUS_INVALID_PARAMETER;
}
flags |= O_RDWR;
switch (access_mask & (SA_RIGHT_FILE_READ_DATA | SA_RIGHT_FILE_WRITE_DATA)) {
case SA_RIGHT_FILE_READ_DATA:
flags |= O_RDONLY;
break;
case SA_RIGHT_FILE_WRITE_DATA:
flags |= O_WRONLY;
break;
case SA_RIGHT_FILE_WRITE_DATA|SA_RIGHT_FILE_READ_DATA:
flags |= O_RDWR;
break;
}
/* handle creating a new file separately */
if (!name->exists) {