Jump to content
  • 0

multi-user issue: failed to enumberate device


BryanS

Question

I am able to find an Analog Discovery 2 using djtgcfg enum and it works fine in WaveForms  but only for a single user. Even after the WaveForms application is closed, no other users will be able to connect to the device. After a reboot a different user will be able to connect however the device will then be locked to that user until another reboot. It seems like the first user to connect to the device after a reboot will lock it out to all other users. We have tried all "On Close" device settings in the WaveForms application. We are using Waveforms Version 3.16.3 64-bit Qt5.5.1 Ubuntu 20.04.2 LTS Qt5.12.8 with a single Analog Discovery 2. 

 

Is there an ADEPT2 process that needs to be killed to allow reconnection? 

Link to comment
Share on other sites

6 answers to this question

Recommended Posts

  • 1

Short answer:  The old tmp behavior can be restored with a one-line sysctl change:

sudo sysctl fs.protected_regular=0

fs.protected_regular was changed to be non-zero in 20.04 which limits writes to only the owner (not even group) for files in world writable directories like /tmp

A detailed write up of the option and it's change can be found here https://unix.stackexchange.com/a/503169

Link to comment
Share on other sites

  • 0

Hi @BryanS @attila

Error code 3090 means that something failed during initialization. It works for me in Ubuntu 16 and Ubuntu 18 but I was able to replicate the issue in Ubuntu 20. It has something to do with the file locks that are created in /tmp. If I run the DmgrEnumEx with my standard account (malexander) it works fine and I can run it as many times as I want. If I run it as root then I get error code 3090. If I then execute "rm /tmp/digilent-adept2-*" to remove the files that we create in /tmp then it works again without error even if I run it with a non-root account. What's weird is that the files are all created with 777 permissions so I wouldn't expect any issue opening or locking them from another account. What's also weird is that error code 3090 doesn't show up on any other distribution that I've tested on. I'll work on finding a solution and hopefully have it fixed in the next release, which is scheduled for later this month.

Thanks,
Michael

Link to comment
Share on other sites

  • 0

@BryanS @attila

I spent some time debugging this and discovered that the Adept Runtime is receiving EACCES when trying to open files with read/write permission in "/tmp". The following call results in -1 being returned when the file already exists and was created by another user, other than root:  

open("/tmp/digilent-adept2-shm-dvtbl", O_CREAT | O_RDWR, S_IRWXU | S_IRWXG | S_IRWXO );

This will ultimately lead to error code 3090 (initialization failed) because we use these files for locking while performing certain operations and if they can't be opened then the system won't function correctly.

The "/tmp" directory has permissions 1777, meaning the sticky bit is set. This means that all users have read, write, and execute permissions for all files in "/tmp" but only root or the user that created a file in "/tmp" may delete it. This is fine since our software doesn't delete the files that it creates in "/tmp". After seeing the EACCES error I decided to run some experiments using 3 different user accounts: "malexander", "adept", and "root".

Test 1: Ubuntu 20 LTS with sticky bit set for "/tmp"

1. As user "adept" execute "touch /tmp/blah.txt"
2. As user "adept" execute "chmod 777 /tmp/blah.txt"
3. As user "malexander" execute "echo "test" > /tmp/blah.txt" and receive "-bash: /tmp/blah.txt: Permission denied"
4. As user "root" execute "echo "test" > /tmp/blah.txt" and receive "-bash: /tmp/blah.txt: Permission denied"
5. As user "adept" execute "rm /tmp/blah.txt" to remove the file
6. As user "root" execute "touch /tmp/blah.txt" and "chmod 777 /tmp/blah.txt"
7. As user "malexander" execute "echo "test" > /tmp/blah.txt" and receive no error.
8. As user "adept" execute "echo "test2" >> /tmp/blah.txt" and receive no error.
9. As user "adept" cat file "/tmp/blah.txt" and see the expected text:
test
test2
10. As "root" execute "rm /tmp/blah.txt"

Test 2: Ubuntu 20 LTS with sticky bit cleared for "/tmp"
1. As user "root" execute "chmod 777 /tmp" to remove sticky bit
2. As user "adept" execute "touch /tmp/blah.txt" followed by "adept" execute "chmod 777 /tmp/blah.txt"
3. As user "malexander" execute "echo "test" > /tmp/blah.txt" and receive no error.
4. As user "root" execute "echo "test2" >> /tmp/blah.txt" and receive no error.
5. As user "adept" cat file "/tmp/blah.txt" and see the expected text:
test
test2

