AppImage / type2-runtime

The runtime is the executable part of every AppImage. It mounts the payload via FUSE and executes the entrypoint.
Other
22 stars 17 forks source link

Update libfuse patch #37

Open Bqleine opened 4 months ago

Bqleine commented 4 months ago

This new patch searches for fusermount and fusermount3 in both the compiled path, and in PATH. The error codes for each try are displayed in case of failure to find a suitable binary:

noe@lignux /tmp [env]$ ./z05szmzfqcc82i2ikcz7q18aihj9lb10-hello-appimage-pack.AppImage 
fuse: failed to exec fusermount, tried the following:
    /var/empty/fusermount3 : No such file or directory
    fusermount3 : No such file or directory
    /var/empty/fusermount : No such file or directory
    fusermount : No such file or directory

Cannot mount AppImage, please check your FUSE setup.
You might still be able to extract the contents of this AppImage 
if you run it with the --appimage-extract option. 
See https://github.com/AppImage/AppImageKit/wiki/FUSE 
for more information
open dir error: No such file or directory

This pull request should close #36, #32, #16, #35, #31, and #15.

What do you think @probonopd @TheAssassin ? P.S. sorry if I've been rude. I've made too much of a big deal out of things, I really appreciate your work on AppImages.

Bqleine commented 4 months ago

I've abandonned the idea of trying future fusermount versions for simplicity.

probonopd commented 4 months ago

Thanks for your contribution @Bqleine, really appreciate it. Never came across as rude, no need to apologize.

I've abandonned the idea of trying future fusermount versions for simplicity.

Imho that's actually a really important part of the solution. If you could add that back, I'd be all for it!

Bqleine commented 4 months ago

Are you sure about this? I feel like the user would not expect that his AppImage searches for fusermount versions that don't exist, and it would confuse them if they're trying to debug problems. There's also no sign of a new major version of libfuse being released any time in the future (https://github.com/libfuse/libfuse/?tab=readme-ov-file#development-status) and even if one were to be released fusermount3 would still be available for users for a long time. Long enough to update the AppImage.

Samueru-sama commented 4 months ago

I would like to add that distros that only ship fusermount3 symlink it to fusermount so it is highly unlikely that in the future this wouldn't be the case.

Imo, a more proper solution would be to automate the --appimage-extract-and-run function so that if there isn't a working fuse on the system that is used automatically as a fallback.

probonopd commented 4 months ago

Imo, a more proper solution would be to automate the --appimage-extract-and-run function so that if there isn't a working fuse on the system that is used automatically as a fallback.

This is not what we want, as people would just leave their FUSE setup broken.

Bqleine commented 3 months ago

So can we merge this? I don't want to implement the checking for future versions because I think its a bad idea for security and as @Samueru-sama pointed out it would not be very useful. Nevertheless, this fix is important as buffer overflows are important security concerns.

Samueru-sama commented 3 months ago

I also want to point out that older versions of linux mint are affected by the current bug of the hardcoded fusermount path so hopefully this can be fixed soon.

probonopd commented 3 months ago

Yes, I'd also like to get a proper fix merged soon. To get this merged, we need to:

Bqleine commented 3 months ago

@probonopd What do you think of this new patch? Example output:

