Patch WebKit because pthread_getattr_np is not implemented in uClibc

Define UCLIBC_USE_PROC_SELF_MAPS etc. as a workaround for uClibc. This
code was in the qtoipa webkit but appears to have been removed from
more recent versions of webkit.

See: http://bugreports.qt.nokia.com/browse/QTBUG-6551
Credit for fix: http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&p=545066#545066

Signed-off-by: Paul Jones <paul@pauljones.id.au>

Index: webkit-1.2.3/JavaScriptCore/runtime/Collector.cpp
===================================================================
--- webkit-1.2.3.orig/JavaScriptCore/runtime/Collector.cpp	2010-07-22 17:16:19.000000000 +0200
+++ webkit-1.2.3/JavaScriptCore/runtime/Collector.cpp	2010-07-22 17:25:02.000000000 +0200
@@ -75,6 +75,19 @@
 #endif
 #include <unistd.h>
 
+#if defined(__UCLIBC__)
+// versions of uClibc 0.9.32 and below with linuxthreads.old do not have
+// pthread_getattr_np or pthread_attr_getstack.
+#if __UCLIBC_MAJOR__ == 0 &&					\
+  (__UCLIBC_MINOR__ < 9 ||					\
+   (__UCLIBC_MINOR__ == 9 && __UCLIBC_SUBLEVEL__ <= 32)) &&	\
+   defined(__LINUXTHREADS_OLD__)
+#define UCLIBC_USE_PROC_SELF_MAPS 1
+#include <stdio_ext.h>
+extern int *__libc_stack_end;
+#endif
+#endif
+
 #if OS(SOLARIS)
 #include <thread.h>
 #else
@@ -610,6 +622,36 @@
     get_thread_info(find_thread(NULL), &threadInfo);
     return threadInfo.stack_end;
 #elif OS(UNIX)
+#ifdef UCLIBC_USE_PROC_SELF_MAPS
+    // Read /proc/self/maps and locate the line whose address
+    // range contains __libc_stack_end.
+    FILE *file = fopen("/proc/self/maps", "r");
+    if (!file)
+      return 0;
+    __fsetlocking(file, FSETLOCKING_BYCALLER);
+    char *line = NULL;
+    size_t lineLen = 0;
+    while (!feof_unlocked(file)) {
+      if (getdelim(&line, &lineLen, '\n', file) <= 0)
+	break;
+      long from;
+      long to;
+      if (sscanf (line, "%lx-%lx", &from, &to) != 2)
+	continue;
+      if (from <= (long)__libc_stack_end && (long)__libc_stack_end < to) {
+	fclose(file);
+	free(line);
+#ifdef _STACK_GROWS_UP
+	return (void *)from;
+#else
+	return (void *)to;
+#endif
+      }
+    }
+    fclose(file);
+    free(line);
+    return 0;
+#else 
     static void* stackBase = 0;
     static size_t stackSize = 0;
     static pthread_t stackThread;
@@ -631,6 +673,7 @@
         stackThread = thread;
     }
     return static_cast<char*>(stackBase) + stackSize;
+#endif
 #elif OS(WINCE)
     if (g_stackBase)
         return g_stackBase;
