nixpkgs/pkgs/applications/networking/browsers/firefox/symlinks-bug551152.patch

140 lines
4.9 KiB
Diff
Raw Normal View History

The firefox people has not applied this patch along all the 3.6 releases so in 3.6.4 it is still not there.
https://bugzilla.mozilla.org/show_bug.cgi?id=551152
https://bugzilla.mozilla.org/attachment.cgi?id=431403
diff --git a/xpcom/reflect/xptinfo/src/xptiInterfaceInfoManager.cpp b/xpcom/reflect/xptinfo/src/xptiInterfaceInfoManager.cpp
index 57f6df9..e9909a7 100644
--- a/xpcom/reflect/xptinfo/src/xptiInterfaceInfoManager.cpp
+++ b/xpcom/reflect/xptinfo/src/xptiInterfaceInfoManager.cpp
@@ -633,10 +633,6 @@ IndexOfDirectoryOfFile(nsISupportsArray* aSearchPath, nsILocalFile* aFile)
aSearchPath->QueryElementAt(i, NS_GET_IID(nsIFile),
getter_AddRefs(current));
NS_ASSERTION(current, "broken search path! bad element");
- // nsIFile::Equals basically compares path strings so normalize
- // before the comparison.
- parent->Normalize();
- current->Normalize();
PRBool same;
if (NS_SUCCEEDED(parent->Equals(current, &same)) && same)
return (int) i;
diff --git a/xpcom/tests/unit/test_file_equality.js b/xpcom/tests/unit/test_file_equality.js
index 4f424fe..14ba5a8 100644
--- a/xpcom/tests/unit/test_file_equality.js
+++ b/xpcom/tests/unit/test_file_equality.js
@@ -63,7 +63,7 @@ function test_normalized_vs_non_normalized()
// this is a non-normalized version of tmp1, it should not equal tmp1
tmp2.appendRelativePath(".");
- do_check_false(tmp1.equals(tmp2));
+ do_check_true(tmp1.equals(tmp2));
// normalize and make sure they are equivalent again
tmp2.normalize();
diff --git a/xulrunner/stub/nsXULStub.cpp b/xulrunner/stub/nsXULStub.cpp
index dc3a592..b270175 100644
--- a/xulrunner/stub/nsXULStub.cpp
+++ b/xulrunner/stub/nsXULStub.cpp
@@ -490,14 +490,6 @@ main(int argc, char **argv)
range.lower, range.upper);
return 1;
}
-#ifdef XP_UNIX
- // Using a symlinked greDir will fail during startup. Not sure why, but if
- // we resolve the symlink, everything works as expected.
- char resolved_greDir[MAXPATHLEN] = "";
- if (realpath(greDir, resolved_greDir) && *resolved_greDir) {
- strncpy(greDir, resolved_greDir, MAXPATHLEN);
- }
-#endif
}
#ifdef XP_OS2
diff --git a/xpcom/io/nsLocalFileOSX.mm b/xpcom/io/nsLocalFileOSX.mm
index bbe2b26..6f51638 100644
--- a/xpcom/io/nsLocalFileOSX.mm
+++ b/xpcom/io/nsLocalFileOSX.mm
@@ -1068,6 +1068,9 @@ NS_IMETHODIMP nsLocalFile::Clone(nsIFile **_retval)
NS_IMETHODIMP nsLocalFile::Equals(nsIFile *inFile, PRBool *_retval)
{
+ struct STAT st, inst;
+ PRBool exists = PR_TRUE;
+
NS_ENSURE_ARG(inFile);
NS_ENSURE_ARG_POINTER(_retval);
*_retval = PR_FALSE;
@@ -1077,7 +1080,27 @@ NS_IMETHODIMP nsLocalFile::Equals(nsIFile *inFile, PRBool *_retval)
if (NS_FAILED(rv))
return rv;
- *_retval = !strcmp(mPath, inPath.get());
+ if (STAT(mPath.get(), &st) == -1) {
+ // try lstat it may be a symlink
+ if (LSTAT(mPath.get(), &st) == -1)
+ exists = PR_FALSE;
+ }
+
+ if (exists && (STAT(inPath.get(), &inst) == -1)) {
+ // try lstat it may be a symlink
+ if (LSTAT(inPath.get(), &inst) == -1)
+ exists = PR_FALSE;
+ }
+
+ if (!exists) {
+ // We don't need to worry about "/foo/" vs. "/foo" here
+ // because trailing slashes are stripped on init.
+ *_retval = !strcmp(inPath.get(), mPath.get());
+ return NS_OK;
+ }
+
+ *_retval = (st.st_ino == inst.st_ino) &&
+ (st.st_dev == inst.st_dev);
return NS_OK;
}
diff --git a/xpcom/io/nsLocalFileUnix.cpp b/xpcom/io/nsLocalFileUnix.cpp
index 289600a..bdf0f81 100644
--- a/xpcom/io/nsLocalFileUnix.cpp
+++ b/xpcom/io/nsLocalFileUnix.cpp
@@ -1400,6 +1400,9 @@ nsLocalFile::IsSpecial(PRBool *_retval)
NS_IMETHODIMP
nsLocalFile::Equals(nsIFile *inFile, PRBool *_retval)
{
+ struct STAT st, inst;
+ PRBool exists = PR_TRUE;
+
NS_ENSURE_ARG(inFile);
NS_ENSURE_ARG_POINTER(_retval);
*_retval = PR_FALSE;
@@ -1409,9 +1412,27 @@ nsLocalFile::Equals(nsIFile *inFile, PRBool *_retval)
if (NS_FAILED(rv))
return rv;
- // We don't need to worry about "/foo/" vs. "/foo" here
- // because trailing slashes are stripped on init.
- *_retval = !strcmp(inPath.get(), mPath.get());
+ if (STAT(mPath.get(), &st) == -1) {
+ // try lstat it may be a symlink
+ if (LSTAT(mPath.get(), &st) == -1)
+ exists = PR_FALSE;
+ }
+
+ if (exists && (STAT(inPath.get(), &inst) == -1)) {
+ // try lstat it may be a symlink
+ if (LSTAT(inPath.get(), &inst) == -1)
+ exists = PR_FALSE;
+ }
+
+ if (!exists) {
+ // We don't need to worry about "/foo/" vs. "/foo" here
+ // because trailing slashes are stripped on init.
+ *_retval = !strcmp(inPath.get(), mPath.get());
+ return NS_OK;
+ }
+
+ *_retval = (st.st_ino == inst.st_ino) &&
+ (st.st_dev == inst.st_dev);
return NS_OK;
}