noe@lignux /tmp$ guix shell -C -- ./gj06dax4z6p35ip3j84mn78sgsqg8mn8-hello-appimage-pack.AppImage 
fuse: failed to exec fusermount, tried the following:
    /var/empty/fusermount : No such file or directory
    fusermount : No such file or directory
    /var/empty/fusermount3 : No such file or directory
    fusermount3 : No such file or directory
    /var/empty/fusermount4 : No such file or directory
    fusermount4 : No such file or directory
    /var/empty/fusermount5 : No such file or directory
    fusermount5 : No such file or directory
    /var/empty/fusermount6 : No such file or directory
    fusermount6 : No such file or directory
    /var/empty/fusermount7 : No such file or directory
    fusermount7 : No such file or directory
    /var/empty/fusermount8 : No such file or directory
    fusermount8 : No such file or directory
    /var/empty/fusermount9 : No such file or directory
    fusermount9 : No such file or directory
    /var/empty/fusermount10 : No such file or directory
    fusermount10 : No such file or directory
    /var/empty/fusermount11 : No such file or directory
    fusermount11 : No such file or directory
    /var/empty/fusermount12 : No such file or directory
    fusermount12 : No such file or directory
    /var/empty/fusermount13 : No such file or directory
    fusermount13 : No such file or directory
    /var/empty/fusermount14 : No such file or directory
    fusermount14 : No such file or directory
    /var/empty/fusermount15 : No such file or directory
    fusermount15 : No such file or directory
    /var/empty/fusermount16 : No such file or directory
    fusermount16 : No such file or directory
    /var/empty/fusermount17 : No such file or directory
    fusermount17 : No such file or directory
    /var/empty/fusermount18 : No such file or directory
    fusermount18 : No such file or directory
    /var/empty/fusermount19 : No such file or directory
    fusermount19 : No such file or directory
    /var/empty/fusermount20 : No such file or directory
    fusermount20 : No such file or directory
    /var/empty/fusermount21 : No such file or directory
    fusermount21 : No such file or directory
    /var/empty/fusermount22 : No such file or directory
    fusermount22 : No such file or directory
    /var/empty/fusermount23 : No such file or directory
    fusermount23 : No such file or directory
    /var/empty/fusermount24 : No such file or directory
    fusermount24 : No such file or directory
    /var/empty/fusermount25 : No such file or directory
    fusermount25 : No such file or directory
    /var/empty/fusermount26 : No such file or directory
    fusermount26 : No such file or directory
    /var/empty/fusermount27 : No such file or directory
    fusermount27 : No such file or directory
    /var/empty/fusermount28 : No such file or directory
    fusermount28 : No such file or directory
    /var/empty/fusermount29 : No such file or directory
    fusermount29 : No such file or directory
    /var/empty/fusermount30 : No such file or directory
    fusermount30 : No such file or directory
    /var/empty/fusermount31 : No such file or directory
    fusermount31 : No such file or directory
    /var/empty/fusermount32 : No such file or directory
    fusermount32 : No such file or directory
    /var/empty/fusermount33 : No such file or directory
    fusermount33 : No such file or directory
    /var/empty/fusermount34 : No such file or directory
    fusermount34 : No such file or directory
    /var/empty/fusermount35 : No such file or directory
    fusermount35 : No such file or directory
    /var/empty/fusermount36 : No such file or directory
    fusermount36 : No such file or directory
    /var/empty/fusermount37 : No such file or directory
    fusermount37 : No such file or directory
    /var/empty/fusermount38 : No such file or directory
    fusermount38 : No such file or directory
    /var/empty/fusermount39 : No such file or directory
    fusermount39 : No such file or directory
    /var/empty/fusermount40 : No such file or directory
    fusermount40 : No such file or directory
    /var/empty/fusermount41 : No such file or directory
    fusermount41 : No such file or directory
    /var/empty/fusermount42 : No such file or directory
    fusermount42 : No such file or directory
    /var/empty/fusermount43 : No such file or directory
    fusermount43 : No such file or directory
    /var/empty/fusermount44 : No such file or directory
    fusermount44 : No such file or directory
    /var/empty/fusermount45 : No such file or directory
    fusermount45 : No such file or directory
    /var/empty/fusermount46 : No such file or directory
    fusermount46 : No such file or directory
    /var/empty/fusermount47 : No such file or directory
    fusermount47 : No such file or directory
    /var/empty/fusermount48 : No such file or directory
    fusermount48 : No such file or directory
    /var/empty/fusermount49 : No such file or directory
    fusermount49 : No such file or directory
    /var/empty/fusermount50 : No such file or directory
    fusermount50 : No such file or directory
    /var/empty/fusermount51 : No such file or directory
    fusermount51 : No such file or directory
    /var/empty/fusermount52 : No such file or directory
    fusermount52 : No such file or directory
    /var/empty/fusermount53 : No such file or directory
    fusermount53 : No such file or directory
    /var/empty/fusermount54 : No such file or directory
    fusermount54 : No such file or directory
    /var/empty/fusermount55 : No such file or directory
    fusermount55 : No such file or directory
    /var/empty/fusermount56 : No such file or directory
    fusermount56 : No such file or directory
    /var/empty/fusermount57 : No such file or directory
    fusermount57 : No such file or directory
    /var/empty/fusermount58 : No such file or directory
    fusermount58 : No such file or directory
    /var/empty/fusermount59 : No such file or directory
    fusermount59 : No such file or directory
    /var/empty/fusermount60 : No such file or directory
    fusermount60 : No such file or directory
    /var/empty/fusermount61 : No such file or directory
    fusermount61 : No such file or directory
    /var/empty/fusermount62 : No such file or directory
    fusermount62 : No such file or directory
    /var/empty/fusermount63 : No such file or directory
    fusermount63 : No such file or directory
    /var/empty/fusermount64 : No such file or directory
    fusermount64 : No such file or directory
    /var/empty/fusermount65 : No such file or directory
    fusermount65 : No such file or directory
    /var/empty/fusermount66 : No such file or directory
    fusermount66 : No such file or directory
    /var/empty/fusermount67 : No such file or directory
    fusermount67 : No such file or directory
    /var/empty/fusermount68 : No such file or directory
    fusermount68 : No such file or directory
    /var/empty/fusermount69 : No such file or directory
    fusermount69 : No such file or directory
    /var/empty/fusermount70 : No such file or directory
    fusermount70 : No such file or directory
    /var/empty/fusermount71 : No such file or directory
    fusermount71 : No such file or directory
    /var/empty/fusermount72 : No such file or directory
    fusermount72 : No such file or directory
    /var/empty/fusermount73 : No such file or directory
    fusermount73 : No such file or directory
    /var/empty/fusermount74 : No such file or directory
    fusermount74 : No such file or directory
    /var/empty/fusermount75 : No such file or directory
    fusermount75 : No such file or directory
    /var/empty/fusermount76 : No such file or directory
    fusermount76 : No such file or directory
    /var/empty/fusermount77 : No such file or directory
    fusermount77 : No such file or directory
    /var/empty/fusermount78 : No such file or directory
    fusermount78 : No such file or directory
    /var/empty/fusermount79 : No such file or directory
    fusermount79 : No such file or directory
    /var/empty/fusermount80 : No such file or directory
    fusermount80 : No such file or directory
    /var/empty/fusermount81 : No such file or directory
    fusermount81 : No such file or directory
    /var/empty/fusermount82 : No such file or directory
    fusermount82 : No such file or directory
    /var/empty/fusermount83 : No such file or directory
    fusermount83 : No such file or directory
    /var/empty/fusermount84 : No such file or directory
    fusermount84 : No such file or directory
    /var/empty/fusermount85 : No such file or directory
    fusermount85 : No such file or directory
    /var/empty/fusermount86 : No such file or directory
    fusermount86 : No such file or directory
    /var/empty/fusermount87 : No such file or directory
    fusermount87 : No such file or directory
    /var/empty/fusermount88 : No such file or directory
    fusermount88 : No such file or directory
    /var/empty/fusermount89 : No such file or directory
    fusermount89 : No such file or directory
    /var/empty/fusermount90 : No such file or directory
    fusermount90 : No such file or directory
    /var/empty/fusermount91 : No such file or directory
    fusermount91 : No such file or directory
    /var/empty/fusermount92 : No such file or directory
    fusermount92 : No such file or directory
    /var/empty/fusermount93 : No such file or directory
    fusermount93 : No such file or directory
    /var/empty/fusermount94 : No such file or directory
    fusermount94 : No such file or directory
    /var/empty/fusermount95 : No such file or directory
    fusermount95 : No such file or directory
    /var/empty/fusermount96 : No such file or directory
    fusermount96 : No such file or directory
    /var/empty/fusermount97 : No such file or directory
    fusermount97 : No such file or directory
    /var/empty/fusermount98 : No such file or directory
    fusermount98 : No such file or directory
    /var/empty/fusermount99 : No such file or directory
    fusermount99 : No such file or directory
