Package: cowbuilder
Version: 0.57
Severity: normal

I noticed a quite bad behavior when building multiple packages at the same 
time. The problem seems to be /var/cache/debconf/config.dat. Multiple packages 
want to install x11-common which uses these file over debconf. This means that 
this file gets locked (i would guess using flock). As this file is a hardlink 
all other files (which are only hardlinks) will be locked too and the install 
fails. This means that the whole build fails due to the usage of cowbuilder. 
This means that cowdancer must also copy files on flock and not only on 
writes.

I think that it has the same problems as fchmod because we are doing it at 
file table level. Maybe a workaround for known debian specific locked files 
can be added before adding cowdancer overrides.

Just added a warning stub.
diff --git a/cowdancer.c b/cowdancer.c
index 3593ced..b79cc8e 100644
--- a/cowdancer.c
+++ b/cowdancer.c
@@ -35,6 +35,7 @@ static int (*origlibc_fchown)(int fd, uid_t, gid_t) = NULL;
 static int (*origlibc_lchown)(const char *, uid_t, gid_t) = NULL;
 static int (*origlibc_chmod)(const char *, mode_t) = NULL;
 static int (*origlibc_fchmod)(int fd, mode_t) = NULL;
+static int (*origlibc_flock)(int fd, int) = NULL;
 
 static struct ilist_struct* ilist=NULL;
 static long ilist_len=0;
@@ -200,6 +201,7 @@ static int initialize_functions ()
       origlibc_lchown = dlsym(RTLD_NEXT, "lchown");
       origlibc_chmod = dlsym(RTLD_NEXT, "chmod");
       origlibc_fchmod = dlsym(RTLD_NEXT, "fchmod");
+      origlibc_flock = dlsym(RTLD_NEXT, "flock");
 
       if (getenv("COWDANCER_DEBUG"))
 	{
@@ -606,13 +608,13 @@ int check_fd_inode_and_warn(int fd)
      S_ISREG(buf.st_mode))
     {
       /* Someone opened file read-only, and called
-	 fchown/fchmod; I don't really know how to do
+	 fchown/fchmod/flock; I don't really know how to do
 	 salvation in that case, since the original filename is
 	 probably not available, and file is already open.
 
 	 If there is any better way, I'd like to know.
        */
-      fprintf(stderr, "W: cowdancer: unsupported operation, read-only open and fchown/fchmod: %li:%li\n",
+      fprintf(stderr, "W: cowdancer: unsupported operation, read-only open and fchown/fchmod/flock: %li:%li\n",
 	      (long)buf.st_dev, (long)buf.st_ino);
       /* emit a warning and do not fail,
 	 if you want to make it fail, add a return 1;
@@ -708,3 +710,25 @@ int fchmod(int fd, mode_t mode)
   ret = origlibc_fchmod(fd, mode);
   return ret;
 }
+
+#undef flock
+int flock(int fd, int operation)
+{
+  int ret;
+  if(initialize_functions())
+    {
+      errno=ENOMEM;
+      return -1;
+    }
+  if(!getenv("COWDANCER_IGNORE"))
+    {
+      debug_cowdancer ("flock");
+      if (check_fd_inode_and_warn(fd))
+	{
+	  errno=ENOMEM;
+	  return -1;
+	}
+    }
+  ret = origlibc_flock(fd, operation);
+  return ret;
+}

Reply via email to