id,summary,reporter,owner,description,type,status,priority,milestone,component,version,resolution,keywords,cc,os,architecture,failure,difficulty,testcase,blockedby,blocking,related
5254,usb library fails on Windows,basvandijk,simonmar,"I'm trying to get my Haskell `usb` library to work on Windows. I currently get a weird error. Please follow the steps below to reproduce the error:

 * Download [http://www.libusb.org/wiki/windows_backend#LatestBinarySnapshots libusb for Windows] and extract it somewhere e.g. `C:\Program Files\libusb\libusb1`.

 (Important build-time files: `libusb-1.0\include\libusb.h` and `MinGW32\dll\libusb-1.0.dll.a`)

 (Important run-time files: `MinGW32\dll\libusb-1.0.dll`)

 * Download, unpack and cabal install the, as of yet unreleased,  [https://bitbucket.org/mauricio/bindings-dsl/get/1.0.12.tar.gz bindings-DSL-1.0.12]
 (This version lets you use the right calling convention on Windows (`stdcall` instead of `ccall`) by configuring cabal with 
 `cc-options: -DBINDINGS_STDCALLCONV`)

 * Install `bindings-libusb`:
{{{
git clone git://github.com/basvandijk/bindings-libusb.git
cd bindings-libusb
}}}

 Make sure to checkout the `windows` branch and let cabal know where to find `libusb`:
{{{
git checkout windows
cabal install --extra-include-dirs=""C:\Program Files\libusb\libusb1\include\libusb-1.0"" 
              --extra-lib-dirs=""C:\Program Files\libusb\libusb1\MinGW32\dll""
}}}

 * Clone the `usb` repository:
{{{
git clone git://github.com/basvandijk/usb.git
cd usb
}}}
 There's no need to install the library. I included an example program that will demonstrate the error:
{{{
cabal configure --flags=""example -library""
cabal build
}}}

The example should read some bytes of an attached USB mouse (change the VID and PID to match your mouse). However it gives two errors:

{{{
dist\build\example\example.exe
example.exe: NotFoundException
Segmentation fault/access violation in generated code
}}}

This bug report is about the segmentation fault.

The `NotFoundException` is thrown by `c'libusb_get_config_descriptor`
which is indirectly called by `getDevices`. According to the 
[http://libusb.sourceforge.net/api-1.0/group__desc.html#gaa635d9aec77de4895dd0896ccf001532 libusb docs] 
this error is thrown when the specified configuration doesn't
exists. Since I only call this function on existing configurations
this seems like a bug in libusb. I will dive in the libusb source code to see what is going on.

The `Segmentation fault/access violation in generated code` is caused
by the finalizer in `newCtx`:

{{{
newCtx ∷ IO Ctx
newCtx = newCtxNoEventManager Ctx

libusb_init ∷ IO (Ptr C'libusb_context)
libusb_init = alloca $ \ctxPtrPtr → do
               handleUSBException $ c'libusb_init ctxPtrPtr
               peek ctxPtrPtr

newCtxNoEventManager ∷ (ForeignPtr  C'libusb_context → Ctx) → IO Ctx
newCtxNoEventManager ctx = mask_ $ do
                            ctxPtr ← libusb_init
                            ctx <$> newForeignPtr p'libusb_exit ctxPtr
}}}

When `p'libusb_exit` is called the segmentation fault occurs.

'''Note that the error disappears when I change that last line with:

`ctx <$> Foreign.Concurrent.newForeignPtr ctxPtr (c'libusb_exit ctxPtr)`'''

I previously got the exact same segmentation fault when calling other `bindings-libusb` functions. This was caused by using the wrong calling convention on Windows. I used `ccall` but had to use `stdcall`. So I assume the current segmentation fault has something to do with the calling convention of `FunPtrs`.

Any ideas what is causing this? I would really like to solve it. It's the last step before releasing `usb-1.0`.

Thanks!",bug,closed,high,7.6.1,Compiler (FFI),7.0.3,fixed,,Joris Putcuyps <joris.putcuyps@…> John Obbele <john.obbele@…> Maurício Antunes <mauricio.antunes@…>,Windows,Unknown/Multiple,Runtime crash,Unknown,,,,
