Closed Bug 221422 Opened 21 years ago Closed 21 years ago

Unix builds after 2003/09/13 don't start when run with a relative path

Categories

(Core :: XPCOM, defect)

defect
Not set
critical

Tracking

()

RESOLVED FIXED

People

(Reporter: pkwarren, Assigned: pkwarren)

References

Details

Attachments

(3 files, 1 obsolete file)

The last working daily build for AIX was on 2003/09/13. All subsequent builds
fail to start, exiting with return code 4. I have not yet been able to check out
a build from that time to see exactly what the problem is, but initially I think
it may have something to do with the checkin for Bug 179834.
These are the checkins between 2003/09/13 08:00:00 and 2003/09/14 08:00:00:

http://makeashorterlink.com/?L23D51F16
Hrm, hase someone got a debug build? If my checkin is to blame you will get some
interesting warnings during startup. Really, though, I can't see how I would be
to blame for this unless nsTHashtable itself was misbehaving.
I am in the process of building an updated trunk debug build. I believe the last
time I tried to bring one up it gave errors about not being able to find
res://gre/... files, which is why I thought it might have something to do with
the checkin for Bug 179834.
Attached file Mozilla startup log
This is a log from the startup of a debug build on AIX.
Philip, can you run the following script in xpcshell (the debug build) and post
back the results?

const C = Components.classes;
const I = Components.interfaces;

dirService = C["@mozilla.org/file/directory_service;1"].getService(I.nsIProperties);

appDir = dirService.get("CurProcD", I.nsIFile);
print("Applicaiton directory is: " + appDir.path + "\n");

greDir = dirService.get("GreD", I.nsIFile);
print("GRE directory is: " + greDir.path + "\n");

ioS = C["@mozilla.org/network/io-service;1"].getService(I.nsIIOService);
resHandler = ioS.getProtocolHandler("resource");

resHandler = resHandler.QueryInterface(I.nsIResProtocolHandler);
greMapping = resHandler.getSubstitution("gre");

print("resource://gre/ mapping = " + greMapping.spec + "\n");
$ LIBPATH=. ./xpcshell -f xpcshell.script

Application directory is: /home/pkw/sb/moz14/src/nsmoz/mozilla/obj-opt/dist/bin

GRE directory is: /home/pkw/sb/moz14/src/nsmoz/mozilla/obj-opt/dist/bin

