From b1899ffbfd7fbb7d3a2da64ff0f8774e26c51d81 Mon Sep 17 00:00:00 2001 From: Xiang Xiao Date: Sun, 15 Jan 2023 00:57:09 +0800 Subject: [PATCH] fs: Support O_NOFOLLOW flag https://pubs.opengroup.org/onlinepubs/9699919799.2013edition/functions/open.html: O_NOFOLLOW If path names a symbolic link, fail and set errno to [ELOOP]. Signed-off-by: Xiang Xiao --- fs/vfs/fs_open.c | 7 ++++++- include/fcntl.h | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/fs/vfs/fs_open.c b/fs/vfs/fs_open.c index 5f55462d97..014eed9b75 100644 --- a/fs/vfs/fs_open.c +++ b/fs/vfs/fs_open.c @@ -99,7 +99,7 @@ static int file_vopen(FAR struct file *filep, FAR const char *path, /* Get an inode for this file */ - SETUP_SEARCH(&desc, path, false); + SETUP_SEARCH(&desc, path, (oflags & O_NOFOLLOW) != 0); ret = inode_find(&desc); if (ret < 0) @@ -117,6 +117,11 @@ static int file_vopen(FAR struct file *filep, FAR const char *path, inode = desc.node; DEBUGASSERT(inode != NULL); + if (desc.nofollow && INODE_IS_SOFTLINK(inode)) + { + return -ELOOP; + } + #if defined(CONFIG_BCH) && \ !defined(CONFIG_DISABLE_MOUNTPOINT) && \ !defined(CONFIG_DISABLE_PSEUDOFS_OPERATIONS) diff --git a/include/fcntl.h b/include/fcntl.h index b6381d0cc9..1557c02fa4 100644 --- a/include/fcntl.h +++ b/include/fcntl.h @@ -53,6 +53,7 @@ #define O_DIRECT (1 << 9) /* Avoid caching, write directly to hardware */ #define O_CLOEXEC (1 << 10) /* Close on execute */ #define O_DIRECTORY (1 << 11) /* Must be a directory */ +#define O_NOFOLLOW (1 << 12) /* Don't follow links */ /* Unsupported, but required open flags */