nuttx-mirror/include
Gregory Nutt 50410cb1d5 Fix Deadloop in VFS if CONFIG_CANCELLATION_POINTS is enabled
If cancellation points are enabled, then the following logic is activated in sem_wait().  This causes ECANCELED to be returned every time that sem_wait is called.

    int sem_wait(FAR sem_t *sem)
    {
      ...

      /* sem_wait() is a cancellation point */

      if (enter_cancellation_point())
        {
    #ifdef CONFIG_CANCELLATION_POINTS
          /* If there is a pending cancellation, then do not perform
           * the wait.  Exit now with ECANCELED.
           */

          errcode = ECANCELED;
          goto errout_with_cancelpt;
    #endif
        }
      ...

Normally this works fine.  sem_wait() is the OS API called by the application and will cancel the thread just before it returns to the application.  Since it is cancellation point, it should never be called from within the OS.

There there is is one perverse cases where sem_wait() may be nested within another cancellation point.  If open() is called, it will attempt to lock a VFS data structure and will eventually call nxmutex_lock().  nxmutex_lock() waits on a semaphore:

   int nxmutex_lock(FAR mutex_t *mutex)
   {
     ...

     for (; ; )
       {
         /* Take the semaphore (perhaps waiting) */

         ret = _SEM_WAIT(&mutex->sem);
         if (ret >= 0)
           {
             mutex->holder = _SCHED_GETTID();
             break;
           }

         ret = _SEM_ERRVAL(ret);
         if (ret != -EINTR && ret != -ECANCELED)
           {
             break;
           }
       }
   ...
}

In the FLAT build, _SEM_WAIT expands to sem_wait().  That causes the error in the logic:  It should always expand to nxsem_wait().  That is because sem_wait() is cancellation point and should never be called from with the OS or the C library internally.

The failure occurs because the cancellation point logic in sem_wait() returns -ECANCELED (via _SEM_ERRVAL) because sem_wait() is nested; it needs to return the -ECANCELED error to the outermost cancellation point which is open() in this case.  Returning -ECANCELED then causes an infinite loop to occur in nxmutex_lock().

The correct behavior in this case is to call nxsem_wait() instead of sem_wait().  nxsem_wait() is identical to sem_wait() except that it is not a cancelation point.  It will return -ECANCELED if the thread is canceled, but only once.  So no infinite loop results.

In addition, an nxsem_wait() system call was added to support the call from nxmutex_lock().

This resolves Issue #9695
2023-07-07 15:34:43 +08:00
..
android libc/misc: add fdsan module 2023-05-17 10:24:42 +08:00
arpa Net thread-safe ntoa functions 2022-08-02 21:04:19 +08:00
crypto crypto:support crypto can handle streaming data 2023-01-17 01:19:38 +08:00
cxx libc: Implement quick_exit and at_quick_exit 2023-01-25 14:31:37 +02:00
net ethernet: add ETHERTYPE define 2023-05-04 19:38:57 +08:00
netinet Indent the define statement by two spaces 2023-05-21 09:52:08 -03:00
netpacket netlink: add RTM_NEWADDR, RTM_DELADDR and RTM_GETADDR 2023-04-22 01:35:18 +08:00
nuttx binfmt: Always include arch/elf.h in include/nuttx/elf.h 2023-06-25 19:02:53 -03:00
ssp add ssp.h 2022-01-29 01:04:23 +08:00
sys Fix Deadloop in VFS if CONFIG_CANCELLATION_POINTS is enabled 2023-07-07 15:34:43 +08:00
.gitignore Add Embedded Template Library (ETL) support 2022-08-05 09:38:48 +08:00
aio.h fs: Undefine CONFIG_FS_LARGEFILE if compiler doesn't support long long 2023-03-02 09:37:58 +01:00
alloca.h include: Author: Gregory Nutt: update licenses to Apache 2.0 2021-02-04 03:33:58 -08:00
assert.h assert: disable function/line print if DEBUG_ASSERTIONS_FILENAME disabled 2023-06-12 13:36:08 +08:00
byteswap.h byteswap.h: add byteswap.h header file 2021-08-20 07:47:07 -07:00
ctype.h libc: Implement local_t related functions 2021-07-30 09:43:26 -03:00
debug.h assert: disable function/line print if DEBUG_ASSERTIONS_FILENAME disabled 2023-06-12 13:36:08 +08:00
dirent.h fs: Undefine CONFIG_FS_LARGEFILE if compiler doesn't support long long 2023-03-02 09:37:58 +01:00
dlfcn.h include: Author: Gregory Nutt: update licenses to Apache 2.0 2021-02-04 03:33:58 -08:00
dsp.h libdsp: Add average filter 2023-06-12 08:39:38 +02:00
dspb16.h libdsp: port lib_observer.c to b16 2022-02-20 21:58:10 +08:00
elf.h elf: add elf define of Note Section 2021-11-23 20:34:56 +09:00
elf32.h elf: add elf define of Note Section 2021-11-23 20:34:56 +09:00
elf64.h elf: add elf define of Note Section 2021-11-23 20:34:56 +09:00
endian.h libc: Add sys/endian.h to improve the compatiblity with bionic libc 2023-01-15 12:26:15 -03:00
err.h include/err: Enforce c linkage for err and warn functions. 2023-05-01 12:48:55 +08:00
errno.h Update errno to match asm-generic 2022-10-28 02:19:26 +08:00
execinfo.h Indent the define statement by two spaces 2023-05-21 09:52:08 -03:00
fcntl.h include: Fix nxstyle errors 2023-05-04 02:07:01 +08:00
fixedmath.h include: Author: Gregory Nutt: update licenses to Apache 2.0 2021-02-04 03:33:58 -08:00
fnmatch.h libc: Rename match to fnmatch 2021-08-02 08:23:35 -03:00
ftw.h fs: Undefine CONFIG_FS_LARGEFILE if compiler doesn't support long long 2023-03-02 09:37:58 +01:00
getopt.h Implement getopt_long() and getopt_long_only() 2021-04-01 23:06:23 -05:00
glob.h libc/misc: add lib_glob. 2021-09-25 07:54:39 -03:00
grp.h libs/libc: License Clearance 2021-03-02 03:44:06 -08:00
hex2bin.h libc/hex2bin: Remove the unused declaration 2022-12-05 10:42:22 +01:00
iconv.h libc/locale: support iconv_open,iconv,iconv_close 2023-04-25 19:12:53 +01:00
ifaddrs.h net: Implement getifaddrs and freeifaddrs 2021-12-21 11:01:33 -03:00
inttypes.h fs: Undefine CONFIG_FS_LARGEFILE if compiler doesn't support long long 2023-03-02 09:37:58 +01:00
iso646.h include: Add iso646.h for alternative spellings 2021-03-04 18:32:12 -08:00
langinfo.h libc: Add the empty nl_langinfo implementation 2021-07-31 15:35:47 -03:00
libgen.h include: Author: Gregory Nutt: update licenses to Apache 2.0 2021-02-04 03:33:58 -08:00
libintl.h compiler.h: Add _ between format|printf|syslog|scanf|strftime and like 2022-12-21 01:05:19 +02:00
limits.h Indent the define statement by two spaces 2023-05-21 09:52:08 -03:00
locale.h libc: Reorder LC_XXX as Linux 2021-07-31 15:35:47 -03:00
lzf.h Indent the define statement by two spaces 2023-05-21 09:52:08 -03:00
malloc.h mm: Rename PID_MM_INVALID to PID_MM_LEAK 2023-06-18 14:26:07 +03:00
mqueue.h include: Fix nxstyle errors 2023-05-04 02:07:01 +08:00
netdb.h libc/netdb: add proto.c 2022-12-10 02:36:24 +08:00
nl_types.h libc: Support message catalog function 2021-08-02 08:24:59 -03:00
nxflat.h include: Author: Gregory Nutt: update licenses to Apache 2.0 2021-02-04 03:33:58 -08:00
obstack.h compiler.h: Add _ between format|printf|syslog|scanf|strftime and like 2022-12-21 01:05:19 +02:00
poll.h sched: Add include/sys/poll.h 2021-01-06 14:23:50 +08:00
pthread.h sched/tls: remove PTHREAD_CLEANUP from Kconfig 2023-06-14 12:00:48 +08:00
pty.h drivers/serial: Always support c_oflag, c_iflag and c_lflag in termios 2023-03-19 14:54:59 -06:00
pwd.h Indent the define statement by two spaces 2023-05-21 09:52:08 -03:00
regex.h include/regex.h: add missing FAR 2023-05-19 02:40:38 +08:00
resolv.h Add dn resolution function 2022-03-17 09:37:15 +02:00
sched.h include: Fix nxstyle errors 2023-05-04 02:07:01 +08:00
semaphore.h semaphore: Optimize priority inheritance with only one holder 2023-06-17 08:26:46 +03:00
signal.h include: Fix nxstyle errors 2023-05-04 02:07:01 +08:00
spawn.h sched/spawn: Rename task_spawnattr_[get|set]stack[size|addr] to posix_spawnattr_[get|set]stack[size|addr] 2022-11-01 09:51:18 +09:00
stdbool.h libc: Remove C99_BOOL8 from libs/libxx/Kconfig 2022-05-05 16:23:32 -03:00
stddef.h stddef: Let offset be defined from toolchain 2021-08-27 08:55:45 -07:00
stdint.h include/stdint.h: add sig_atomic_t limits 2022-10-02 22:30:54 +08:00
stdio.h Support gcc FORTIFY_SOURCE features for nuttx libc 2023-06-22 20:38:45 +08:00
stdlib.h Support gcc FORTIFY_SOURCE features for nuttx libc 2023-06-22 20:38:45 +08:00
stdnoreturn.h include: Author: Gregory Nutt: update licenses to Apache 2.0 2021-02-04 03:33:58 -08:00
string.h Support gcc FORTIFY_SOURCE features for nuttx libc 2023-06-22 20:38:45 +08:00
strings.h Support gcc FORTIFY_SOURCE features for nuttx libc 2023-06-22 20:38:45 +08:00
syscall.h syscall: export UP_WRAPSYM/UP_REALSYM macro 2022-12-30 22:13:34 +08:00
syslog.h syslog: add syslog option definition 2023-05-05 18:36:36 +08:00
termios.h libc: Implement terminal api regardless of CONFIG_SERIAL_TERMIOS setting 2021-12-29 08:11:08 -03:00
threads.h sched/getpid: replace syscall getpid/tid/ppid() to kernel version 2023-02-02 10:33:01 +08:00
time.h Indent the define statement by two spaces 2023-05-21 09:52:08 -03:00
unistd.h libs/libc/unistd: add getpgrp function 2023-06-26 01:03:36 +08:00
utime.h libc: Implement utime on top of utimes 2021-07-09 15:51:28 -03:00
uuid.h libc: Add uuid implemenation 2020-07-21 21:48:18 -07:00
wchar.h Support gcc FORTIFY_SOURCE features for nuttx libc 2023-06-22 20:38:45 +08:00
wctype.h libc: Remove the unnecessary include from wchar and wctype 2022-07-27 10:55:37 +03:00