Skip to content

GitLab

  • Projects
  • Groups
  • Snippets
  • Help
    • Loading...
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
  • Sign in / Register
GHC
GHC
  • Project overview
    • Project overview
    • Details
    • Activity
    • Releases
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
    • Locked Files
  • Issues 4,253
    • Issues 4,253
    • List
    • Boards
    • Labels
    • Service Desk
    • Milestones
    • Iterations
  • Merge Requests 394
    • Merge Requests 394
  • Requirements
    • Requirements
    • List
  • CI / CD
    • CI / CD
    • Pipelines
    • Jobs
    • Schedules
  • Security & Compliance
    • Security & Compliance
    • Dependency List
    • License Compliance
  • Operations
    • Operations
    • Incidents
    • Environments
  • Analytics
    • Analytics
    • CI / CD
    • Code Review
    • Insights
    • Issue
    • Repository
    • Value Stream
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Members
    • Members
  • Collapse sidebar
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
  • Glasgow Haskell Compiler
  • GHCGHC
  • Issues
  • #5254

Closed
Open
Opened Jun 11, 2011 by basvandijk@trac-basvandijk

usb library fails on Windows

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 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, 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 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!

Trac metadata
Trac field Value
Version 7.0.3
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Compiler (FFI)
Test case
Differential revisions
BlockedBy
Related
Blocking
CC John Obbele john.obbele@gmail.com, Joris Putcuyps joris.putcuyps@gmail.com, Maurício Antunes mauricio.antunes@gmail.com
Operating system
Architecture
Assignee
Assign to
7.6.1
Milestone
7.6.1
Assign milestone
Time tracking
None
Due date
None
Reference: ghc/ghc#5254