fs/mmap: Return EACCES for incompatible file descriptors
This commit is contained in:
parent
fb7a5b86ca
commit
c80cdf06c2
@ -29,6 +29,7 @@
|
|||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
|
|
||||||
#include <nuttx/kmalloc.h>
|
#include <nuttx/kmalloc.h>
|
||||||
@ -95,6 +96,10 @@
|
|||||||
* On success, mmap() returns a pointer to the mapped area. On error, the
|
* On success, mmap() returns a pointer to the mapped area. On error, the
|
||||||
* value MAP_FAILED is returned, and errno is set appropriately.
|
* value MAP_FAILED is returned, and errno is set appropriately.
|
||||||
*
|
*
|
||||||
|
* EACCES
|
||||||
|
* The fd argument is not open for read, regardless of the
|
||||||
|
* protection specified, or fd is not open for write and PROT_WRITE
|
||||||
|
* was specified for a MAP_SHARED type mapping.
|
||||||
* ENOSYS
|
* ENOSYS
|
||||||
* Returned if any of the unsupported mmap() features are attempted
|
* Returned if any of the unsupported mmap() features are attempted
|
||||||
* EBADF
|
* EBADF
|
||||||
@ -114,6 +119,7 @@ FAR void *mmap(FAR void *start, size_t length, int prot, int flags,
|
|||||||
int fd, off_t offset)
|
int fd, off_t offset)
|
||||||
{
|
{
|
||||||
FAR void *addr;
|
FAR void *addr;
|
||||||
|
FAR struct file *filep;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
/* Since only a tiny subset of mmap() functionality, we have to verify many
|
/* Since only a tiny subset of mmap() functionality, we have to verify many
|
||||||
@ -154,6 +160,30 @@ FAR void *mmap(FAR void *start, size_t length, int prot, int flags,
|
|||||||
}
|
}
|
||||||
#endif /* CONFIG_DEBUG_FEATURES */
|
#endif /* CONFIG_DEBUG_FEATURES */
|
||||||
|
|
||||||
|
if (fs_getfilep(fd, &filep) < 0)
|
||||||
|
{
|
||||||
|
ferr("ERROR: Invalid file descriptor, fd=%d\n", fd);
|
||||||
|
ret = -EBADF;
|
||||||
|
goto errout;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((filep->f_oflags & O_WROK) == 0 && prot == PROT_WRITE &&
|
||||||
|
(flags & MAP_SHARED) != 0)
|
||||||
|
{
|
||||||
|
ferr("ERROR: Unsupported options for read-only file descriptor,"
|
||||||
|
"fd=%d prot=%x flags=%04x\n", fd, prot, flags);
|
||||||
|
ret = -EACCES;
|
||||||
|
goto errout;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((filep->f_oflags & O_RDOK) == 0)
|
||||||
|
{
|
||||||
|
ferr("ERROR: File descriptor does not have read permission,"
|
||||||
|
"fd=%d\n", fd);
|
||||||
|
ret = -EACCES;
|
||||||
|
goto errout;
|
||||||
|
}
|
||||||
|
|
||||||
/* Check if we are just be asked to allocate memory, i.e., MAP_ANONYMOUS
|
/* Check if we are just be asked to allocate memory, i.e., MAP_ANONYMOUS
|
||||||
* set meaning that the memory is not backed up from a file. The file
|
* set meaning that the memory is not backed up from a file. The file
|
||||||
* descriptor should be -1 (or refer to opened /dev/zero) in this case.
|
* descriptor should be -1 (or refer to opened /dev/zero) in this case.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user