uncaught exception: [Exception... "Component returned failure code: 0x80040111 
(NS_ERROR_NOT_AVAILABLE) [nsIResProtocolHandler.getSubstitution]"  
nsresult: "0x80040111 (NS_ERROR_NOT_AVAILABLE)"  location: "JS frame :: 
xpcshell.script :: <TOP_LEVEL> :: line 16"  data: no]
Ugh! That's bad, and would cause the other problems in that log. Without a
machine for testing I'm somewhat at a loss, but I would start by putting
printf()s in nsResProtocolHandler::Init() or stepping through that function to
see whether anything is failing there. Could you also run the TestHashtables
test program and see whether that reports any failures?
Attached file TestHashtables logfile
As far as I can tell, the output of TestHashtables looks ok. Its pretty verbose
though.
Ok here is a log (NSPR_LOG_MODULES=nsResProtocol:5) with some additions by me:

This is for the first call to AddSpecialDir in Init():

1[20057f48]: nsResProtocolHandler::AddSpecialDir(aSpecialDir="CurProcD",
aSubstitution="")
1[20057f48]:
file->nativePath="/home/pkw/sb/mozilla/trunk/mozilla/obj-debug/dist/bin"
1[20057f48]: nsResProtocolHandler::SetSubstitution(root="", baseURI=0x20aadcb8,
baseURI->Path="/home/pkw/sb/mozilla/trunk/mozilla/obj-debug/dist/bin/")

This is for the second call to AddSpecialDir in Init():

1[20057f48]: nsResProtocolHandler::AddSpecialDir(aSpecialDir="GreD",
aSubstitution="gre")
1[20057f48]: file->nativePath="."
1[20057f48]: nsResProtocolHandler::SetSubstitution(root="gre",
baseURI=0x20aae168, baseURI->Path="/")

So for some reason, when run with the command "./mozilla" in dist/bin, the GreD
variable is set to ".", which when turned into a nsIURI gets the path "/".

Now when I run Mozilla with its full path (i.e.
/home/pkw/sb/mozilla/trunk/mozilla/obj-debug/dist/bin/mozilla), it starts
correctly and I get the following log entries:

1[20057f48]: nsResProtocolHandler::AddSpecialDir(aSpecialDir="CurProcD",
aSubstitution="")
1[20057f48]:
file->nativePath="/home/pkw/sb/mozilla/trunk/mozilla/obj-debug/dist/bin"
1[20057f48]: nsResProtocolHandler::SetSubstitution(root="", baseURI=0x209d0748,
baseURI->Path="/home/pkw/sb/mozilla/trunk/mozilla/obj-debug/dist/bin/")

1[20057f48]: nsResProtocolHandler::AddSpecialDir(aSpecialDir="GreD",
aSubstitution="gre")
1[20057f48]:
file->nativePath="/home/pkw/sb/mozilla/trunk/mozilla/obj-debug/dist/bin"
1[20057f48]: nsResProtocolHandler::SetSubstitution(root="gre",
baseURI=0x209d0bf8,
baseURI->Path="/home/pkw/sb/mozilla/trunk/mozilla/obj-debug/dist/bin/")

In the Mozilla startup script, the MOZILLA_FIVE_HOME variable is set to `dirname
$0`, so in the first case it is ".", in the second one it is
"/home/pkw/sb/mozilla/trunk/mozilla/obj-debug/dist/bin". Maybe there is just a
path that needs to be normalized somewhere?
Beautiful work. That is a problem, because initializing a nsILocalFile with a
relative path doesn't work, but we don't fail properly. I can think of several
solutions

1) make initializing an nsILocalFile work correctly with a relative path (i.e.
make the path absolute during initialization)

2) in the standalone glue, use some sort of helper function to make a relative
path absolute

3) in the run-mozilla script, make the MOZILLA_FIVE_HOME absolute (using `pwd` I
suppose).
You probably just want to call nsILocalFile->Normalize at the right location, I
just can't find where that is right now. Where is the GreD directory initialized?
It appears that normalize() is already called. The comments for nsILocalFile
specifically disallow initializing it with a relative path.

http://lxr.mozilla.org/seamonkey/source/xpcom/io/nsDirectoryService.cpp#256
I don't know if that's where the value for NS_GRE_DIR is being set. I added some
printfs to nsDirectoryService::Get() and nsDirectoryService::Set(), and here's
what I'm seeing:

nsDirectoryService::Get(prop=GreD)
Found GREDir value in mProviders
nsDirectoryService::Set(prop=GreD)
Setting GreD to path .

Then later on:

nsDirectoryService::Get(prop=GreD)
Found GREDir value in hash

Hack # 3 has solved my problems with Mozilla-solaris-sparc2.7 ,probably related
to bugs 221405 220777,221048, etc. etc . etc. 

"3) in the run-mozilla script, make the MOZILLA_FIVE_HOME absolute (using `pwd` I
suppose). "

Attached patch Patch v1 (obsolete) — Splinter Review
Seems to fix the problem on my end...
Attachment #132828 - Flags: superreview?(dougt)
Attachment #132828 - Flags: review?(darin)
Hack #3 only seems to work if I run it directly from my build directory, just in
case that question was directed at me
Reassigning bug.
Assignee: general → pkw
Component: Browser-General → XPCOM
Changing QA contact.
Status: NEW → ASSIGNED
QA Contact: general → scc
*** Bug 220777 has been marked as a duplicate of this bug. ***
*** Bug 221048 has been marked as a duplicate of this bug. ***
Blocks: 221563
*** Bug 221405 has been marked as a duplicate of this bug. ***
Comment on attachment 132828 [details] [diff] [review]
Patch v1