If you think this is an error, please report the issue to the AppImage runtime developpers at https://github.com/AppImage/type2-runtime along with the above output.

Cannot mount AppImage, please check your FUSE setup.
You might still be able to extract the contents of this AppImage 
if you run it with the --appimage-extract option. 
See https://github.com/AppImage/AppImageKit/wiki/FUSE 
for more information
open dir error: No such file or directory
probonopd commented 3 months ago

Thank you very much @Bqleine. Very helpful indeed.

I think we should shorten the error output quite a bit - if no fusermount is found, we should probably just state that once. Is /var/empty misleading? I guess we are not really searching for the binaries at that path?

github-actions[bot] commented 3 months ago

Build for testing: artifacts Use at your own risk.

Bqleine commented 3 months ago

Thank you very much @Bqleine. Very helpful indeed.

I think we should shorten the error output quite a bit - if no fusermount is found, we should probably just state that once.

That’s just because we search for 99 versions, which seems a little bit over board.

Is /var/empty misleading? I guess we are not really searching for the binaries at that path?

We are really searching in that path, its the default path that fusermount was compiled with. The reason it’s « /var/empty » is simply because I built this image with GNU Guix. I could remove that second check though

probonopd commented 3 months ago

Couldn't we just say "No fusermount binary found on the $PATH" just once if none is found?

probonopd commented 3 months ago

It seems like FUSE nowadays also searches on the $PATH by default: https://github.com/libfuse/libfuse/commit/290c65b1ad4b8a42a9af507b411df480400d9aff

They are using posix_spawnp instead of execvp though. Should we do the same? Maybe rebase this patch on the latest FUSE?

(I quickly checked: execvp replaces the current process, while posix_spawnp creates a new process. execvp does not return on success, while posix_spawnp returns to the caller. posix_spawnp seems to be preferred by some for its efficiency and simplicity in process creation.)

s09bQ5 commented 2 months ago

What if future versions of fusermount expect different parameters? I don't think it is a good idea to try unknown versions. Users can always add a symlink or wrapper script for fusermount to their system if they want to run ancient AppImages.

probonopd commented 1 month ago

Worst case is that it will break. If we do not even try, it will break for sure. So we better try at least.

adrianinsaval commented 1 week ago

What's missing here to get this merged?

probonopd commented 1 week ago

We'd need @TheAssassin to review this. Friendly ping :)