[Nut-upsdev] libusb_get_string: invalid argument (other usbhid-ups users, please test)

Greg Hersch hersch.greg at gmail.com
Fri Jun 12 19:52:56 UTC 2015


By the way, in nut-driver.service - i had to comment out StopWhenUnneeded=yes

for some reason systemd would end it each time - no matter if the server was 
loaded beforehand or not. once i did that it was fine



On Fri, 12 Jun 2015, Greg Hersch wrote:

> thanks - this has been fun.
>
> There is one other thing I have been having trouble with - and i've tried it 
> on two archlinuxarm installs and gotten the same thing. i am not even sure if 
> its important for me. but if i try to configure and make with neon support - 
> it cant find the neon libraries. despite neon having been installed several 
> different ways (i tried pacman, as well as compiling and installign neon from 
> source)
>
> i only came across this because when i originally tried installing nut, i 
> tried doing it from the archlinux AUR. There, neon is enabled by default. and 
> i couldnt get it to build. so i ended up going to the source.
>
> Greg
>
>
> On Fri, 12 Jun 2015, Charles Lepple wrote:
>
>>  Greg,
>>
>>  I think I fixed it. Thanks for your patience.
>>
>>  https://github.com/networkupstools/nut/pull/213
>>
>>  Diffs:
>>  https://github.com/networkupstools/nut/compare/usbhid_ups_input_vs_feature
>>
>>  If anyone else can test usbhid-ups against their hardware before I merge
>>  this to master, I would appreciate it. I tried my MGE UPS on a Linux box
>>  as well, and it does not get interrupt events there, either.
>>
>>  - Charles Lepple
>>
>>  On Jun 11, 2015, at 9:13 AM, Charles Lepple <clepple at gmail.com> wrote:
>> 
>> >  Greg,
>> > 
>> >  I'm still not 100% on what is going on, but after comparing the call 
>> >  stack with a debug session here, I think I have at least identified why 
>> >  I wasn't seeing similar behavior.
>> > 
>> >  There are two ways that the driver can get information from the UPS: 
>> >  asking the UPS for a specific report (which returns one or more values), 
>> >  and checking the interrupt pipe (which the UPS can fill with whatever 
>> >  has changed). With the interrupt pipe results, the driver has to do an 
>> >  additional HID table lookup to determine exactly what is being returned.
>> > 
>> >  It looks like the driver is processing the latter case when it throws 
>> >  that error. I wasn't seeing that here, apparently because my MGE UPS on 
>> >  FreeBSD is never getting anything via the interrupt pipe. (The driver 
>> >  falls back to the polling method.)
>> > 
>> >  I might have some time later to reconnect that UPS to a Linux system and 
>> >  see if the error crops up there. However, I have a suspicion that the 
>> >  bug is triggered because the first entry in the Tripp Lite table has a 
>> >  conversion function, and when the table lookup fails (your UPS does not 
>> >  have the HID item corresponding to a manufacturer's part number), the 
>> >  lookup function incorrectly returns that first table entry by default.
>> > 
>> >  - Charles
>> > 
>> >  On Jun 10, 2015, at 12:18 PM, Greg Hersch <hersch.greg at gmail.com> wrote:
>> > 
>> > > 
>> > >  And here are the logs and GDB output from the reconfigured/recompiled 
>> > >  CFLAGS=-G program. You will notice i made a change to the version 
>> > >  definition of tripplite-hid.c just to make sure i am working with the 
>> > >  updated version.
>> > > 
>> > >  On Tue, 9 Jun 2015, Charles Lepple wrote:
>> > > 
>> > > >  On Jun 9, 2015, at 4:55 PM, Greg Hersch wrote:
>> > > > 
>> > > > >  (gdb) bt
>> > > > >  #0  libusb_get_string (udev=0x43110, StringIdx=0, buf=0x40204 
>> > > > >  <buf>
>> > > > >  "", buflen=20) at libusb.c:496
>> > > > >  #1  0x00015330 in HIDGetIndexString (udev=<optimized out>,
>> > > > >  Index=<optimized out>, buf=0x40204 <buf> "", buflen=<optimized 
>> > > > >  out>)
>> > > > >  at libhid.c:407
>> > > > >  #2  0x00012e18 in ups_infoval_set (item=0x3ee48 
>> > > > >  <tripplite_hid2nut>,
>> > > > >  value=<optimized out>) at usbhid-ups.c:1552
>> > > > >  #3  0x00013da8 in upsdrv_updateinfo () at usbhid-ups.c:835
>> > > > >  #4  0x00012410 in main (argc=<optimized out>, argv=<optimized 
>> > > > >  out>) at
>> > > > >  main.c:708
>> > > > 
>> > > >  You did everything right on the backtrace, but that is puzzling.
>> > > > 
>> > > >  At #2, ups_infoval_set() apparently calls HIDGetIndexString(), but I 
>> > > >  don't see where it does that in the code. There must be some 
>> > > >  pointers, or something.
>> > > > 
>> > > >  The easiest thing might be to crank the debug output up a bit more 
>> > > >  (5x -D, even) but since that will be a bit more output, please 
>> > > >  redirect it to a file, and gzip the log before attaching it. Doesn't 
>> > > >  need to be long, just enough to see one or two errors.
>> > > > 
>> > > >  Another idea is to recompile without optimizations, to see if that 
>> > > >  helps the gdb backtrace. NUT apparently sets CFLAGS=-O if it is not 
>> > > >  set already, so adding "CFLAGS=-g" to the ./configure line should do 
>> > > >  it.
>> > > > 
>> > > >  Arnaud, am I missing something obvious here? After making 
>> > > >  "device.part" HU_STATIC, there shouldn't be any other string 
>> > > >  descriptors retrieved in drivers/tripplite-hid.c.
>> > > > 
>> > > >  --
>> > > >  Charles Lepple
>> > > >  clepple at gmail
>> > > > 
>> > > > 
>> > > > 
>> > >  <typescript-GDB-withCFLAGchange.gz><typescript_LOG_withCFLAG.gz>
>> > 
>> 
>> 
>



More information about the Nut-upsdev mailing list