where is the path coming from?	Is it from an env var or from the gre.conf
file?  Why can't that just be normalized?
Attachment #132828 - Flags: superreview?(dougt) → superreview-
This path is coming from the MOZILLA_FIVE_HOME environment variable. I changed
the GRE code to normalize the path so it behaves consistently with the
GetCurrentProcessDirectory function in nsDirectoryService.cpp (snippet shown here):

251     char *moz5 = PR_GetEnv("MOZILLA_FIVE_HOME");
252 
253     if (moz5)
254     {
255         localFile->InitWithNativePath(nsDependentCString(moz5));
256         localFile->Normalize();
257         *aFile = localFile;
258         return NS_OK;
259     }
can you move the normalization into GetGREDirectoryPath()
Attachment #132828 - Flags: review?(darin)
Attachment #132828 - Attachment is obsolete: true
Attached patch Patch v2Splinter Review
This patch moves the normalization into GetCurrentProcessDirectory(). This
assumes this only place where relative paths will be coming from is the
MOZILLA_FIVE_HOME environment variable, and not from GRE configuration files.
Attachment #133422 - Flags: superreview?(dougt)
Attachment #133422 - Flags: review?(darin)
Comment on attachment 133422 [details] [diff] [review]
Patch v2

r=dougt
Attachment #133422 - Flags: superreview?(dougt) → superreview+
Comment on attachment 133422 [details] [diff] [review]
Patch v2

what about the #ifdef's?
nevermind that last comment, we are in a "#elif defined(XP_UNIX)"
Comment on attachment 133422 [details] [diff] [review]
Patch v2

>Index: xpcom/glue/standalone/nsGREDirServiceProvider.cpp

>+        if (realpath(moz5, buf))
>+            resultPath = strdup(buf);
>+        else
>+            resultPath = strdup(moz5);

reading the linux (rh9) man page on realpath doesn't give
me much confidence that this is going to always work.

this bit is interesting:

CONFORMING TO
       In  BSD	4.4 and Solaris the limit on the pathname length is MAXPATHLEN
       (found in <sys/param.h>). The SUSv2 prescribes PATH_MAX	and  NAME_MAX,
       as  found in <limits.h> or provided by the pathconf() function. A typi-
       cal source fragment would be

	      #ifdef PATH_MAX
		path_max = PATH_MAX;
	      #else
		path_max = pathconf (path, _PC_PATH_MAX);
		if (path_max <= 0)
		  path_max = 4096;
	      #endif

       The BSD 4.4, Linux and SUSv2 versions always return  an	absolute  path
       name. Solaris may return a relative path name when the path argument is
       relative.  The prototype of realpath is given in  <unistd.h>  in  libc4
       and libc5, but in <stdlib.h> everywhere else.

the bit about Solaris returning a relative path is very concerning.  are you
sure this is what we want here?  seems to me that using realpath is just
opening
a big can of portability problems.
Attachment #133422 - Flags: review?(darin) → review-
Comment on attachment 133422 [details] [diff] [review]
Patch v2

well, ok... seems like nsLocalFileUnix.cpp uses realpath in this manner, so
maybe _nevermind_ ;-)

r/sr=darin

though, i still wonder about what that man page was saying... seems like we
should worry, no?
Attachment #133422 - Flags: review- → review+
OS: AIX → All
Hardware: Other → All
Summary: Builds after 2003/09/13 don't start on AIX → Unix builds after 2003/09/13 don't start when run with a relative path
Fixed.

Checking in nsGREDirServiceProvider.cpp;
/cvsroot/mozilla/xpcom/glue/standalone/nsGREDirServiceProvider.cpp,v  <-- 
nsGREDirServiceProvider.cpp
new revision: 1.22; previous revision: 1.21
done
Status: ASSIGNED → RESOLVED
Closed: 21 years ago
Resolution: --- → FIXED
Yep, it's working now on Solaris (original bug #221048). Thanks!
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: