Closed Bug 183871 Opened 22 years ago Closed 21 years ago

Crash on "Show hidden files and directories" [@ nsFileView::SetDirectory(nsIFile*) ]

Categories

(Core Graveyard :: File Handling, defect)

x86
Linux
defect
Not set
critical

Tracking

(Not tracked)

RESOLVED FIXED
mozilla1.7alpha

People

(Reporter: relf, Assigned: Biesinger)

References

Details

(Keywords: crash)

Crash Data

Attachments

(2 files, 3 obsolete files)

Linux build 2002120508 To reproduce: 1. Open Edit->Preferences...->Advanced->Cache->Choose Folder 2. Click on "Show hidden files and directories" checkbox 3. Mozilla crashes
That happens when "Choose Cache Folder" dialog says: "You do not have the permissions necessary to view this directory".
can you post Talkback ID or stack trace ?
Keywords: crash, stackwanted
How to get them?
are you using a .mozilla.org build? this bug has been reported multiple times, all by users of debian builds except for one running RPMS from Red Hat. see bug 158036
Max, for the Talkback part, see "mozilla/bin/components/talkback/talkback" give you actually submitted Feedback when the Netscape Feedback agent popped up after Mozilla crashed.
yeah. i'm using mozilla.org build ftp://ftp.mozilla.org/pub/mozilla/nightly/latest/mozilla-i686-pc-linux-gnu.tar.gz I don't see talkback subdirectory in mozilla/conponents.
The bug is easily reproducible here. Just let me know which build/tool to use to provide you necessary information.
talkback is not included in the .tar.gz builds. You need to get the "sea" or "installer" build.
Attached file Talkback info (obsolete) —
we just need the talkback ID. run mozilla/components/talkback/talkback and grab the talkback ID for the report you sent in.
I didn't get how to learn ID. I click 'Send' in Talkback agent, it disappears, and nothing happen.
> I click 'Send' in Talkback agent, it disappears, and nothing happen. that's fine. now go to the mozilla directory (i.e. /usr/local/mozilla) and then go to components/talkback. run the talkback executable in that directory. in an attempt to know why you're seeing this when nobody else is... what Mozilla theme are you using? what gtk theme are you using?
Ok. Talkback ID: TB14817508W I see the bug with any theme including default Modern one. I'm using Debian release 3.0 - dunno what gtk it comes with.
Attachment #108541 - Attachment is obsolete: true
Whiteboard: TB14817508W
Blocks: 185584
No longer blocks: 185584
we need a new TB ID, this one has expired (30 days).
Whiteboard: TB14817508W
Ok. This is a fresh one. Linux build 2003010610
Keywords: stackwanted
Whiteboard: TB15870027Y
Trigger Reason SIGSEGV: Segmentation Fault: (signal 11)
Keywords: stackwanted
Whiteboard: TB15870027Y
bug 176886 strikes again.
Olivier, do you want a new stack again? From which build?
Max, we'd need a stack from GDB with a debug build you'd compile yourself. I can't reproduce this on my Linux box and Talkback sometimes totally misses the stack.
you could also try running with a clean profile. if there's something in your profile that's triggering the crash, we'd need to know what it is to reproduce the crash.
Clean profile works fine. And I've found what causes the crash. I have two primary OS installed: OS/2 and Linux. And I'm trying to share Mozilla settings between them that is objected by the bug 137006. So I have to use some tricks to pass over that bug (at least partially). Mozilla settings are located on OS/2 drive O: which is mounted as /O: directory in Linux. Well... The current crash problem arises when I use profile from OS/2 version containing line like user_pref("browser.cache.disk.parent_directory", "O:\\Home\\Mozilla\\Profiles\\relf\\lq1ln66p.slt"); Hope, this will help.
thanks, Max. I can reproduce it with that setting. marking NEW. it's an invalid pref setting, but Mozilla shouldn't crash. stacktrace to follow.
Status: UNCONFIRMED → NEW
Ever confirmed: true
Keywords: stackwanted
Attached file stacktrace
(gdb) frame 7 #7 0x41ff39d3 in nsFileView::SetDirectory(nsIFile*) (this=0x8878488, aDirectory=0x1) at nsFileView.cpp:244 244 aDirectory->GetDirectoryEntries(getter_AddRefs(dirEntries)); (gdb) p aDirectory $1 = (nsIFile *) 0x1 (gdb) p *aDirectory Cannot access memory at address 0x1 (gdb) frame 8 #8 0x41ff37c2 in nsFileView::SetShowHiddenFiles(int) (this=0x8878488, aShowHidden=1076661060) at nsFileView.cpp:158 158 SetDirectory(mDirectoryPath); (gdb) p mDirectoryPath $2 = {mRawPtr = 0x0}
to bryner, since he's most familiar with this code....
Assignee: law → bryner
BTW, i disagree that pref is invalid. In Linux it can be treated as a valid directory whose name contains '\' and ':' symbols. Nothing wrong with that.
this kind of this is supposed to be handled (see bug 105809). http://lxr.mozilla.org/mozilla/source/xpfe/components/filepicker/res/content/filepicker.js#162 162 if (!directory || !(sfile.exists() && sfile.isDirectory())) { 163 // Start in the user's home directory 164 sfile.initWithPath(homeDir.path); 165 } sfile.exists() returns false, but it still checks sfile.isDirectory(), which throws an unhandled Javascript exception, so the directory never gets reset.
Attached patch patch (obsolete) — Splinter Review
just check exists() and isDirectory() separately.
umm.... if sfile.exists() returns false (are you sure that it does?) then it checking sfile.directory() there is a blatant bug in JS, which is defined to do operator short-circuiting.... Are you sure that's what's going on?
Attachment #111325 - Flags: review?(bryner)
Comment on attachment 111325 [details] [diff] [review] patch it appears that the exception was from some debugging I had, but the patch did fix things. However, backing out the patch now also works. I'm confused.
Attachment #111325 - Flags: review?(bryner)
Comment on attachment 111325 [details] [diff] [review] patch ok, to reproduce this bug, you have to actually visit a page so that it creates the bogus cache directory (relative to the current directory). If the directory does not exist, then the filepicker behaves as advertised and falls back to the home directory.
Attachment #111325 - Attachment is obsolete: true
ok, the real problem is that filepicker's populateAncestorList() accesses directory.parent, which returns NS_ERROR_FILE_INVALID_PATH because the path does not contain a '/': http://lxr.mozilla.org/mozilla/source/xpcom/io/nsLocalFileUnix.cpp#1176 GetParent seems to expect an absolute path, so a path without a '/' is inherently invalid. try/catching the access to directory.parent and the while loop seems to fix things up a bit. The directory is properly displayed in the filepicker and turning on hidden files doesn't crash, but (of course) the "Look in" dropdown is unpopulated and hitting "Up" doesn't do anything.
Ugh. So yes, getComplexValue from prefs will call setPersistentDescriptor with whatever garbage is in the pref. And nsLocalFileUnix will cheerfully let itself be initialized (through InitWithNativePath()) with a path that has nothing to do with a Unix path... even though it later totally fails to deal (eg see assertion in GetParent, the logic in AppendRelativeNativePath, etc, etc). Adding some exception catching code to the filepicker is fine with me, but only if .parent is allowed to throw. Too bad we didn't bother documenting that in nsIFile... Should InitWithNativePath throw when the path is obviously bogus?
Initializing nsLocalFileUnix w/ a bogus value sounds like bad client logic. If nsLocalFileUnix is crashing, that is a different story. I tried to reproduce on debian, but no crash. --pete
Um... the client (prefs) initializes an nsILocalFile. It does not know what the underlying impl is and it should not care, since it makes no sense to put the validity checks in _all_ the clients when those would be much more cleanly encapsulated in the nsILocalFile implementations. More to the point, nsLocalFileWin, nsLocalFileMac, nsLocalFileOS2, nsLocalFileOSX, all perform sanity-checking on the path and will return NS_ERROR_UNRECOGNIZED_PATH if the path is not recognized (makes sense, eh?). Yeah, every single client of nsILocalFile could include the couple-of-hundred-lines of ifdeffed error checking... do you really think that is the right approach? No, nsLocalFileUnix does not crash. It will simply throw exceptions that the interface does not define as being thrown and behave in completely ridiculous ways in other cases.... It seems to me, that it would make more sense to throw an exception where callers are actually expecting one and prepared to deal...
Would fixing this be as easy as adding a check for file existance in InitWithNativePath?
You can created nsIFiles pointing to non-existing places and then call Create() or CreateUnique() on them, you know... Breaking that would be BAD (frozen interface, yadda yadda). ;)
how about this, can we make the unix localfile implementation throw an exception if Init is called with a relative path?
~/ should still be supported.
Blocks: 219107
Summary: Crash on "Show hidden files and directories" → Crash on "Show hidden files and directories" [@ nsFileView::SetDirectory(nsIFile*) ]
well... unfortunately this patch breaks xpcshell, which tries to init nsIFiles with "."
Attached patch patchSplinter Review
well the real problem was that nsDirectoryService.cpp was relying on the fact that nsLocalFileUnix::InitWithNativePath accepted relative paths. That contradicted its interface documentation, but oh well...
Attachment #137189 - Attachment is obsolete: true
taking
Assignee: bryner → file-handling
QA Contact: chrispetersen → ian
Target Milestone: --- → mozilla1.7alpha
really taking this time
Assignee: file-handling → cbiesinger
Status: NEW → ASSIGNED
Comment on attachment 137198 [details] [diff] [review] patch Is there a nsDirectoryService.cpp patch? Why can't the value of PR_GetEnv(...) be a canonicalized absolute path and drop this realpath business? I think that your change to xpcom/io/nsLocalFileUnix.cpp may break things. Yes, the interface says one thing but as you pointed out, the callers do another. What kind of testing have you done?
>Is there a nsDirectoryService.cpp patch? yes, in the exact attachment you commented on >Why can't the value of PR_GetEnv(...) be a canonicalized absolute path and drop >this realpath business? let me note that GRE_GetCurrentProcessDirectory already uses the realpath solution. >I think that your change to xpcom/io/nsLocalFileUnix.cpp may break things. Well, nsLocalFileUnix seems to not always deal with that either - GetLeafName seems to require absolute paths. Also GetParent. >What kind of testing have you done? run xpcshell, run mozilla, do some browsing, run mailnews, attach patches (using the filepicker). do you have anything specific in mind that you suspect of breaking?
Comment on attachment 137198 [details] [diff] [review] patch lets get this into 1.7a.
Attachment #137198 - Flags: review?(dougt) → review+
Attachment #137198 - Flags: superreview?(bz-vacation)
Comment on attachment 137198 [details] [diff] [review] patch sr=bzbarsky
Attachment #137198 - Flags: superreview?(bz-vacation) → superreview+
ok, checked in Checking in nsDirectoryService.cpp; /cvsroot/mozilla/xpcom/io/nsDirectoryService.cpp,v <-- nsDirectoryService.cpp new revision: 1.67; previous revision: 1.66 done Checking in nsLocalFileUnix.cpp; /cvsroot/mozilla/xpcom/io/nsLocalFileUnix.cpp,v <-- nsLocalFileUnix.cpp new revision: 1.109; previous revision: 1.108 done
Status: ASSIGNED → RESOLVED
Closed: 21 years ago
Resolution: --- → FIXED
(In reply to comment #43) > I think that your change to xpcom/io/nsLocalFileUnix.cpp may break things. Just for the record, dougt was right and this change did cause bug 238290.
Crash Signature: [@ nsFileView::SetDirectory(nsIFile*) ]
Product: Core → Core Graveyard
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Creator:
Created:
Updated:
Size: