it seems that on linux at least, if the device is left open, no other
process can open it? this achieves the same effect, without any code
at all.

allan

On 2/24/08, Julien BLACHE <jb at jblache.org> wrote:
> Hi,
>
>  The snapscan backend uses a mutex to lock the USB device it's working
>  with when sending "atomic" commands.
>
>  We're not talking about pthread mutexes here, which is one of the
>  available implementations, but IPC semaphores.
>
>  Let's look at the code:
>
>  static int snapscani_mutex_open(snapscan_mutex_t* sem_id, const char* dev)
>  {
>     *sem_id = semget( ftok(dev,0x12), 1, IPC_CREAT | 0660 );
>     if (*sem_id != -1)
>     {
>         semop(*sem_id, &sem_signal, 1);
>         return 1;
>     }
>     return 0;
>  }
>
>  ftok() requires its first argument to be a real, accessible
>  file. Obviously, when the code was written, USB scanners were driven
>  through the kernel scanner driver and this was not a problem.
>
>  But today, dev is something like "libusb:001:003" which is all but a
>  real, accessible file.
>
>  ftok() returns -1 in this case, but this isn't checked for in this
>  code, so it happily goes on and semget(0xffffffff, 1, ...).
>
>  As it happens, most of the time, that works. Except when another
>  similarly careless piece of code has already used 0xffffffff as the
>  IPC key.
>
>  In which case, all hell breaks loose.
>
>  So, 2 bugs in this code:
>   - ftok() return value is not checked (BAD BAD BAD)
>   - dev is not a real file
>
>  Now, two questions:
>   - is that locking really useful in the backend?
>   - if yes, how do we fix this?
>
>  I've started patching sanei_usb to add a method to return the full
>  path to the USB device node, except libusb doesn't expose this
>  information. Second-guessing is obviously not an option :|
>
>  And there is the UsbCalls access method that needs to be fixed if it
>  can be used along with IPC semaphores and I don't know anything about
>  UsbCalls...
>
>  Thoughts ?
>
>  JB.
>
>  --
>  Julien BLACHE                                   <http://www.jblache.org>
>  <jb at jblache.org>                                  GPG KeyID 0xF5D65169
>
>
>  --
>  sane-devel mailing list: sane-devel at lists.alioth.debian.org
>  http://lists.alioth.debian.org/mailman/listinfo/sane-devel
>  Unsubscribe: Send mail with subject "unsubscribe your_password"
>              to sane-devel-request at lists.alioth.debian.org
>


-- 
"The truth is an offense, but not a sin"

Reply via email to