generic/484: Need another process to check record locks
authorXiao Yang <yangx.jy@cn.fujitsu.com>
Mon, 21 May 2018 05:42:00 +0000 (13:42 +0800)
committerEryu Guan <guaneryu@gmail.com>
Sat, 26 May 2018 08:59:16 +0000 (16:59 +0800)
According to fcntl(2) manpage, A single process always gets F_UNLCK
in the l_type field when using fcntl(F_GETLK) to acquire the
existing lock set by itself because it could convert the existing
lock to a new lock unconditionally.  So we need another process to
check if the lock exists.

Also remove redundant exit(0).

Signed-off-by: Xiao Yang <yangx.jy@cn.fujitsu.com>
Reviewed-by: Xiong Zhou <xzhou@redhat.com>
Signed-off-by: Eryu Guan <guaneryu@gmail.com>
src/t_locks_execve.c

index 9ad2dc370d543602ff376bc40f9da65a5ff58151..d99d7de70156e19bf48d381c3576960e1c2045bb 100644 (file)
@@ -8,6 +8,7 @@
 #include <errno.h>
 #include <pthread.h>
 #include <unistd.h>
+#include <sys/types.h>
 #include <sys/wait.h>
 
 static void err_exit(char *op, int errn)
@@ -32,12 +33,24 @@ struct flock fl = {
 
 static void checklock(int fd)
 {
-       if (fcntl(fd, F_GETLK, &fl) < 0)
-               err_exit("getlk", errno);
-       if (fl.l_type == F_UNLCK) {
-               printf("record lock is not preserved across execve(2)\n");
-               exit(1);
+       pid_t pid;
+
+       pid = fork();
+       if (pid < 0)
+               err_exit("fork", errno);
+
+       if (!pid) {
+               if (fcntl(fd, F_GETLK, &fl) < 0)
+                       err_exit("getlk", errno);
+               if (fl.l_type == F_UNLCK) {
+                       printf("record lock is not preserved across execve(2)\n");
+                       exit(1);
+               }
+               exit(0);
        }
+
+       waitpid(pid, NULL, 0);
+
        exit(0);
 }
 
@@ -52,7 +65,6 @@ int main(int argc, char **argv)
        if (argc == 3) {
                fd = atoi(argv[2]);
                checklock(fd);
-               exit(0);
        }
 
        fd = open(argv[1], O_WRONLY|O_CREAT, 0755);