Open Bug 700114 Opened 13 years ago Updated 2 years ago

Download of a file fails to save to a read only folder (or without permissions) and doesn't report error (in Firefox)

Categories

(Toolkit :: Downloads API, defect)

7 Branch
x86
Linux
defect

Tracking

()

People

(Reporter: ggagliano, Unassigned)

References

Details

(Keywords: dataloss)

User Agent: Mozilla/5.0 (X11; Linux x86_64; rv:7.0.1) Gecko/20100101 Firefox/7.0.1 Build ID: 20110928221813 Steps to reproduce: I clicked in a download link and tryed to save the file in a folder whose write permission I do not have. Actual results: When clicking in a download link and the save pop-up appears, if you navigate to a folder where your user don't have permission to write or if the folder is mounted read-only, Firefox does not save the file, does not report any error message and does act as the file was properly saved. Some downloads are paid and this loss of data may cause problems, because a second click in the link is needed and the download process must be restarted. Expected results: Before trying to save the file, Firefox should have investigated the folder and should report useful error messages, like "You don't have permission to write there!" or "This file-system is mounted read-only!", so the user has the change to navigate to another folder and try to save the file again. By doing so, no file will be lost and download will never fail.
Is there anything in the tools->web developer->Error console?
Component: General → Download Manager
Depends on: 271018
Keywords: dataloss
Product: Firefox → Toolkit
QA Contact: general → download.manager
I can reproduce this on Linux. I get a proper error message that the download failed due to permissions only when saving via Save page as, and also Save link target as. But when the download is initiated via normal click on a link (try e.g. https://www.kernel.org and choose a patch file there). There is no indication of download (not in the Download manager) and no error message. The download is ignored.
Status: UNCONFIRMED → NEW
Ever confirmed: true
Hardware: x86_64 → x86
Yes!! I reached this bug while using Ubuntu Linux 10.10 and Firefox 7 (sorry, I never tried it under others OS). The Download is totally ignored and the Download window does never open.
Summary: Download a file fails to save and don't report error → Download of a file fails to save to a read only folder (or without permissions) and doesn't report error (in Firefox)
Hi, I an trying to fix bug Bug 567585 TB3 fails to raise an error when it tries to save an attachment to write-protected directory. Actually TB7 (and a built from comm-central) still suffers the same problem. AND, I believe at least the half the problem reported here for FF originates from the same bug and we can blame nsHelperAppDlg.js which is being fixed by me in bug 567585. This javascript file is invoked in TB when - when the user clicks (left double click) on the e-mail attachment but NOT invoked when - when the user clicks on "save as" context menu (right mouse button first and then choose the "save as" from the pop-up menu.) or the menu button, save near the right lower corner of the message pane is clicked. In that case, a CPP routine is invoked. Confusing, er? I don't really believe the pre-check is so useful as long as the error is properly reported afterward. This is because, if we use a remote server, or on a busy machine, someone else or one of your processes may be changing the permission of the directory or even removing the directory *AFTER* the filepicker (filechooser or whatever it is called) allowed you to select as the destination directory and *BEFORE* your program starts to open and write to a file under that directory. The only sure way to check whether a file can be created for writing is to open it on Posix when the remote file servers and multiple processes are involved. My latest patch in Bug 567585 is something that addresses the situation where target directory that is known to exist (and checked by the filepicker) disappears before writing to it. In fixing the bug, I encountered a serious problem of not being able to pick up error message, and was forced to write an equivalent of strerror() for mozilla javascript routine. Anyway, the filepicker (or filechooser) seems to try to at least in principle, to avoid non-writable directory when it was asked to save something. HOWEVER, I think the check is not working on POSIX-like OS such as Solaris, linux, etc. because isWritable() implementation used by filepicker under UNIX is, IMHO, broken. http://mxr.mozilla.org/comm-central/source/mozilla/xpcom/io/nsLocalFileUnix.cpp#1384 1384 nsLocalFile::IsWritable(bool *_retval) 1385 { 1386 CHECK_mPath(); 1387 NS_ENSURE_ARG_POINTER(_retval); 1388 1389 *_retval = (access(mPath.get(), W_OK) == 0); 1390 if (*_retval || errno == EACCES) 1391 return NS_OK; 1392 return NSRESULT_FOR_ERRNO(); See line 1389. If the access() above succeeded then we would have *_retval as boolen true, and isWritable() will return NS_OK. So far so good. But look at "|| errno == EACCESS". I have no idea why it is there. (Well, actually, I can guess why, but let us not go into the details.) Suppose we have a directory that is completely invisible to the user. E.g., (as a superuser) # mkdir /tmp/i-dir # chmod a-rwx /tmp/i-dir I believe the above isWritable() return bollean true for /tmp/i-dir because the errno == EACCESS is true (!). But can you write to it? No! However, at least, the filepicker today tries to check the "Existence" of the directory, and if a directory doesn't exist, it will fall back to another directory. This is where I think the reporters above probably say that nothing happens. Maybe TB and FF are slightly different here. Under TB, for example, if the user tries to save to a directory, say, /tmp/c-dir, and while the user is looking at the directory, suppose, from another shell in a different terminal window, you invoke "rm -fr /tmp/c-dir" and eliminates that directory. When the user tries to save to /tmp/c-dir, file picker refuses and move the "focus", i.e., where target is, to "/tmp/" directory, and lists the entries below "/tmp". "c-dir" is no longer there. (Actually, filepicker moves very fast, and by the time the user tries to press [save] while he/she thinks is trying to save to /tmp/c-dir, filepicker may already shows the listing of /tmp, and not /tmp/c-dir anymore.) However, at this moment when the user is looking at /tmp directory listing in filepicker, if someone creates "/tmp/c-dir" then the c-dir entry appears in filepicker's listing, and so the user can move into /tmp/c-dir. You can try deleting and creating a directory and try saving to, say, "/tmp/c-dir" and see what happens by running something like while true do mkdir /tmp/c-dir sleep 2 mkdir /tmp/d-dir sleep 2 rm -fr /tmp/c-dir sleep 2 rm -fr /tmp/d-dir sleep 1 done Be sure to open "error console" because maybe once in a while the filepicker allows the passing of "/tmp/c-dir" about to be removed in a split second before TB/FF saves something there and the code throws an error that is never caught and thus you will see an uncaught error in error console. (Well, this is how I debugged the latest patch to Bug 567585.) Now, ever wonder why this problem to "non-writable directory" seems to be ignored by Windows users? (Non-existing directory, such as in the case of flakey USB drive going off-line under Windows and TB/FF allows the user to write to it and causing a failure has been reported. Probably the same cause and the bad runtime behavior is my guess.) When I tried to create the non-writable directory on my LOCAL PC using attrib +r or chmod a-w of Cygwin, such a directory seems to be created. But for some unknown reason, TB on Windows never balked at writing to it. And Windows seems to allow writing to the directory (!?) I have no idea what is wrong here. Maybe because my account on *LOCAL* Windows PC has the administrative privilege? (If so, I can understand the scarcity of complaints about silent failure to save an attachment to non-writable directory.) Oh, can people follow this bug under linux try to write to, say, "/dev/" or mounted CDROM file system? The silent failure would make people contemplate how this bug has been ignored for so long. By the way, there is another issue of save/store location AFTER the failure occurs. Maybe you may notice that the next time you try to save, suddenly the first choice moves to your default save location. But this default save location is different for TB and FF. And the javascript code is shared between TB and FF. This is again very confusing :-( Even showing "Download" window is very confusing to TB users since "saving attachment" always means that you have already has an e-mail message in your local folder and seeing "download" progress window is hilariously confusing (!). Maybe I should file a bug on this point alone, but a few similar bugs regarding the unusefulness of download window when saving an attachment is done from TB (and I recall doing so long time ago before I realized the true cause of the problem: sharing of nsHelperAppDlg.js between FF for downloading, and TB for saving an attachment. Thank you for reading this long rant. I hope the reporters here would encourage the adoption of patch in bug 567585 so that we can get rid of the problem soon.
Depends on: 567585
Thanks for your explanation. I have made the dependence on your bug 567585. We will see if it helps this problem. Thanks for looking into those parts of code.
Additional observation. 10.02 (under linux: ) Using [File] -> [Save as] If I set the default download directory to a directory without write-permission in advance, FF seems to silently fails to write to the directory, BUT resets the default directory to the ~/Download or whatever is the build default of FF and happily writes to the directory(!) The default download directory location is reset to the built-in default when this happens. Hmm... I am not sure if this under-the-hood recovery without warning at all is a good idea. (After all the user made a choice.) Right clicking on a link, and choose the "save as" from the pop-up context menu and chooses a write-protected directory to save the file fails SILENTLY as reported before. Now, under WINDOWS, but it seems that the write-only property on local disk file system (at least this is I can test easily) seems to be ignored by mozilla I/O library (presumably if the user has admin permission. I never failed to write to a directory no matter what I do using attrib under Windows console, or chmod in cygwin console to set the write-protected property of a directory.) This may be a problem, though, from a security point of view. OH, wait, under windows, if I create a directory, and then sets the write-permission status as attrib or chmod (under cygwin), it seems that ONLY the FILES created BELOW that directory seem to be set to READ-only. We can still create a file under it (I was checking the PROPERTIES of the directory using windows GUI and noticed this. The modification property of the directory seems to be still available to users. But this may be due to the user accounts on my Windows PC have administrative privildge.) At least my last observation explains why we have seen less such reporting of write-protected directory causing problems coming from Windows users in contrast to linux/solaris/etc. users who have suffered and reported these problems including myself. Presumably, even windows users will experience the same problem when they try to write to a write-protected file server. Someone more familiar with Windows ACL setting can disable the write to a directory completely and check how FF (and TB) operates under the windows. .
Depends on: 928250
No longer depends on: 567585
Severity: normal → S3
You need to log in before you can comment on or make changes to this bug.