POSIX requires certain interfaces to include cancellation points, permits 
it for others, and the rest of the POSIX interfaces are banned from being 
cancellation points.

Our shm_open(), sysconf(), tcflow(), and tcsendbreak() are in the third 
group and therefore shouldn't be cancellation points.  However they are 
built on sycalls whose public versions are cancellation points: open, 
close, write, and nanosleep.  So, they need to invoke the underlying, 
non-cancellation point versions of those functions.

ok?

Philip


Index: gen/shm_open.c
===================================================================
RCS file: /data/src/openbsd/src/lib/libc/gen/shm_open.c,v
retrieving revision 1.8
diff -u -p -r1.8 shm_open.c
--- gen/shm_open.c      10 Dec 2015 13:03:22 -0000      1.8
+++ gen/shm_open.c      5 Sep 2017 04:57:35 -0000
@@ -61,16 +61,16 @@ shm_open(const char *path, int flags, mo
 
        makeshmpath(path, shmpath, sizeof(shmpath));
 
-       fd = open(shmpath, flags, mode);
+       fd = HIDDEN(open)(shmpath, flags, mode);
        if (fd == -1)
                return -1;
        if (fstat(fd, &sb) == -1 || !S_ISREG(sb.st_mode)) {
-               close(fd);
+               HIDDEN(close)(fd);
                errno = EINVAL;
                return -1;
        }
        if (sb.st_uid != geteuid()) {
-               close(fd);
+               HIDDEN(close)(fd);
                errno = EPERM;
                return -1;
        }
Index: gen/sysconf.c
===================================================================
RCS file: /data/src/openbsd/src/lib/libc/gen/sysconf.c,v
retrieving revision 1.24
diff -u -p -r1.24 sysconf.c
--- gen/sysconf.c       20 Mar 2016 02:32:40 -0000      1.24
+++ gen/sysconf.c       30 Aug 2017 05:35:33 -0000
@@ -241,7 +241,7 @@ sysconf(int name)
                value = socket(PF_INET6, SOCK_DGRAM, 0);
                errno = sverrno;
                if (value >= 0) {
-                       close(value);
+                       HIDDEN(close)(value);
                        return (200112L);
                } else
                        return (0);
Index: termios/tcflow.c
===================================================================
RCS file: /data/src/openbsd/src/lib/libc/termios/tcflow.c,v
retrieving revision 1.5
diff -u -p -r1.5 tcflow.c
--- termios/tcflow.c    5 Aug 2005 13:03:00 -0000       1.5
+++ termios/tcflow.c    5 Sep 2017 05:00:43 -0000
@@ -49,7 +49,8 @@ tcflow(int fd, int action)
                if (tcgetattr(fd, &term) == -1)
                        return (-1);
                c = term.c_cc[action == TCIOFF ? VSTOP : VSTART];
-               if (c != _POSIX_VDISABLE && write(fd, &c, sizeof(c)) == -1)
+               if (c != _POSIX_VDISABLE &&
+                   HIDDEN(write)(fd, &c, sizeof(c)) == -1)
                        return (-1);
                return (0);
        default:
Index: termios/tcsendbreak.c
===================================================================
RCS file: /data/src/openbsd/src/lib/libc/termios/tcsendbreak.c,v
retrieving revision 1.9
diff -u -p -r1.9 tcsendbreak.c
--- termios/tcsendbreak.c       1 Nov 2015 03:45:29 -0000       1.9
+++ termios/tcsendbreak.c       5 Sep 2017 05:01:01 -0000
@@ -42,7 +42,7 @@ tcsendbreak(int fd, int len)
 
        if (ioctl(fd, TIOCSBRK, 0) == -1)
                return (-1);
-       (void)nanosleep(&sleepytime, NULL);
+       HIDDEN(nanosleep)(&sleepytime, NULL);
        if (ioctl(fd, TIOCCBRK, 0) == -1)
                return (-1);
        return (0);

Reply via email to