sched/task: close file descriptor with O_CLOEXEC before active task or exec
VELAPLATFO-18473 refs: https://man7.org/linux/man-pages/man2/fcntl.2.html If the FD_CLOEXEC bit is set, the file descriptor will automatically be closed during a successful execve(2). (If the execve(2) fails, the file descriptor is left open.) modify: 1. Ensure that the child task copies all fds of the parent task, including those with O_CLOEXE. 2. Make sure spawn_file_action is executed under fd with O_CLOEXEC, otherwise it will fail. 3. When a new task is activated or exec is called, close all fds with O_CLOEXEC flags. Signed-off-by: dongjiuzhu1 <dongjiuzhu1@xiaomi.com>
This commit is contained in:
parent
73dc8f84cc
commit
18819b6b24
@ -34,6 +34,7 @@
|
|||||||
|
|
||||||
#include <nuttx/addrenv.h>
|
#include <nuttx/addrenv.h>
|
||||||
#include <nuttx/arch.h>
|
#include <nuttx/arch.h>
|
||||||
|
#include <nuttx/fs/fs.h>
|
||||||
#include <nuttx/kmalloc.h>
|
#include <nuttx/kmalloc.h>
|
||||||
#include <nuttx/sched.h>
|
#include <nuttx/sched.h>
|
||||||
#include <sched/sched.h>
|
#include <sched/sched.h>
|
||||||
@ -375,6 +376,10 @@ int exec_module(FAR struct binary_s *binp,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Close the file descriptors with O_CLOEXEC before active task */
|
||||||
|
|
||||||
|
files_close_onexec(&tcb->cmn);
|
||||||
|
|
||||||
if (!spawn)
|
if (!spawn)
|
||||||
{
|
{
|
||||||
exec_swap(this_task(), (FAR struct tcb_s *)tcb);
|
exec_swap(this_task(), (FAR struct tcb_s *)tcb);
|
||||||
|
@ -462,8 +462,7 @@ int files_duplist(FAR struct filelist *plist, FAR struct filelist *clist)
|
|||||||
|
|
||||||
filep = &plist->fl_files[i][j];
|
filep = &plist->fl_files[i][j];
|
||||||
|
|
||||||
if (filep && (filep->f_inode == NULL ||
|
if (filep && filep->f_inode == NULL)
|
||||||
(filep->f_oflags & O_CLOEXEC) != 0))
|
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -474,9 +473,10 @@ int files_duplist(FAR struct filelist *plist, FAR struct filelist *clist)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Yes... duplicate it for the child */
|
/* Yes... duplicate it for the child, include O_CLOEXEC flag. */
|
||||||
|
|
||||||
ret = file_dup2(filep, &clist->fl_files[i][j]);
|
ret = file_dup3(filep, &clist->fl_files[i][j],
|
||||||
|
filep->f_oflags & O_CLOEXEC ? O_CLOEXEC : 0);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
goto out;
|
goto out;
|
||||||
@ -489,6 +489,44 @@ out:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: files_close_onexec
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Close specified task's file descriptors with O_CLOEXEC before exec.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void files_close_onexec(FAR struct tcb_s *tcb)
|
||||||
|
{
|
||||||
|
FAR struct filelist *list;
|
||||||
|
int i;
|
||||||
|
int j;
|
||||||
|
|
||||||
|
/* Get the file descriptor list. It should not be NULL in this context. */
|
||||||
|
|
||||||
|
list = nxsched_get_files_from_tcb(tcb);
|
||||||
|
DEBUGASSERT(list != NULL);
|
||||||
|
|
||||||
|
nxmutex_lock(&list->fl_lock);
|
||||||
|
for (i = 0; i < list->fl_rows; i++)
|
||||||
|
{
|
||||||
|
for (j = 0; j < CONFIG_NFILE_DESCRIPTORS_PER_BLOCK; j++)
|
||||||
|
{
|
||||||
|
FAR struct file *filep;
|
||||||
|
|
||||||
|
filep = &list->fl_files[i][j];
|
||||||
|
if (filep && filep->f_inode != NULL &&
|
||||||
|
(filep->f_oflags & O_CLOEXEC) != 0)
|
||||||
|
{
|
||||||
|
file_close(filep);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
nxmutex_unlock(&list->fl_lock);
|
||||||
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: fs_getfilep
|
* Name: fs_getfilep
|
||||||
*
|
*
|
||||||
|
@ -865,6 +865,16 @@ void files_releaselist(FAR struct filelist *list);
|
|||||||
|
|
||||||
int files_duplist(FAR struct filelist *plist, FAR struct filelist *clist);
|
int files_duplist(FAR struct filelist *plist, FAR struct filelist *clist);
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: files_close_onexec
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Close specified task's file descriptors with O_CLOEXEC before exec.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void files_close_onexec(FAR struct tcb_s *tcb);
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: file_allocate_from_tcb
|
* Name: file_allocate_from_tcb
|
||||||
*
|
*
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
#include <nuttx/kmalloc.h>
|
#include <nuttx/kmalloc.h>
|
||||||
#include <nuttx/sched.h>
|
#include <nuttx/sched.h>
|
||||||
#include <nuttx/kthread.h>
|
#include <nuttx/kthread.h>
|
||||||
|
#include <nuttx/fs/fs.h>
|
||||||
|
|
||||||
#include "sched/sched.h"
|
#include "sched/sched.h"
|
||||||
#include "group/group.h"
|
#include "group/group.h"
|
||||||
@ -102,6 +103,10 @@ int nxthread_create(FAR const char *name, uint8_t ttype, int priority,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Close the file descriptors with O_CLOEXEC before active task */
|
||||||
|
|
||||||
|
files_close_onexec(&tcb->cmn);
|
||||||
|
|
||||||
/* Get the assigned pid before we start the task */
|
/* Get the assigned pid before we start the task */
|
||||||
|
|
||||||
pid = tcb->cmn.pid;
|
pid = tcb->cmn.pid;
|
||||||
|
@ -31,6 +31,7 @@
|
|||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include <nuttx/fs/fs.h>
|
||||||
#include <nuttx/sched.h>
|
#include <nuttx/sched.h>
|
||||||
#include <nuttx/kthread.h>
|
#include <nuttx/kthread.h>
|
||||||
#include <nuttx/spawn.h>
|
#include <nuttx/spawn.h>
|
||||||
@ -125,6 +126,10 @@ static int nxtask_spawn_create(FAR const char *name, int priority,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Close the file descriptors with O_CLOEXEC before active task */
|
||||||
|
|
||||||
|
files_close_onexec(&tcb->cmn);
|
||||||
|
|
||||||
/* Set the attributes */
|
/* Set the attributes */
|
||||||
|
|
||||||
if (attr)
|
if (attr)
|
||||||
|
Loading…
Reference in New Issue
Block a user