summaryrefslogtreecommitdiffstats
path: root/main/firefox
diff options
context:
space:
mode:
authorNatanael Copa <ncopa@alpinelinux.org>2014-10-29 16:02:02 +0000
committerNatanael Copa <ncopa@alpinelinux.org>2014-10-29 16:38:44 +0000
commit95489293ef40dfd46498b08f2dfb3b6fa1c288ec (patch)
tree5a4391756bb5fbe4172b852add03e1086b74f64b /main/firefox
parentee754870689436f39cc3500b4d3af63435fb0eb3 (diff)
downloadaports-95489293ef40dfd46498b08f2dfb3b6fa1c288ec.tar.bz2
aports-95489293ef40dfd46498b08f2dfb3b6fa1c288ec.tar.xz
main/firefox: upgrade to 31.2.0 esr
dont build xulrunner separately
Diffstat (limited to 'main/firefox')
-rw-r--r--main/firefox/0002-Use-C99-math-isfinite.patch29
-rw-r--r--main/firefox/0003-xulrunner-jemalloc-aslr.patch67
-rw-r--r--main/firefox/APKBUILD201
-rw-r--r--main/firefox/duckduckgo.patch36
-rw-r--r--main/firefox/fix-arm-atomics-grsec.patch342
-rw-r--r--main/firefox/fix-ipc.patch66
-rw-r--r--main/firefox/fix-media-webrtc.patch14
-rw-r--r--main/firefox/fix-media.patch38
-rw-r--r--main/firefox/fix-netwerk.patch37
-rw-r--r--main/firefox/fix-toolkit.patch151
-rw-r--r--main/firefox/fix-tools.patch49
-rw-r--r--main/firefox/getchar.patch14
-rw-r--r--main/firefox/mozconfig65
-rw-r--r--main/firefox/mozilla-build-arm.patch11
-rw-r--r--main/firefox/rhbz-966424.patch14
-rw-r--r--main/firefox/stab.h71
-rw-r--r--main/firefox/stat.patch25
17 files changed, 1093 insertions, 137 deletions
diff --git a/main/firefox/0002-Use-C99-math-isfinite.patch b/main/firefox/0002-Use-C99-math-isfinite.patch
new file mode 100644
index 000000000..03f830bca
--- /dev/null
+++ b/main/firefox/0002-Use-C99-math-isfinite.patch
@@ -0,0 +1,29 @@
+From cdb9db4c1c593dbe22db4f389a62fce034f31f2d Mon Sep 17 00:00:00 2001
+From: Natanael Copa <ncopa@alpinelinux.org>
+Date: Fri, 25 Nov 2011 08:30:51 +0000
+Subject: [PATCH 2/4] Use C99 math isfinite
+
+---
+ xpcom/ds/nsMathUtils.h | 6 +++++-
+ 2 files changed, 6 insertions(+), 2 deletions(-)
+
+diff --git a/xpcom/ds/nsMathUtils.h b/xpcom/ds/nsMathUtils.h
+index 21ffbec..2e80476 100644
+--- a/xpcom/ds/nsMathUtils.h
++++ b/xpcom/ds/nsMathUtils.h
+@@ -131,7 +131,11 @@ inline NS_HIDDEN_(bool) NS_finite(double d)
+ // NOTE: '!!' casts an int to bool without spamming MSVC warning C4800.
+ return !!_finite(d);
+ #else
+- return finite(d);
++#ifdef _GLIBCXX_CMATH
++ return std::isfinite(d);
++#else
++ return isfinite(d);
++#endif
+ #endif
+ }
+
+--
+1.7.7.4
+
diff --git a/main/firefox/0003-xulrunner-jemalloc-aslr.patch b/main/firefox/0003-xulrunner-jemalloc-aslr.patch
new file mode 100644
index 000000000..7aa00009f
--- /dev/null
+++ b/main/firefox/0003-xulrunner-jemalloc-aslr.patch
@@ -0,0 +1,67 @@
+From 88bb9f90ec1e4b43fb78596c8ff7577c92592eb4 Mon Sep 17 00:00:00 2001
+From: Natanael Copa <ncopa@alpinelinux.org>
+Date: Fri, 25 Nov 2011 08:36:52 +0000
+Subject: [PATCH 3/4] xulrunner: jemalloc aslr
+
+---
+ memory/jemalloc/jemalloc.c | 33 ++++++++++++++++++++++-----------
+ 1 files changed, 22 insertions(+), 11 deletions(-)
+
+diff --git a/memory/jemalloc/jemalloc.c b/memory/jemalloc/jemalloc.c
+index ad7c450..91de92c 100644
+--- a/memory/mozjemalloc/jemalloc.c
++++ b/memory/mozjemalloc/jemalloc.c
+@@ -410,7 +410,7 @@ void *_mmap(void *addr, size_t length, int prot, int flags,
+ static const bool __isthreaded = true;
+ #endif
+
+-#if defined(MOZ_MEMORY_SOLARIS) && defined(MAP_ALIGN) && !defined(JEMALLOC_NEVER_USES_MAP_ALIGN)
++#if defined(MOZ_MEMORY_SOLARIS) || defined(MOZ_MEMORY_LINUX) || defined(MOZ_MEMORY_BSD)
+ #define JEMALLOC_USES_MAP_ALIGN /* Required on Solaris 10. Might improve performance elsewhere. */
+ #endif
+
+@@ -2181,20 +2181,31 @@ pages_map_align(size_t size, int pfd, size_t alignment)
+ * We don't use MAP_FIXED here, because it can cause the *replacement*
+ * of existing mappings, and we only want to create new mappings.
+ */
+-#ifdef MALLOC_PAGEFILE
+- if (pfd != -1) {
+- ret = mmap((void *)alignment, size, PROT_READ | PROT_WRITE, MAP_PRIVATE |
+- MAP_NOSYNC | MAP_ALIGN, pfd, 0);
+- } else
+-#endif
+- {
+- ret = mmap((void *)alignment, size, PROT_READ | PROT_WRITE, MAP_PRIVATE |
+- MAP_NOSYNC | MAP_ALIGN | MAP_ANON, -1, 0);
+- }
++ ret = mmap(NULL, size + alignment, PROT_READ | PROT_WRITE, MAP_PRIVATE |
++ MAP_NOSYNC| MAP_ANON, -1, 0);
+ assert(ret != NULL);
+
+ if (ret == MAP_FAILED)
+ ret = NULL;
++ else {
++ uintptr_t aligned_ret;
++ size_t extra_size;
++
++ aligned_ret = (uintptr_t)ret + alignment - 1;
++ aligned_ret &= ~(alignment - 1);
++ extra_size = aligned_ret - (uintptr_t)ret;
++ munmap(ret, extra_size);
++ munmap(ret + extra_size + size, alignment - extra_size);
++ ret = (void *)aligned_ret;
++#ifdef MALLOC_PAGEFILE
++ if (pfd != -1) {
++ ret = mmap(ret, size, PROT_READ | PROT_WRITE, MAP_PRIVATE |
++ MAP_NOSYNC | MAP_FIXED, pfd, 0);
++ }
++ if (ret == MAP_FAILED)
++ ret = NULL;
++#endif
++ }
+ return (ret);
+ }
+ #endif
+--
+1.7.7.4
+
diff --git a/main/firefox/APKBUILD b/main/firefox/APKBUILD
index 8707331f7..524d6a06d 100644
--- a/main/firefox/APKBUILD
+++ b/main/firefox/APKBUILD
@@ -1,84 +1,96 @@
# Contributor: William Pitcock <nenolod@dereferenced.org>
# Maintainer: Natanael Copa <ncopa@alpinelinux.org>
pkgname=firefox
-pkgver=31.1.1
+pkgver=31.2.0
_pkgver=$pkgver
_xulver=$pkgver
-pkgrel=0
-pkgdesc="firefox web browser"
+pkgrel=1
+pkgdesc="Firefox web browser"
url="http://www.firefox.com"
arch="all"
license="GPL LGPL MPL"
-depends="xulrunner>=${_xulver}"
-makedepends="xulrunner-dev>=${_xulver}
-
- nspr-dev
- nss-dev
- gtk+-dev
- mesa-dev
- icu-dev
- dbus-glib-dev
- alsa-lib-dev
- libvorbis-dev
- libogg-dev
- libtheora-dev
- wireless-tools-dev
- libnotify-dev
- libevent-dev
- libvpx-dev
- libxt-dev
- libjpeg-turbo-dev
- bzip2-dev
- hunspell-dev
- startup-notification-dev
- sqlite-dev
- libidl-dev
- gstreamer1-dev
- gst-plugins-base1-dev
-
- autoconf2.13
-
- sed
- python
- zip
- yasm
-
- autoconf
- automake
- libtool
-
- paxctl"
+depends=""
+depends_dev="
+ alsa-lib-dev
+ bzip2-dev
+ dbus-glib-dev
+ gst-plugins-base1-dev
+ gstreamer1-dev
+ gtk+2.0-dev
+ hunspell-dev
+ icu-dev
+ libevent-dev
+ libidl-dev
+ libjpeg-turbo-dev
+ libnotify-dev
+ libogg-dev
+ libtheora-dev
+ libvorbis-dev
+ libvpx-dev
+ libxt-dev
+ libxcomposite-dev
+ mesa-dev
+ nspr-dev
+ nss-dev
+ sqlite-dev
+ startup-notification-dev
+ wireless-tools-dev
+ "
+makedepends="$depends_dev
+ autoconf
+ automake
+ libtool
+ paxctl
+ python
+ sed
+ yasm
+ zip
+ "
+
install=""
-subpackages="$pkgname-pdfjs $pkgname-dbg"
+subpackages="$pkgname-dbg $pkgname-dev"
source="ftp://ftp.mozilla.org/pub/firefox/releases/${pkgver}esr/source/firefox-${pkgver}esr.source.tar.bz2
mozconfig
- duckduckgo.patch
vendor.js
+
+ 0002-Use-C99-math-isfinite.patch
+ fix-arm-atomics-grsec.patch
+ fix-ipc.patch
+ fix-media-webrtc.patch
+ fix-media.patch
+ fix-netwerk.patch
+ fix-toolkit.patch
+ fix-tools.patch
+ getchar.patch
+ mozilla-build-arm.patch
+ stat.patch
+ stab.h
+
+ rhbz-966424.patch
+
firefox.desktop
firefox-safe.desktop"
-_builddir="${srcdir}/mozilla-esr31"
+_builddir="${srcdir}/mozilla-esr${pkgver%%.*}"
_mozappdir=/usr/lib/firefox-$pkgver
+_mozappdirdev=/usr/lib/firefox-devel-$pkgver
+
+# help our shared-object scanner to find the libs
+ldpath="$_mozappdir"
prepare() {
local i
- cd "$_builddir"
+ cd "$_builddir" || return 1
for i in $source; do
case $i in
*.patch) msg $i; patch -p1 -i "$srcdir"/$i || return 1;;
esac
done
+ cp "$srcdir"/stab.h toolkit/crashreporter/google-breakpad/src/
cp "${srcdir}/mozconfig" .mozconfig
- sed -e "s/#${CLIBC}#//g" -i .mozconfig
-
- echo "ac_add_options --with-libxul-sdk=$(pkg-config --variable=sdkdir libxul)" >> .mozconfig
- if [ -n "$DEBUG" ]; then
- echo "ac_add_options --enable-debug-symbols" >> .mozconfig
- echo "ac_add_options --disable-install-strip" >>.mozconfig
- fi
}
build() {
@@ -88,14 +100,21 @@ build() {
export CFLAGS="$(echo $CFLAGS | sed -e 's/-Wall//' -e 's/-fexceptions/-fno-exceptions/g')"
export CXXFLAGS="$CFLAGS"
-# export LDFLAGS="-Wl,-rpath,${_mozappdir}"
- make -j1 -f client.mk build \
+ # set rpath so linker finds the libs
+ export LDFLAGS="$LDFLAGS -Wl,-rpath,${_mozappdir}"
+
+ make -f client.mk build \
STRIP="/bin/true" \
- MOZ_MAKE_FLAGS="$MAKEOPTS" || return 1
+ || return 1
}
package() {
cd "$_builddir"
+
+ # only used for startupcache creation.
+ local paxflags="-msp"
+ paxctl -c $paxflags */dist/bin/xpcshell || return 1
+
make -j1 -f client.mk install \
DESTDIR="$pkgdir" \
MOZ_MAKE_FLAGS="$MAKEOPTS" \
@@ -132,31 +151,73 @@ __EOF__
chmod 755 "$pkgdir"/usr/bin/firefox
# install our vendor prefs
+ install -d "$pkgdir"/$_mozappdir/browser/defaults/preferences
cat "$srcdir"/vendor.js >> "$pkgdir"/$_mozappdir/browser/defaults/preferences/firefox-branding.js
+
+ # remove copied, huge, libraries
+ rm -f "$pkgdir"/${_mozappdirdev}/sdk/lib/libmozjs.so
+ rm -f "$pkgdir"/${_mozappdirdev}/sdk/lib/libmozalloc.so
+ rm -f "$pkgdir"/${_mozappdirdev}/sdk/lib/libxul.so
}
-pdfjs() {
- pkgdesc="Firefox PDF Reader in JavaScript"
- mkdir -p "$subpkgdir"/$_mozappdir/browser/chrome
- mv "$pkgdir"/$_mozappdir/browser/chrome/pdfjs \
- "$subpkgdir"/$_mozappdir/browser/chrome/
+dev() {
+ mkdir -p "$subpkgdir"/${_mozappdirdev%/*}
+ mv "$pkgdir"/${_mozappdirdev} "$subpkgdir"/${_mozappdirdev%/*} \
+ || return 1
+ default_dev
}
-md5sums="7cd2d7cf51fdeb47eb6b6d0d551610d4 firefox-31.1.1esr.source.tar.bz2
-11e6b4bb7593d79fe8827952a3e73c74 mozconfig
-6b8d481d8fba55fa0ad4f26c02164da8 duckduckgo.patch
+md5sums="5c1ec8aacf65118bfa4598d15453b485 firefox-31.2.0esr.source.tar.bz2
+1f4c60e662ed93784431bd06c5141719 mozconfig
1515663477ce427cbdc42f04d8d5ca4e vendor.js
+f43c1f0ae57aa8289b130c6de8caf3ce 0002-Use-C99-math-isfinite.patch
+b18bd948aae828e5c8f5f63e440c96d6 fix-arm-atomics-grsec.patch
+38a9c0d5be155164d50a956ac131d991 fix-ipc.patch
+ce4839160acf3986a2118326ed2b8444 fix-media-webrtc.patch
+960d56439a375998ce4e4597bf245375 fix-media.patch
+170b8e7f8cab21f0965f226c291a57f9 fix-netwerk.patch
+296954be4c6d6bfcc24d0a46a2bd7d74 fix-toolkit.patch
+2279c55a85013fc1c0d01427768edd4d fix-tools.patch
+507742325de8687529e4e81e31132ddf getchar.patch
+308ba5b54116a035fe68d0d5c3974857 mozilla-build-arm.patch
+d9a2245b93a7f5855ee029b5fa44e4e9 stat.patch
+4383d038b8d8411ea46f4a109197c19e stab.h
+15ebeeeb6823c185f4fed98e9bf1b786 rhbz-966424.patch
ba96924ece1d77453e462429037a2ce5 firefox.desktop
6f38a5899034b7786cb1f75ad42032b8 firefox-safe.desktop"
-sha256sums="79be660e766b5adfaf3fc8031804bd64d27d330231f0de5995dd89671d1998d2 firefox-31.1.1esr.source.tar.bz2
-dca72a9f140bbc37ec7a9bd81ee886f6730b5866fce4e6ca1ebd48ee4df52c42 mozconfig
-db057fd5448c3e4d40459fb8ee178296cc723e19efadb1e02a85a4e22a6e560a duckduckgo.patch
+sha256sums="02de399cbf467ea536042008d1e0cd4ac6ffdc9b469d3189384f02ec0590d378 firefox-31.2.0esr.source.tar.bz2
+23c2b4535ce83c92ba978e15ce328c9f140def155d12523c00df30baf41b98dc mozconfig
d72ca759792cc8c88efc664d30087a139fed7fc3d7d058e4cd9ab287bb80ea46 vendor.js
+2f319883300f2aef180bfb80221151fcbb29344a5a0a086d6ad1d80005daf039 0002-Use-C99-math-isfinite.patch
+ff7cb3c9c4712e0517a6f11e3bf08e9b0d13dbe6384930bdc7f55b1ceed039b5 fix-arm-atomics-grsec.patch
+059a69ff0dbceeaa5bbb1446aa4233bc578a047fcad22c0efa27dc64bbd72980 fix-ipc.patch
+3e53af8beff122bcf5790c148fb51f41f44b6fe5dd5799777b70c3542c32cb93 fix-media-webrtc.patch
+d582712c28a26679d728d21d2ef8964d119182edaf580a948f57a9e808ccc5cf fix-media.patch
+4a2f8ff5e9b1359541eba8854098cee2caeb40ad9dbdc4b8fcf48b47ea8ca2d2 fix-netwerk.patch
+666883189dba3f4c7ba6b5bc85026c85bcb84477c2d5ba00d6414ddd0f744368 fix-toolkit.patch
+60ed0870119480994c6c455034c52dd21b8482b7617c3a0032e3b2abf4467e4d fix-tools.patch
+d14357bf44f702d94b8d3ed79bdf81f6271370745c1ac8fa83522bd98be4adc4 getchar.patch
+6f5f5e4d2a17182b72b248e896450235ccdaf63252fdb89a8deb55da8adc9be3 mozilla-build-arm.patch
+a0f8a0fa9977ee43f3853b6c6bf5a506fdfabdfa32b4279e0ac3d7a3078f34cc stat.patch
+960d82bbfdc88c95f5cb4f2e1c1bf23dae7519b3b7203914d7b3ddbff1ba4c28 stab.h
+a50d15a640f230a2c66e1eb2afd2bed4117605d0f1591dcfec1ca30f0bc2352f rhbz-966424.patch
b571c4a49884a3c98806246c9cc3e60c73d5a8f4aeb7f96217db0be1d6210eda firefox.desktop
4b6de45753856a890f4482055666e77f9b01bdfb7e0df08bafaa3a4d9937eed3 firefox-safe.desktop"
-sha512sums="9c01a4443f7269e9f9584d199b3028fe9e442f22ed58035c5e48e84be1f633c5ecc1f462f46d4282f25a975981ed72b4c2519a19423cc0ee0d71c1bfac6d649c firefox-31.1.1esr.source.tar.bz2
-869b7eb925ccc055ecc3b6fddfa4419b5d2b650d627e551564f76788ed157e1c0a6a42e52e92f65d330957d4839954590ca6f6cf6f26a54a8490bdef18047180 mozconfig
-a7d6a0420f70374a2fa6a74a18ab15c77451f45dc9226ec251f5635a970dbd45ed6cf571ae5ab81b8126951667fc61b1fc5dfb7b8a4d7cc6d465d39e842dc985 duckduckgo.patch
+sha512sums="444a6adb2343041eccc91440770f4cce102206471ab10e0b4bc22ecc09cd84271843cce003867928ab6389033f9c5d20cc81bff49a6fe10172c4e50def8a63e5 firefox-31.2.0esr.source.tar.bz2
+e14b4a646230f7a752ef864b0e6a074fdac74d6c4abde2c31656eb10ac6f002a5c664d257bf3f4bd22544f10103e38d5fae49f84fcaae402b81940e72bcfe0e5 mozconfig
93570f821e59af4d233fc4b1df85e1d145a5e041ad402fd72921987a5a2f5218538d7a13d59bbf0bda5e7df1d5281407674a3765625936340106d1185b15b5d8 vendor.js
+9a6666a3b637549411ea562c9d0d6d617ed48327d0f9e4e64d27f43774c218e6c5cf5fa99d4b339a5a0f89b854a18079392eba0dafc3419adbd4cdd5d71d3f26 0002-Use-C99-math-isfinite.patch
+4311464ae52b6d2e2b02c789c6d5fca9b3c211888a983aa609a62c2f2554516fea735ea90673387c69b38a30aa8453ed79faa44b5163df4293880d40df676b2d fix-arm-atomics-grsec.patch
+3f360d4231355c268fc52e0fedbce5c4f73ad8d60d9424af8641733c0ae181e6226056e605f0d6653b729a9c8e4abe97a9fb2face25938651a7498d5753cea8b fix-ipc.patch
+a5d00272fc9e2b3a786f5891bac11b04ffaf6dfcbd2b30cba42286b79d12fefb6cb9c81e6d75987ab3ee19d12af20a074c77edc655bd470be06f5025eb38e609 fix-media-webrtc.patch
+58e0e7c1c368530b58aa143be0403d733c4b82cc1a9964c925278e5eff147b2ec2c8c34a6cb217387cb7e9f2ca13c2e299745015edaac510704963282dc68e79 fix-media.patch
+8a896ee4d1465a844351cec84217de1a28b9f27bfc1e34cc71368664b5b8804bd66bdcadc78c78ee365abd1d0cafed1e6c568045c93cb78ac94e2818f503d58c fix-netwerk.patch
+72459754016f254c58d56d9a8719897fa8da9cf969eaa498e1e755457942d3f0ac56e4abd3f6a66ef924c94aa034d0af18a1fb653926b2496f0c2615fdb24c5e fix-toolkit.patch
+426b57ce698de3eecd1b52f2998974c4e0b5922584b09b554d436c61fee039d1f86345e746fee067801ebbf50815c4d19b96266a2ed72a35ae5c3edbdb57bba1 fix-tools.patch
+18f0696bf4d032c83041110b83ae6531b48474a778fc1deade3b06ba2ae1bfcc9891059287bfb78317c2f5ddc88f5b7ce957312acdb63d4902a57e0b40eb6520 getchar.patch
+e61664bc93eadce5016a06a4d0684b34a05074f1815e88ef2613380d7b369c6fd305fb34f83b5eb18b9e3138273ea8ddcfdcb1084fdcaa922a1e5b30146a3b18 mozilla-build-arm.patch
+1a8754830dbbf5432a611504c957c4ff24fdc31dc1a5ee7cdd4240bc5c084baa26a24f18527ff398ec81e56a36aee31732138243cf22a6bab89703656ff463e7 stat.patch
+0b3f1e4b9fdc868e4738b5c81fd6c6128ce8885b260affcb9a65ff9d164d7232626ce1291aaea70132b3e3124f5e13fef4d39326b8e7173e362a823722a85127 stab.h
+06ededcd196af98b77991dcba3b710b0dfc061404adb4676fcc380be80410a2621f64d67257b0aefdf36f566e0ea1294b5405b7b4db43e83281a1c64d02da579 rhbz-966424.patch
f3b7c3e804ce04731012a46cb9e9a6b0769e3772aef9c0a4a8c7520b030fdf6cd703d5e9ff49275f14b7d738fe82a0a4fde3bc3219dff7225d5db0e274987454 firefox.desktop
5dcb6288d0444a8a471d669bbaf61cdb1433663eff38b72ee5e980843f5fc07d0d60c91627a2c1159215d0ad77ae3f115dcc5fdfe87e64ca704b641aceaa44ed firefox-safe.desktop"
diff --git a/main/firefox/duckduckgo.patch b/main/firefox/duckduckgo.patch
deleted file mode 100644
index 8de4e4b27..000000000
--- a/main/firefox/duckduckgo.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-diff -up mozilla-release/browser/locales/en-US/chrome/browser-region/region.properties.duckduckgo mozilla-release/browser/locales/en-US/chrome/browser-region/region.properties
---- mozilla-release/browser/locales/en-US/chrome/browser-region/region.properties.duckduckgo 2012-10-24 16:32:26.000000000 +0200
-+++ mozilla-release/browser/locales/en-US/chrome/browser-region/region.properties 2012-11-07 16:27:04.278857840 +0100
-@@ -9,6 +9,7 @@ browser.search.defaultenginename=Google
- browser.search.order.1=Google
- browser.search.order.2=Yahoo
- browser.search.order.3=Bing
-+browser.search.order.4=DuckDuckGo
-
- # This is the default set of web based feed handlers shown in the reader
- # selection UI
-diff -up mozilla-release/browser/locales/en-US/searchplugins/duckduckgo.xml.duckduckgo mozilla-release/browser/locales/en-US/searchplugins/duckduckgo.xml
---- mozilla-release/browser/locales/en-US/searchplugins/duckduckgo.xml.duckduckgo 2012-11-07 16:27:04.278857840 +0100
-+++ mozilla-release/browser/locales/en-US/searchplugins/duckduckgo.xml 2012-11-07 16:27:04.278857840 +0100
-@@ -0,0 +1,11 @@
-+<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/">
-+ <ShortName>DuckDuckGo</ShortName>
-+ <Description>We believe you can get better search and privacy at the same time.</Description>
-+ <InputEncoding>UTF-8</InputEncoding>
-+ <Image height="16" width="16" type="image/x-icon">data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAANcNAADXDQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJyDsJmlk8pf6+v3s/v7+++zr/fcnIOyzJyDsgCcg7CYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnIOwBJyDscCcg7PZttJ7/7Pfs//////++xO7/S5GA/ycg7P8nIOz2JyDscCcg7AEAAAAAAAAAAAAAAAAnIOwBJyDstScg7P8nIOz/Y8p5/2fHZf9Yv0z/YcF2/1rBUv8nIOz/JyDs/ycg7P8nIOy1JyDsAQAAAAAAAAAAJyDscCcg7P8nIOz/JyDs/4jQoP/p9+n//////05X3v9LkYD/JyDs/ycg7P8nIOz/JyDs/ycg7HAAAAAAJyDsJicg7PYnIOz/JyDs/zUu7f/+/v////////////89N+7/JyDs/yUo7f8nIOz/JyDs/ycg7P8nIOz2JyDsJicg7IAnIOz/JyDs/ycg7P9hXPH////////////t/P//GIr2/wfD+/8Gyfz/DKv5/yM57/8nIOz/JyDs/ycg7H8nIOyzJyDs/ycg7P8nIOz/jov1////////////Otz9/w3G/P8cWfH/JSvt/ycg7P8nIOz/JyDs/ycg7P8nIOyzJyDs5icg7P8nIOz/JyDs/7u5+f///////////27l/v8E0v3/BNL9/wTQ/f8Oofn/IT7v/ycg7P8nIOz/JyDs5icg7OYnIOz/JyDs/ycg7P/p6P3/uWsC////////////5fr//6Po/f8Thfb/DKv5/w6f+f8nIOz/JyDs/ycg7OYnIOyzJyDs/ycg7P8nIOz/9/b+/////////////////7lrAv/V1Pv/JyDs/ycg7P8nIOz/JyDs/ycg7P8nIOyzJyDsgCcg7P8nIOz/JyDs/8/N+///////////////////////iIX1/ycg7P8nIOz/JyDs/ycg7P8nIOz/JyDsfycg7CYnIOz2JyDs/ycg7P9FP+7/q6n4/+7u/f/n5v3/fXn0/yoj7P8nIOz/JyDs/ycg7P8nIOz/JyDs9icg7CYAAAAAJyDscCcg7P8nIOz/wsD6/+no/f/Y1/z/eHTz/ycg7P8nIOz/JyDs/ycg7P8nIOz/JyDs/ycg7HAAAAAAAAAAACcg7AEnIOy1JyDs/ycg7P8nIOz/JyDs/ycg7P8nIOz/JyDs/ycg7P8nIOz/JyDs/ycg7LUnIOwBAAAAAAAAAAAAAAAAJyDsAScg7HAnIOz2JyDs/ycg7P8nIOz/JyDs/ycg7P8nIOz/JyDs9icg7HAnIOwBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJyDsJicg7IAnIOyzJyDs5icg7OYnIOyzJyDsgCcg7CYAAAAAAAAAAAAAAAAAAAAA+B8AAPAPAADAAwAAwAMAAIABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAABAACAAQAAwAMAAMADAADwDwAA+B8AAA==</Image>
-+ <Url type="text/html" method="GET" template="https://duckduckgo.com/">
-+ <Param name="q" value="{searchTerms}"/>
-+ <Param name="t" value="alpine"/>
-+ </Url>
-+ <SearchForm>https://duckduckgo.com/</SearchForm>
-+</SearchPlugin>
-diff -up mozilla-release/browser/locales/en-US/searchplugins/list.txt.duckduckgo mozilla-release/browser/locales/en-US/searchplugins/list.txt
---- mozilla-release/browser/locales/en-US/searchplugins/list.txt.duckduckgo 2012-10-24 16:32:26.000000000 +0200
-+++ mozilla-release/browser/locales/en-US/searchplugins/list.txt 2012-11-07 16:27:04.279857842 +0100
-@@ -1,5 +1,6 @@
- amazondotcom
- bing
-+duckduckgo
- eBay
- google
- twitter
diff --git a/main/firefox/fix-arm-atomics-grsec.patch b/main/firefox/fix-arm-atomics-grsec.patch
new file mode 100644
index 000000000..5524b2aa7
--- /dev/null
+++ b/main/firefox/fix-arm-atomics-grsec.patch
@@ -0,0 +1,342 @@
+--- mozilla-release/ipc/chromium/src/base/atomicops_internals_arm_gcc.h.orig
++++ mozilla-release/ipc/chromium/src/base/atomicops_internals_arm_gcc.h
+@@ -1,8 +1,31 @@
+-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+-// Use of this source code is governed by a BSD-style license that can be
+-// found in the LICENSE file.
++// Copyright 2010 the V8 project authors. All rights reserved.
++// Redistribution and use in source and binary forms, with or without
++// modification, are permitted provided that the following conditions are
++// met:
++//
++// * Redistributions of source code must retain the above copyright
++// notice, this list of conditions and the following disclaimer.
++// * Redistributions in binary form must reproduce the above
++// copyright notice, this list of conditions and the following
++// disclaimer in the documentation and/or other materials provided
++// with the distribution.
++// * Neither the name of Google Inc. nor the names of its
++// contributors may be used to endorse or promote products derived
++// from this software without specific prior written permission.
++//
++// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
++// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
++// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
++// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+-// This file is an internal atomic implementation, use base/atomicops.h instead.
++// This file is an internal atomic implementation, use atomicops.h instead.
+ //
+ // LinuxKernelCmpxchg and Barrier_AtomicIncrement are from Google Gears.
+
+@@ -12,43 +35,194 @@
+ namespace base {
+ namespace subtle {
+
+-// 0xffff0fc0 is the hard coded address of a function provided by
+-// the kernel which implements an atomic compare-exchange. On older
+-// ARM architecture revisions (pre-v6) this may be implemented using
+-// a syscall. This address is stable, and in active use (hard coded)
+-// by at least glibc-2.7 and the Android C library.
+-typedef Atomic32 (*LinuxKernelCmpxchgFunc)(Atomic32 old_value,
+- Atomic32 new_value,
+- volatile Atomic32* ptr);
+-LinuxKernelCmpxchgFunc pLinuxKernelCmpxchg __attribute__((weak)) =
+- (LinuxKernelCmpxchgFunc) 0xffff0fc0;
++// Memory barriers on ARM are funky, but the kernel is here to help:
++//
++// * ARMv5 didn't support SMP, there is no memory barrier instruction at
++// all on this architecture, or when targeting its machine code.
++//
++// * Some ARMv6 CPUs support SMP. A full memory barrier can be produced by
++// writing a random value to a very specific coprocessor register.
++//
++// * On ARMv7, the "dmb" instruction is used to perform a full memory
++// barrier (though writing to the co-processor will still work).
++// However, on single core devices (e.g. Nexus One, or Nexus S),
++// this instruction will take up to 200 ns, which is huge, even though
++// it's completely un-needed on these devices.
++//
++// * There is no easy way to determine at runtime if the device is
++// single or multi-core. However, the kernel provides a useful helper
++// function at a fixed memory address (0xffff0fa0), which will always
++// perform a memory barrier in the most efficient way. I.e. on single
++// core devices, this is an empty function that exits immediately.
++// On multi-core devices, it implements a full memory barrier.
++//
++// * This source could be compiled to ARMv5 machine code that runs on a
++// multi-core ARMv6 or ARMv7 device. In this case, memory barriers
++// are needed for correct execution. Always call the kernel helper, even
++// when targeting ARMv5TE.
++//
+
+-typedef void (*LinuxKernelMemoryBarrierFunc)(void);
+-LinuxKernelMemoryBarrierFunc pLinuxKernelMemoryBarrier __attribute__((weak)) =
+- (LinuxKernelMemoryBarrierFunc) 0xffff0fa0;
++inline void MemoryBarrier() {
++#if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || \
++ defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__)
++ __asm__ __volatile__("dmb ish" ::: "memory");
++#elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || \
++ defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) || \
++ defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__)
++ __asm__ __volatile__("mcr p15,0,r0,c7,c10,5" ::: "memory");
++#elif defined(__linux__) || defined(__ANDROID__)
++ // Note: This is a function call, which is also an implicit compiler barrier.
++ typedef void (*KernelMemoryBarrierFunc)();
++ ((KernelMemoryBarrierFunc)0xffff0fa0)();
++#error MemoryBarrier() is not implemented on this platform.
++#endif
++}
+
++// An ARM toolchain would only define one of these depending on which
++// variant of the target architecture is being used. This tests against
++// any known ARMv6 or ARMv7 variant, where it is possible to directly
++// use ldrex/strex instructions to implement fast atomic operations.
++#if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || \
++ defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || \
++ defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || \
++ defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) || \
++ defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__)
+
+ inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr,
+ Atomic32 old_value,
+ Atomic32 new_value) {
+- Atomic32 prev_value = *ptr;
++ Atomic32 prev_value;
++ int reloop;
+ do {
+- if (!pLinuxKernelCmpxchg(old_value, new_value,
+- const_cast<Atomic32*>(ptr))) {
+- return old_value;
+- }
+- prev_value = *ptr;
+- } while (prev_value == old_value);
++ // The following is equivalent to:
++ //
++ // prev_value = LDREX(ptr)
++ // reloop = 0
++ // if (prev_value != old_value)
++ // reloop = STREX(ptr, new_value)
++ __asm__ __volatile__(" ldrex %0, [%3]\n"
++ " mov %1, #0\n"
++ " cmp %0, %4\n"
++#ifdef __thumb2__
++ " it eq\n"
++#endif
++ " strexeq %1, %5, [%3]\n"
++ : "=&r"(prev_value), "=&r"(reloop), "+m"(*ptr)
++ : "r"(ptr), "r"(old_value), "r"(new_value)
++ : "cc", "memory");
++ } while (reloop != 0);
+ return prev_value;
+ }
+
++inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr,
++ Atomic32 old_value,
++ Atomic32 new_value) {
++ Atomic32 result = NoBarrier_CompareAndSwap(ptr, old_value, new_value);
++ MemoryBarrier();
++ return result;
++}
++
++inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr,
++ Atomic32 old_value,
++ Atomic32 new_value) {
++ MemoryBarrier();
++ return NoBarrier_CompareAndSwap(ptr, old_value, new_value);
++}
++
++inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr,
++ Atomic32 increment) {
++ Atomic32 value;
++ int reloop;
++ do {
++ // Equivalent to:
++ //
++ // value = LDREX(ptr)
++ // value += increment
++ // reloop = STREX(ptr, value)
++ //
++ __asm__ __volatile__(" ldrex %0, [%3]\n"
++ " add %0, %0, %4\n"
++ " strex %1, %0, [%3]\n"
++ : "=&r"(value), "=&r"(reloop), "+m"(*ptr)
++ : "r"(ptr), "r"(increment)
++ : "cc", "memory");
++ } while (reloop);
++ return value;
++}
++
++inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr,
++ Atomic32 increment) {
++ // TODO(digit): Investigate if it's possible to implement this with
++ // a single MemoryBarrier() operation between the LDREX and STREX.
++ // See http://crbug.com/246514
++ MemoryBarrier();
++ Atomic32 result = NoBarrier_AtomicIncrement(ptr, increment);
++ MemoryBarrier();
++ return result;
++}
++
+ inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr,
+ Atomic32 new_value) {
+ Atomic32 old_value;
++ int reloop;
+ do {
++ // old_value = LDREX(ptr)
++ // reloop = STREX(ptr, new_value)
++ __asm__ __volatile__(" ldrex %0, [%3]\n"
++ " strex %1, %4, [%3]\n"
++ : "=&r"(old_value), "=&r"(reloop), "+m"(*ptr)
++ : "r"(ptr), "r"(new_value)
++ : "cc", "memory");
++ } while (reloop != 0);
++ return old_value;
++}
++
++// This tests against any known ARMv5 variant.
++#elif defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5T__) || \
++ defined(__ARM_ARCH_5TE__) || defined(__ARM_ARCH_5TEJ__)
++
++// The kernel also provides a helper function to perform an atomic
++// compare-and-swap operation at the hard-wired address 0xffff0fc0.
++// On ARMv5, this is implemented by a special code path that the kernel
++// detects and treats specially when thread pre-emption happens.
++// On ARMv6 and higher, it uses LDREX/STREX instructions instead.
++//
++// Note that this always perform a full memory barrier, there is no
++// need to add calls MemoryBarrier() before or after it. It also
++// returns 0 on success, and 1 on exit.
++//
++// Available and reliable since Linux 2.6.24. Both Android and ChromeOS
++// use newer kernel revisions, so this should not be a concern.
++namespace {
++
++inline int LinuxKernelCmpxchg(Atomic32 old_value,
++ Atomic32 new_value,
++ volatile Atomic32* ptr) {
++ typedef int (*KernelCmpxchgFunc)(Atomic32, Atomic32, volatile Atomic32*);
++ return ((KernelCmpxchgFunc)0xffff0fc0)(old_value, new_value, ptr);
++}
++
++} // namespace
++
++inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr,
++ Atomic32 old_value,
++ Atomic32 new_value) {
++ Atomic32 prev_value;
++ for (;;) {
++ prev_value = *ptr;
++ if (prev_value != old_value)
++ return prev_value;
++ if (!LinuxKernelCmpxchg(old_value, new_value, ptr))
++ return old_value;
++ }
++}
++
++inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr,
++ Atomic32 new_value) {
++ Atomic32 old_value;
++ do {
+ old_value = *ptr;
+- } while (pLinuxKernelCmpxchg(old_value, new_value,
+- const_cast<Atomic32*>(ptr)));
++ } while (LinuxKernelCmpxchg(old_value, new_value, ptr));
+ return old_value;
+ }
+
+@@ -63,36 +237,57 @@
+ // Atomic exchange the old value with an incremented one.
+ Atomic32 old_value = *ptr;
+ Atomic32 new_value = old_value + increment;
+- if (pLinuxKernelCmpxchg(old_value, new_value,
+- const_cast<Atomic32*>(ptr)) == 0) {
++ if (!LinuxKernelCmpxchg(old_value, new_value, ptr)) {
+ // The exchange took place as expected.
+ return new_value;
+ }
+ // Otherwise, *ptr changed mid-loop and we need to retry.
+ }
+-
+ }
+
+ inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr,
+ Atomic32 old_value,
+ Atomic32 new_value) {
+- return NoBarrier_CompareAndSwap(ptr, old_value, new_value);
++ Atomic32 prev_value;
++ for (;;) {
++ prev_value = *ptr;
++ if (prev_value != old_value) {
++ // Always ensure acquire semantics.
++ MemoryBarrier();
++ return prev_value;
++ }
++ if (!LinuxKernelCmpxchg(old_value, new_value, ptr))
++ return old_value;
++ }
+ }
+
+ inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr,
+ Atomic32 old_value,
+ Atomic32 new_value) {
+- return NoBarrier_CompareAndSwap(ptr, old_value, new_value);
++ // This could be implemented as:
++ // MemoryBarrier();
++ // return NoBarrier_CompareAndSwap();
++ //
++ // But would use 3 barriers per succesful CAS. To save performance,
++ // use Acquire_CompareAndSwap(). Its implementation guarantees that:
++ // - A succesful swap uses only 2 barriers (in the kernel helper).
++ // - An early return due to (prev_value != old_value) performs
++ // a memory barrier with no store, which is equivalent to the
++ // generic implementation above.
++ return Acquire_CompareAndSwap(ptr, old_value, new_value);
+ }
+
++#else
++# error "Your CPU's ARM architecture is not supported yet"
++#endif
++
++// NOTE: Atomicity of the following load and store operations is only
++// guaranteed in case of 32-bit alignement of |ptr| values.
++
+ inline void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value) {
+ *ptr = value;
+ }
+
+-inline void MemoryBarrier() {
+- pLinuxKernelMemoryBarrier();
+-}
+-
+ inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) {
+ *ptr = value;
+ MemoryBarrier();
+@@ -103,9 +298,7 @@
+ *ptr = value;
+ }
+
+-inline Atomic32 NoBarrier_Load(volatile const Atomic32* ptr) {
+- return *ptr;
+-}
++inline Atomic32 NoBarrier_Load(volatile const Atomic32* ptr) { return *ptr; }
+
+ inline Atomic32 Acquire_Load(volatile const Atomic32* ptr) {
+ Atomic32 value = *ptr;
+@@ -118,7 +311,6 @@
+ return *ptr;
+ }
+
+-} // namespace base::subtle
+-} // namespace base
++} } // namespace base::subtle
+
+ #endif // BASE_ATOMICOPS_INTERNALS_ARM_GCC_H_
diff --git a/main/firefox/fix-ipc.patch b/main/firefox/fix-ipc.patch
new file mode 100644
index 000000000..e21d57f40
--- /dev/null
+++ b/main/firefox/fix-ipc.patch
@@ -0,0 +1,66 @@
+--- mozilla-release.orig/ipc/chromium/src/base/debug_util_posix.cc
++++ mozilla-release/ipc/chromium/src/base/debug_util_posix.cc
+@@ -5,7 +5,7 @@
+ #include "build/build_config.h"
+ #include "base/debug_util.h"
+
+-#define MOZ_HAVE_EXECINFO_H (defined(OS_LINUX) && !defined(ANDROID))
++#define MOZ_HAVE_EXECINFO_H (defined(OS_LINUX) && defined(__GLIBC__))
+
+ #include <errno.h>
+ #include <fcntl.h>
+--- mozilla-release.orig/ipc/chromium/src/base/file_util.h
++++ mozilla-release/ipc/chromium/src/base/file_util.h
+@@ -14,10 +14,15 @@
+ #include <windows.h>
+ #elif defined(ANDROID)
+ #include <sys/stat.h>
++#define NO_FTS
+ #elif defined(OS_POSIX)
+ #include <sys/types.h>
+-#include <fts.h>
+ #include <sys/stat.h>
++#ifdef __GLIBC__
++#include <fts.h>
++#else
++#define NO_FTS
++#endif
+ #endif
+
+ #include <stdio.h>
+--- mozilla-release.orig/ipc/chromium/src/base/file_util_posix.cc
++++ mozilla-release/ipc/chromium/src/base/file_util_posix.cc
+@@ -8,13 +8,13 @@
+ #include <errno.h>
+ #include <fcntl.h>
+ #include <fnmatch.h>
+-#ifndef ANDROID
++#ifndef NO_FTS
+ #include <fts.h>
+ #endif
+ #include <libgen.h>
+ #include <stdio.h>
+ #include <string.h>
+-#include <sys/errno.h>
++#include <errno.h>
+ #include <sys/mman.h>
+ #define _DARWIN_USE_64_BIT_INODE // Use 64-bit inode data structures
+ #include <sys/stat.h>
+@@ -67,7 +67,7 @@
+ if (!recursive)
+ return (rmdir(path_str) == 0);
+
+-#ifdef ANDROID
++#ifdef NO_FTS
+ // XXX Need ftsless impl for bionic
+ return false;
+ #else
+@@ -140,7 +140,7 @@
+ return false;
+ }
+
+-#ifdef ANDROID
++#ifdef NO_FTS
+ // XXX Need ftsless impl for bionic
+ return false;
+ #else
diff --git a/main/firefox/fix-media-webrtc.patch b/main/firefox/fix-media-webrtc.patch
new file mode 100644
index 000000000..a173d795d
--- /dev/null
+++ b/main/firefox/fix-media-webrtc.patch
@@ -0,0 +1,14 @@
+https://bugzilla.mozilla.org/show_bug.cgi?id=1010194
+
+diff -ru mozilla-release/media.orig/webrtc/signaling/src/sipcc/cpr/include/cpr_threads.h mozilla-release/media/webrtc/signaling/src/sipcc/cpr/include/cpr_threads.h
+--- mozilla-release/media.orig/webrtc/signaling/src/sipcc/cpr/include/cpr_threads.h 2014-05-07 01:56:10.000000000 -0300
++++ mozilla-release/media/webrtc/signaling/src/sipcc/cpr/include/cpr_threads.h 2014-05-14 14:56:45.938648384 -0300
+@@ -30,7 +30,7 @@
+ uint32_t threadId;
+ union {
+ void *handlePtr;
+- uint64_t handleInt;
++ unsigned long handleInt;
+ } u;
+ } cpr_thread_t;
+
diff --git a/main/firefox/fix-media.patch b/main/firefox/fix-media.patch
new file mode 100644
index 000000000..a016a4875
--- /dev/null
+++ b/main/firefox/fix-media.patch
@@ -0,0 +1,38 @@
+--- mozilla-release/media.orig/mtransport/third_party/nICEr/src/stun/addrs.c
++++ mozilla-release/media/mtransport/third_party/nICEr/src/stun/addrs.c
+@@ -45,7 +45,6 @@
+ #include <sys/param.h>
+ #include <sys/socket.h>
+ #ifndef ANDROID
+-#include <sys/sysctl.h>
+ #include <sys/syslog.h>
+ #else
+ #include <syslog.h>
+@@ -53,7 +52,6 @@
+ #undef __unused
+ #include <linux/sysctl.h>
+ #endif
+-#include <net/if.h>
+ #ifndef LINUX
+ #if !defined(__OpenBSD__) && !defined(__NetBSD__)
+ #include <net/if_var.h>
+@@ -63,8 +61,8 @@
+ #include <sys/sockio.h>
+ #else
+ #include <linux/sockios.h>
+-#include <linux/if.h>
+ #include <linux/kernel.h>
++#include <linux/if.h>
+ #include <linux/wireless.h>
+ #ifndef ANDROID
+ #include <linux/ethtool.h>
+--- mozilla-release/media.orig/mtransport/third_party/nICEr/src/stun/stun.h
++++ mozilla-release/media/mtransport/third_party/nICEr/src/stun/stun.h
+@@ -39,7 +39,6 @@
+ #else
+ #include <sys/param.h>
+ #include <sys/socket.h>
+-#include <net/if.h>
+ #ifndef LINUX
+ #if !defined(__OpenBSD__) && !defined(__NetBSD__)
+ #include <net/if_var.h>
diff --git a/main/firefox/fix-netwerk.patch b/main/firefox/fix-netwerk.patch
new file mode 100644
index 000000000..a31b28622
--- /dev/null
+++ b/main/firefox/fix-netwerk.patch
@@ -0,0 +1,37 @@
+--- ./netwerk.orig/sctp/src/netinet/sctp_os_userspace.h
++++ ./netwerk/sctp/src/netinet/sctp_os_userspace.h
+@@ -400,11 +400,8 @@
+ };
+
+ #else /* !defined(Userspace_os_Windows) */
+-#include <sys/cdefs.h> /* needed? added from old __FreeBSD__ */
+ #include <sys/socket.h>
+-#if defined(__Userspace_os_DragonFly) || defined(__Userspace_os_FreeBSD) || defined(__Userspace_os_Linux) || defined(__Userspace_os_NetBSD) || defined(__Userspace_os_OpenBSD) || defined(ANDROID)
+ #include <pthread.h>
+-#endif
+ typedef pthread_mutex_t userland_mutex_t;
+ typedef pthread_cond_t userland_cond_t;
+ typedef pthread_t userland_thread_t;
+--- ./netwerk.orig/sctp/src/netinet/sctp_pcb.c
++++ ./netwerk/sctp/src/netinet/sctp_pcb.c
+@@ -30,6 +30,9 @@
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
++#define _BSD_SOURCE /* for IPPORT_RESERVED */
++#include <netdb.h>
++
+ #ifdef __FreeBSD__
+ #include <sys/cdefs.h>
+ __FBSDID("$FreeBSD: head/sys/netinet/sctp_pcb.c 258765 2013-11-30 12:51:19Z tuexen $");
+--- ./netwerk.orig/sctp/src/user_queue.h
++++ ./netwerk/sctp/src/user_queue.h
+@@ -31,7 +31,7 @@
+ #ifndef _USER_QUEUE_H_
+ #define _USER_QUEUE_H_
+
+-#if !defined (__Userspace_os_Windows)
++#if defined(__Userspace_os_FreeBSD)
+ #include <sys/cdefs.h>
+ #endif
+ /*
diff --git a/main/firefox/fix-toolkit.patch b/main/firefox/fix-toolkit.patch
new file mode 100644
index 000000000..030322365
--- /dev/null
+++ b/main/firefox/fix-toolkit.patch
@@ -0,0 +1,151 @@
+diff -ru mozilla-release/toolkit.orig/crashreporter/google-breakpad/src/common/linux/dump_symbols.cc mozilla-release/toolkit/crashreporter/google-breakpad/src/common/linux/dump_symbols.cc
+--- mozilla-release/toolkit.orig/crashreporter/google-breakpad/src/common/linux/dump_symbols.cc 2014-03-15 05:19:36.000000000 +0000
++++ mozilla-release/toolkit/crashreporter/google-breakpad/src/common/linux/dump_symbols.cc 2014-04-17 10:24:33.793431933 +0000
+@@ -45,6 +45,7 @@
+ #include <sys/mman.h>
+ #include <sys/stat.h>
+ #include <unistd.h>
++#include <libgen.h>
+
+ #include <iostream>
+ #include <set>
+diff -ru mozilla-release/toolkit.orig/crashreporter/google-breakpad/src/common/stabs_reader.cc mozilla-release/toolkit/crashreporter/google-breakpad/src/common/stabs_reader.cc
+--- mozilla-release/toolkit.orig/crashreporter/google-breakpad/src/common/stabs_reader.cc 2014-03-15 05:19:36.000000000 +0000
++++ mozilla-release/toolkit/crashreporter/google-breakpad/src/common/stabs_reader.cc 2014-04-17 10:24:33.793431933 +0000
+@@ -41,6 +41,10 @@
+
+ #include "common/using_std_string.h"
+
++#ifndef N_UNDF
++#define N_UNDF 0
++#endif
++
+ using std::vector;
+
+ namespace google_breakpad {
+diff -ru mozilla-release/toolkit.orig/crashreporter/google-breakpad/src/common/stabs_reader.h mozilla-release/toolkit/crashreporter/google-breakpad/src/common/stabs_reader.h
+--- mozilla-release/toolkit.orig/crashreporter/google-breakpad/src/common/stabs_reader.h 2014-03-15 05:19:36.000000000 +0000
++++ mozilla-release/toolkit/crashreporter/google-breakpad/src/common/stabs_reader.h 2014-04-17 10:24:33.793431933 +0000
+@@ -53,9 +53,10 @@
+ #include <config.h>
+ #endif
+
+-#ifdef HAVE_A_OUT_H
++#if 0
+ #include <a.out.h>
+ #endif
++
+ #ifdef HAVE_MACH_O_NLIST_H
+ #include <mach-o/nlist.h>
+ #endif
+diff -ru mozilla-release/toolkit.orig/crashreporter/google-breakpad/src/third_party/lss/linux_syscall_support.h mozilla-release/toolkit/crashreporter/google-breakpad/src/third_party/lss/linux_syscall_support.h
+--- mozilla-release/toolkit.orig/crashreporter/google-breakpad/src/third_party/lss/linux_syscall_support.h 2014-03-15 05:19:37.000000000 +0000
++++ mozilla-release/toolkit/crashreporter/google-breakpad/src/third_party/lss/linux_syscall_support.h 2014-04-17 10:24:33.793431933 +0000
+@@ -2813,7 +2813,7 @@
+ LSS_INLINE _syscall6(void*, mmap, void*, s,
+ size_t, l, int, p,
+ int, f, int, d,
+- __off64_t, o)
++ off_t, o)
+
+ LSS_INLINE _syscall4(int, newfstatat, int, d,
+ const char *, p,
+diff -ru mozilla-release/toolkit.orig/mozapps/update/common/updatedefines.h mozilla-release/toolkit/mozapps/update/common/updatedefines.h
+--- mozilla-release/toolkit.orig/mozapps/update/common/updatedefines.h 2014-03-15 05:19:37.000000000 +0000
++++ mozilla-release/toolkit/mozapps/update/common/updatedefines.h 2014-04-17 10:24:33.793431933 +0000
+@@ -105,7 +105,7 @@
+
+ #ifdef SOLARIS
+ # include <sys/stat.h>
+-#else
++#elif !defined(__linux__) || defined(__GLIBC__)
+ # include <fts.h>
+ #endif
+ # include <dirent.h>
+diff -ru mozilla-release/toolkit.orig/mozapps/update/updater/updater.cpp mozilla-release/toolkit/mozapps/update/updater/updater.cpp
+--- mozilla-release/toolkit.orig/mozapps/update/updater/updater.cpp 2014-03-15 05:19:37.000000000 +0000
++++ mozilla-release/toolkit/mozapps/update/updater/updater.cpp 2014-04-17 10:24:33.796765327 +0000
+@@ -3432,6 +3432,7 @@
+ int add_dir_entries(const NS_tchar *dirpath, ActionList *list)
+ {
+ int rv = OK;
++#if !defined(__linux__) || defined(__GLIBC__)
+ FTS *ftsdir;
+ FTSENT *ftsdirEntry;
+ NS_tchar searchpath[MAXPATHLEN];
+@@ -3534,6 +3535,7 @@
+ }
+
+ fts_close(ftsdir);
++#endif
+
+ return rv;
+ }
+diff -ru mozilla-release/toolkit.orig/xre/nsSigHandlers.cpp mozilla-release/toolkit/xre/nsSigHandlers.cpp
+--- mozilla-release/toolkit.orig/xre/nsSigHandlers.cpp 2014-03-15 05:19:38.000000000 +0000
++++ mozilla-release/toolkit/xre/nsSigHandlers.cpp 2014-04-17 10:24:33.796765327 +0000
+@@ -15,6 +15,7 @@
+ #include <signal.h>
+ #include <stdio.h>
+ #include <string.h>
++#include <sys/types.h>
+ #include "prthread.h"
+ #include "plstr.h"
+ #include "prenv.h"
+@@ -152,7 +153,7 @@
+ status->__invalid = status->__denorm = status->__zdiv = status->__ovrfl = status->__undfl =
+ status->__precis = status->__stkflt = status->__errsumm = 0;
+
+- __uint32_t *mxcsr = &uc->uc_mcontext->__fs.__fpu_mxcsr;
++ u_int32_t *mxcsr = &uc->uc_mcontext->__fs.__fpu_mxcsr;
+ *mxcsr |= SSE_EXCEPTION_MASK; /* disable all SSE exceptions */
+ *mxcsr &= ~SSE_STATUS_FLAGS; /* clear all pending SSE exceptions */
+ #endif
+@@ -172,13 +173,13 @@
+ *sw &= ~FPU_STATUS_FLAGS;
+ #endif
+ #if defined(__amd64__)
+- __uint16_t *cw = &uc->uc_mcontext.fpregs->cwd;
++ u_int16_t *cw = &uc->uc_mcontext.fpregs->cwd;
+ *cw |= FPU_EXCEPTION_MASK;
+
+- __uint16_t *sw = &uc->uc_mcontext.fpregs->swd;
++ u_int16_t *sw = &uc->uc_mcontext.fpregs->swd;
+ *sw &= ~FPU_STATUS_FLAGS;
+
+- __uint32_t *mxcsr = &uc->uc_mcontext.fpregs->mxcsr;
++ u_int32_t *mxcsr = &uc->uc_mcontext.fpregs->mxcsr;
+ *mxcsr |= SSE_EXCEPTION_MASK; /* disable all SSE exceptions */
+ *mxcsr &= ~SSE_STATUS_FLAGS; /* clear all pending SSE exceptions */
+ #endif
+@@ -187,24 +188,24 @@
+ ucontext_t *uc = (ucontext_t *)context;
+
+ #if defined(__i386)
+- uint32_t *cw = &uc->uc_mcontext.fpregs.fp_reg_set.fpchip_state.state[0];
++ u_int32_t *cw = &uc->uc_mcontext.fpregs.fp_reg_set.fpchip_state.state[0];
+ *cw |= FPU_EXCEPTION_MASK;
+
+- uint32_t *sw = &uc->uc_mcontext.fpregs.fp_reg_set.fpchip_state.state[1];
++ u_int32_t *sw = &uc->uc_mcontext.fpregs.fp_reg_set.fpchip_state.state[1];
+ *sw &= ~FPU_STATUS_FLAGS;
+
+ /* address of the instruction that caused the exception */
+- uint32_t *ip = &uc->uc_mcontext.fpregs.fp_reg_set.fpchip_state.state[3];
++ u_int32_t *ip = &uc->uc_mcontext.fpregs.fp_reg_set.fpchip_state.state[3];
+ uc->uc_mcontext.gregs[REG_PC] = *ip;
+ #endif
+ #if defined(__amd64__)
+- uint16_t *cw = &uc->uc_mcontext.fpregs.fp_reg_set.fpchip_state.cw;
++ u_int16_t *cw = &uc->uc_mcontext.fpregs.fp_reg_set.fpchip_state.cw;
+ *cw |= FPU_EXCEPTION_MASK;
+
+- uint16_t *sw = &uc->uc_mcontext.fpregs.fp_reg_set.fpchip_state.sw;
++ u_int16_t *sw = &uc->uc_mcontext.fpregs.fp_reg_set.fpchip_state.sw;
+ *sw &= ~FPU_STATUS_FLAGS;
+
+- uint32_t *mxcsr = &uc->uc_mcontext.fpregs.fp_reg_set.fpchip_state.mxcsr;
++ u_int32_t *mxcsr = &uc->uc_mcontext.fpregs.fp_reg_set.fpchip_state.mxcsr;
+ *mxcsr |= SSE_EXCEPTION_MASK; /* disable all SSE exceptions */
+ *mxcsr &= ~SSE_STATUS_FLAGS; /* clear all pending SSE exceptions */
+ #endif
diff --git a/main/firefox/fix-tools.patch b/main/firefox/fix-tools.patch
new file mode 100644
index 000000000..b0a6d4fbc
--- /dev/null
+++ b/main/firefox/fix-tools.patch
@@ -0,0 +1,49 @@
+--- mozilla-release.orig/tools/profiler/local_debug_info_symbolizer.cc
++++ mozilla-release/tools/profiler/local_debug_info_symbolizer.cc
+@@ -3,6 +3,7 @@
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
++#include <sys/types.h>
+ #include "PlatformMacros.h"
+ #include "nsAutoPtr.h"
+
+--- mozilla-release.orig/tools/profiler/platform-linux.cc
++++ mozilla-release/tools/profiler/platform-linux.cc
+@@ -84,7 +84,7 @@
+
+ #define SIGNAL_SAVE_PROFILE SIGUSR2
+
+-#if defined(__GLIBC__)
++#if 1
+ // glibc doesn't implement gettid(2).
+ #include <sys/syscall.h>
+ pid_t gettid()
+--- mozilla-release.orig/tools/profiler/platform.h
++++ mozilla-release/tools/profiler/platform.h
+@@ -29,6 +29,8 @@
+ #ifndef TOOLS_PLATFORM_H_
+ #define TOOLS_PLATFORM_H_
+
++#include <sys/types.h>
++
+ #ifdef ANDROID
+ #include <android/log.h>
+ #else
+--- mozilla-release.orig/tools/profiler/LulElf.cpp
++++ mozilla-release/tools/profiler/LulElf.cpp
+@@ -579,10 +579,10 @@
+ // Return the non-directory portion of FILENAME: the portion after the
+ // last slash, or the whole filename if there are no slashes.
+ string BaseFileName(const string &filename) {
+- // Lots of copies! basename's behavior is less than ideal.
+- char *c_filename = strdup(filename.c_str());
+- string base = basename(c_filename);
+- free(c_filename);
++ // basename's behavior is less than ideal so avoid it
++ const char *c_filename = filename.c_str();
++ const char *p = strrchr(c_filename, '/');
++ string base = p ? p+1 : c_filename;
+ return base;
+ }
+
diff --git a/main/firefox/getchar.patch b/main/firefox/getchar.patch
new file mode 100644
index 000000000..981206b97
--- /dev/null
+++ b/main/firefox/getchar.patch
@@ -0,0 +1,14 @@
+--- ./media/webrtc/trunk/webrtc/system_wrappers/source/spreadsortlib/spreadsort.hpp.orig
++++ ./media/webrtc/trunk/webrtc/system_wrappers/source/spreadsortlib/spreadsort.hpp
+@@ -21,6 +21,11 @@
+ #include "constants.hpp"
+ #include <cstring>
+
++/* prevent the getchar macro from stdio to take preference over the local var */
++#if defined(__UCLIBC__)
++#undef getchar
++#endif
++
+ namespace boost {
+ namespace detail {
+ //This only works on unsigned data types
diff --git a/main/firefox/mozconfig b/main/firefox/mozconfig
index 1bc331119..8fbbf3d6e 100644
--- a/main/firefox/mozconfig
+++ b/main/firefox/mozconfig
@@ -2,45 +2,47 @@
ac_add_options --prefix=/usr
ac_add_options --libdir=/usr/lib
+
+ac_add_options --with-pthreads
+ac_add_options --with-system-bz2
+ac_add_options --with-system-icu
+ac_add_options --with-system-jpeg
+ac_add_options --with-system-libevent
+ac_add_options --with-system-libvpx
ac_add_options --with-system-nspr
ac_add_options --with-system-nss
-ac_add_options --with-system-jpeg
-ac_add_options --with-system-zlib
+ac_add_options --with-system-pixman
ac_add_options --with-system-png
-ac_add_options --with-system-libvpx
-ac_add_options --with-pthreads
-ac_add_options --disable-tests
-ac_add_options --disable-debug
-ac_add_options --enable-optimize
-ac_add_options --disable-installer
-ac_add_options --enable-xinerama
-ac_add_options --enable-default-toolkit=cairo-gtk2
-ac_add_options --disable-xprint
-ac_add_options --disable-strip
-ac_add_options --enable-pango
-ac_add_options --enable-svg
-ac_add_options --enable-canvas
+ac_add_options --with-system-zlib
+
+ac_add_options --enable-system-hunspell
+ac_add_options --enable-system-sqlite
+ac_add_options --enable-system-cairo
+ac_add_options --enable-system-ffi
+
+# make the -dbg package more meaningful with symbols
+# ac_add_options --enable-debug-symbols=-g
+ac_add_options --disable-install-strip
+
+ac_add_options --enable-gstreamer=1.0
+ac_add_options --enable-official-branding
+ac_add_options --enable-optimize="$CFLAGS"
ac_add_options --enable-startup-notification
-ac_add_options --enable-libxul
-ac_add_options --with-system-libxul
+
+ac_add_options --disable-cpp-exceptions
ac_add_options --disable-crashreporter
-ac_add_options --disable-updater
-ac_add_options --enable-safe-browsing
-ac_add_options --enable-chrome-format=jar
ac_add_options --disable-elf-hack
-ac_add_options --enable-libnotify
-ac_add_options --disable-cpp-exceptions
-ac_add_options --enable-url-classifier
-ac_add_options --enable-gio
-ac_add_options --enable-gstreamer=1.0
ac_add_options --disable-gnomevfs
-ac_add_options --disable-static
-ac_add_options --enable-official-branding
-ac_add_options --with-system-icu
+ac_add_options --disable-installer
+ac_add_options --disable-javaxpcom
+ac_add_options --disable-jemalloc
+ac_add_options --disable-mochitest
ac_add_options --disable-pulseaudio
-#uclibc#ac_add_options --enable-jemalloc
-#uclibc#ac_add_options --enable-replace-malloc
-#musl#ac_add_options --disable-jemalloc
+ac_add_options --disable-static
+ac_add_options --disable-strip
+ac_add_options --disable-tests
+ac_add_options --disable-updater
+ac_add_options --disable-xprint
export BUILD_OFFICIAL=1
export MOZILLA_OFFICIAL=1
@@ -49,3 +51,4 @@ export USE_SHORT_LIBNAME=1
mk_add_options BUILD_OFFICIAL=1
mk_add_options MOZILLA_OFFICIAL=1
mk_add_options USE_SHORT_LIBNAME=1
+mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/objdir
diff --git a/main/firefox/mozilla-build-arm.patch b/main/firefox/mozilla-build-arm.patch
new file mode 100644
index 000000000..dcf2f6d8a
--- /dev/null
+++ b/main/firefox/mozilla-build-arm.patch
@@ -0,0 +1,11 @@
+--- ./gfx/ycbcr/moz.build.orig 2014-04-03 13:50:38.990296661 +0000
++++ ./gfx/ycbcr/moz.build 2014-04-03 13:52:26.878268547 +0000
+@@ -59,7 +59,7 @@
+ 'yuv_row_other.cpp',
+ ]
+
+-if CONFIG['CPU_ARCH'] == 'arm' and CONFIG['HAVE_ARM_NEON']:
++if CONFIG['HAVE_ARM_NEON']:
+ SOURCES += [
+ 'yuv_row_arm.s',
+ ]
diff --git a/main/firefox/rhbz-966424.patch b/main/firefox/rhbz-966424.patch
new file mode 100644
index 000000000..2be9f931a
--- /dev/null
+++ b/main/firefox/rhbz-966424.patch
@@ -0,0 +1,14 @@
+diff -up firefox-33.0/mozilla-release/toolkit/modules/CertUtils.jsm.966424 firefox-33.0/mozilla-release/toolkit/modules/CertUtils.jsm
+--- mozilla-release/toolkit/modules/CertUtils.jsm.966424 2014-10-14 08:12:14.358697255 +0200
++++ mozilla-release/toolkit/modules/CertUtils.jsm 2014-10-14 08:17:59.962181908 +0200
+@@ -174,7 +174,9 @@ this.checkCert =
+ }
+
+ function isBuiltinToken(tokenName) {
+- return tokenName == "Builtin Object Token";
++ return tokenName == "Builtin Object Token" ||
++ tokenName == "Default Trust" ||
++ tokenName == "System Trust";
+ }
+
+ /**
diff --git a/main/firefox/stab.h b/main/firefox/stab.h
new file mode 100644
index 000000000..6f70af398
--- /dev/null
+++ b/main/firefox/stab.h
@@ -0,0 +1,71 @@
+/* $OpenBSD: stab.h,v 1.3 2003/06/02 19:34:12 millert Exp $ */
+/* $NetBSD: stab.h,v 1.4 1994/10/26 00:56:25 cgd Exp $ */
+
+/*-
+ * Copyright (c) 1991 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)stab.h 5.2 (Berkeley) 4/4/91
+ */
+
+#ifndef _STAB_H_
+#define _STAB_H_
+
+/*
+ * The following are symbols used by various debuggers and by the Pascal
+ * compiler. Each of them must have one (or more) of the bits defined by
+ * the N_STAB mask set.
+ */
+
+#define N_GSYM 0x20 /* global symbol */
+#define N_FNAME 0x22 /* F77 function name */
+#define N_FUN 0x24 /* procedure name */
+#define N_STSYM 0x26 /* data segment variable */
+#define N_LCSYM 0x28 /* bss segment variable */
+#define N_MAIN 0x2a /* main function name */
+#define N_PC 0x30 /* global Pascal symbol */
+#define N_RSYM 0x40 /* register variable */
+#define N_SLINE 0x44 /* text segment line number */
+#define N_DSLINE 0x46 /* data segment line number */
+#define N_BSLINE 0x48 /* bss segment line number */
+#define N_SSYM 0x60 /* structure/union element */
+#define N_SO 0x64 /* main source file name */
+#define N_LSYM 0x80 /* stack variable */
+#define N_BINCL 0x82 /* include file beginning */
+#define N_SOL 0x84 /* included source file name */
+#define N_PSYM 0xa0 /* parameter variable */
+#define N_EINCL 0xa2 /* include file end */
+#define N_ENTRY 0xa4 /* alternate entry point */
+#define N_LBRAC 0xc0 /* left bracket */
+#define N_EXCL 0xc2 /* deleted include file */
+#define N_RBRAC 0xe0 /* right bracket */
+#define N_BCOMM 0xe2 /* begin common */
+#define N_ECOMM 0xe4 /* end common */
+#define N_ECOML 0xe8 /* end common (local name) */
+#define N_LENG 0xfe /* length of preceding entry */
+
+#endif /* !_STAB_H_ */
diff --git a/main/firefox/stat.patch b/main/firefox/stat.patch
new file mode 100644
index 000000000..ed7dc007e
--- /dev/null
+++ b/main/firefox/stat.patch
@@ -0,0 +1,25 @@
+--- ./dom/system/OSFileConstants.cpp.orig 2013-04-17 06:17:29.798371189 +0000
++++ ./dom/system/OSFileConstants.cpp 2013-04-17 06:30:30.032285977 +0000
+@@ -509,6 +509,11 @@
+ INT_CONSTANT(_STAT_VER),
+ #endif // defined(_STAT_VER)
+
++ // glibc's stat/lstat/fstat are macros while uclibc's are not
++#if defined(__GLIBC__) && !defined(__UCLIBC__)
++ { "OSFILE_STAT_MACROS", INT_TO_JSVAL(1) },
++#endif // defined(stat)
++
+ PROP_END
+ };
+
+--- ./toolkit/components/osfile/modules/osfile_unix_back.jsm.orig 2014-04-03 13:08:26.686409787 +0000
++++ ./toolkit/components/osfile/modules/osfile_unix_back.jsm 2014-04-03 13:34:14.101716259 +0000
+@@ -512,7 +512,7 @@
+ /*path*/ Type.fd,
+ /*buf*/ Type.stat.out_ptr
+ );
+- } else if (Const._STAT_VER != undefined) {
++ } else if (Const.OSFILE_STAT_MACROS != undefined) {
+ const ver = Const._STAT_VER;
+ let xstat_name, lxstat_name, fxstat_name;
+ if (OS.Constants.Sys.Name == "SunOS") {