On Tue, Jun 19, 2007 at 12:58:06PM +0200, Matthias Koenig wrote:
> Hi, 
> 
> in addition to the race described recently 
> (http://article.gmane.org/gmane.linux.utilities.util-linux-ng/241), 
> there is also a race if you have concurring processes running 
> mount -o loop. Patch below.

 Good idea! We can also add the same logic to the losetup.c:main().

 A few suggestions:

> --- util-linux-devel.orig/mount/lomount.c
> +++ util-linux-devel/mount/lomount.c
> @@ -341,8 +341,15 @@ set_loop(const char *device, const char 
>       }
>  
>       if (ioctl(fd, LOOP_SET_FD, ffd) < 0) {
> -             perror("ioctl: LOOP_SET_FD");
> -             return 1;
> +             switch (errno) {
> +             case EBUSY:
> +                     if (verbose)
> +                             perror("ioctl: LOOP_SET_FD");
                close (ffd);

> +                     return 2;
> +             default:
> +                     perror("ioctl: LOOP_SET_FD");
                close (ffd);

> +                     return 1;
> +             }
>       }
>       close (ffd);


> --- util-linux-devel.orig/mount/mount.c
> +++ util-linux-devel/mount/mount.c
> @@ -846,20 +846,34 @@ loop_check(const char **spec, const char


> +        if (!*loopdev || !**loopdev)
> +       *loopdev = find_unused_loop_device();
> +     if (!*loopdev)
> +       return EX_SYSERR;     /* no more loop devices */
>       if (verbose)
> -       printf(_("mount: failed setting up loop device\n"));
> -     return EX_FAIL;
> -      }
> +       printf(_("mount: going to use the loop device %s\n"), *loopdev);
> +        offset = opt_offset ? strtoull(opt_offset, NULL, 0) : 0;
> +     if (res = set_loop (*loopdev, *loopfile, offset,
> +                         opt_encryption, pfd, &loopro)) {
> +       switch(res) {
> +       case 2:
> +               /* loop dev has been grabbed by some other process,
> +                  try again */
> +               if (verbose)
> +                 printf("mount: stolen loop=%s ...trying again\n", *loopdev);
> +               *loopdev = NULL;
              ^^^^^^^^^^^^^^
  memory leak?

    free(*loopdev);
    *loopdev = NULL;

> +               continue;
              ^^^^^^^^

 Please, don't use the find_unused_loop_device() if user explicitly
 define a device.

   if (!opt_loop) {
       if (verbose)
           printf("mount: stolen loop=%s ...trying again\n", *loopdev);
       continue;
   }
   return EX_FAIL;

 Because:

     mount foo.img /foo -o loop=/dev/loop0


        Karel

-- 
 Karel Zak  <[EMAIL PROTECTED]>
-
To unsubscribe from this list: send the line "unsubscribe util-linux-ng" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to