Test 3: On Ubuntu 20 LTS run Adept test suite DmgrEnumExt test from multiple user accounts without removing the files in "/tmp" between runs with sticky bit off.
1. First make sure that no adept files are presently in the /tmp dir by executing "rm /tmp/digilent*" as root
2. As user "adept" execute "./test DmgrEnumEx -w 2000" and get expected result:
0:    ADP3450-1
    Transport Type:  TCPIP
    Hostname:        10.1.112.148
    IP Address:      10.1.112.148
    Port:            33890
    Account:         
    Password:        
    UsrName:         ADP3450-1
    ProdName:        Analog Discovery Pro 3450
    SN:              SN:210018AFF319
    MAC Address:     MAC:00-18-3E-03-94-5E
    DCAP:            00000008
    PDID:            40720410

PASS

3. As user "malexander" execute "./test DmgrEnumEx -w 2000" and get expected result:
0:    ADP3450-1
    Transport Type:  TCPIP
    Hostname:        10.1.112.148
    IP Address:      10.1.112.148
    Port:            33890
    Account:         
    Password:        
    UsrName:         ADP3450-1
    ProdName:        Analog Discovery Pro 3450
    SN:              SN:210018AFF319
    MAC Address:     MAC:00-18-3E-03-94-5E
    DCAP:            00000008
    PDID:            40720410

PASS

Test 4: On Ubuntu 18 repeat test 1 with the sticky bit enabled (default on startup). The results under Ubuntu 18 were different. Any user can write a file that was created by another user in "/tmp" as long as the permissions for the file are set to 777. This is the behavior I expected.

Test 5: On Ubuntu 16 repeat test 1 with the sticky bit enabled (default on startup). The results under Ubuntu 18 were different. Any user can write a file that was created by another user in "/tmp" as long as the permissions for the file are set to 777. This is the behavior I expected.

Conclusion:

I think this issue is the result of a bug in Ubuntu 20. Sure, it's possible that the behavior in Ubuntu 16 and Ubuntu 18 is the result of a bug that was fixed in Ubuntu 20. However, I think that's unlikely since we've never received reports of this issue on any other distribution. Further, the code that's being executed hasn't changed in years.

I'm not sure who to contact about this issue to get it fixed upstream in Ubuntu 20 but I'll try to find someone.

For now the only workaround I can suggest for people running Ubuntu 20 is to execute "chmod 777 /tmp" as root on startup to remove the sticky bit.

Link to comment
Share on other sites

  • 0

Thank you for such a detailed test and report. I was wondering if you would be able to identify the actual files that are causing the issue. We have some security issues with doing a chmod 777 on tmp. We would prefer to set permissions on the files or create a group ownership on them.

Thanks again,

Bryan

Link to comment
Share on other sites

  • 0

@BryanS

These are the ones with fixed names:

"/tmp/digilent-adept2-shm-dvtbl"
"/tmp/digilent-adept2-shm-dvtopn"
"/tmp/digilent-adept2-shm-ftdevcmg"
"/tmp/digilent-adept2-shm-ftdmgr"
"/tmp/digilent-adept2-mtx-dvtopn"
"/tmp/digilent-adept2-mtx-dvtbl"
"/tmp/digilent-adept2-mtx-ftdevcmg"
"/tmp/digilent-adept2-mtx-otinit"

This last one has a variable name based on an index that can have a value between 0 and 63.

"/tmp/digilent-adept2-mtx-devlock%2.2X"

It's in hexadecimal so if the index was 63 decimal then the file name would be "/tmp/digilent-adept2-mtx-devlock3F"

I'd expect the index to remain small and unless you plan on having a ton of devices connected to the same PC simultaneously you shouldn't need to create more than the first 10 files:

"/tmp/digilent-adept2-mtx-devlock00"
"/tmp/digilent-adept2-mtx-devlock01"
"/tmp/digilent-adept2-mtx-devlock02"
"/tmp/digilent-adept2-mtx-devlock03"
"/tmp/digilent-adept2-mtx-devlock04"
"/tmp/digilent-adept2-mtx-devlock05"
"/tmp/digilent-adept2-mtx-devlock06"
"/tmp/digilent-adept2-mtx-devlock07"
"/tmp/digilent-adept2-mtx-devlock08"
"/tmp/digilent-adept2-mtx-devlock09"
"/tmp/digilent-adept2-mtx-devlock0A"

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...