On Mon, Jul 14, 2008 at 01:31:39PM +0200, Mike Hommey wrote:
> On Mon, Jul 14, 2008 at 01:23:00PM +0200, Sven Joachim wrote:
> > forwarded 489733 https://bugzilla.mozilla.org/show_bug.cgi?id=278738
> > thanks
> >
> > On 2008-07-14 13:18 +0200, Mike Hommey wrote:
> >
> > > On Mon, Jul 14, 2008 at 12:28:51PM +0200, Sven Joachim wrote:
> > >> But it will not trigger the bug. Instead I have found a way to
> > >> reproduce it:
> > >>
> > >> --8<---------------cut here---------------start------------->8---
> > >> # create scratch directory
> > >> mkdir /tmp/scratch
> > >> cd /tmp/scratch
> > >> # create a bunch of files for the listing
> > >> touch $(seq 500)
> > >> # create a big file
> > >> dd if=/dev/zero of=sparse-file bs=1 count=0 seek=2G
> > >> --8<---------------cut here---------------end--------------->8---
> > >>
> > >> => The listing of /tmp/scratch in the browsers is truncated.
> > >>
> > >> This will very likely not be reproducible under amd64, so you should get
> > >> yourself an i386 chroot for it. In the original directory I have a 4G
> > >> DVD image which triggered the problem.
> > >
> > > It doesn't display anything here, though I didn't do the touch $(seq
> > > 500)...
> >
> > Probably it doesn't display anything _because_ you didn't run the touch
> > command. Meanwhile I found an upstream bug at
> > https://bugzilla.mozilla.org/show_bug.cgi?id=278738 that states
> > compiling with -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 might work.
>
> I doubt that, because of some bad casting.
>
> Can you try the attached patch?
Hum, this one should be better.
Mike
diff --git a/xpcom/io/nsLocalFileUnix.cpp b/xpcom/io/nsLocalFileUnix.cpp
index 99f52a6..cb60923 100644
--- a/xpcom/io/nsLocalFileUnix.cpp
+++ b/xpcom/io/nsLocalFileUnix.cpp
@@ -280,12 +280,21 @@ nsLocalFile::nsLocalFileConstructor(nsISupports *outer,
nsresult
nsLocalFile::FillStatCache() {
+#ifdef HAVE_STAT64
+ if (stat64(mPath.get(), &mCachedStat) == -1) {
+ // try lstat it may be a symlink
+ if (lstat64(mPath.get(), &mCachedStat) == -1) {
+ return NSRESULT_FOR_ERRNO();
+ }
+ }
+#else
if (stat(mPath.get(), &mCachedStat) == -1) {
// try lstat it may be a symlink
if (lstat(mPath.get(), &mCachedStat) == -1) {
return NSRESULT_FOR_ERRNO();
}
}
+#endif
mHaveCachedStat = PR_TRUE;
return NS_OK;
}
@@ -1109,9 +1118,12 @@ nsLocalFile::GetFileSize(PRInt64 *aFileSize)
}
#endif
- /* XXX autoconf for and use stat64 if available */
if (!S_ISDIR(mCachedStat.st_mode)) {
+#ifdef HAVE_STAT64
+ *aFileSize = mCachedStat.st_size;
+#endif
LL_UI2L(*aFileSize, (PRUint32)mCachedStat.st_size);
+#endif
}
return NS_OK;
}
@@ -1137,10 +1149,15 @@ nsLocalFile::GetFileSizeOfLink(PRInt64 *aFileSize)
NS_ENSURE_ARG(aFileSize);
struct stat sbuf;
+#ifdef HAVE_LSTAT64
+ if (lstat64(mPath.get(), &sbuf) == -1)
+ return NSRESULT_FOR_ERRNO();
+ *aFileSize = sbuf.st_size;
+#else
if (lstat(mPath.get(), &sbuf) == -1)
return NSRESULT_FOR_ERRNO();
- /* XXX autoconf for and use lstat64 if available */
LL_UI2L(*aFileSize, (PRUint32)sbuf.st_size);
+#endif
return NS_OK;
}
diff --git a/xpcom/io/nsLocalFileUnix.h b/xpcom/io/nsLocalFileUnix.h
index 9203b33..c51f2d9 100644
--- a/xpcom/io/nsLocalFileUnix.h
+++ b/xpcom/io/nsLocalFileUnix.h
@@ -113,7 +113,11 @@ private:
~nsLocalFile() {}
protected:
+#ifdef HAVE_STAT64
+ struct stat64 mCachedStat;
+#else
struct stat mCachedStat;
+#endif
nsCString mPath;
PRPackedBool mHaveCachedStat;