--- netsurf-3.10.orig/libnsutils/src/time.c
+++ netsurf-3.10/libnsutils/src/time.c
@@ -16,11 +16,11 @@
 #include <stdlib.h>
 #include <unistd.h>
 
-#if (defined(_POSIX_TIMERS) && (_POSIX_TIMERS > 0) && (defined _POSIX_MONOTONIC_CLOCK)) || defined(__OpenBSD__)
+#if (defined(_POSIX_TIMERS) && (_POSIX_TIMERS > 0) && (defined _POSIX_MONOTONIC_CLOCK)) || defined(__OpenBSD__) || defined(__GNU__)
 #include <time.h>
 #elif defined(__riscos)
 #include <oslib/os.h>
-#elif defined(__MACH__)
+#elif defined(__MACH__) && defined(__APPLE__)
 #include <mach/mach.h>
 #include <mach/clock.h>
 #include <mach/mach_time.h>
@@ -41,7 +41,7 @@ nsuerror nsu_getmonotonic_ms(uint64_t *c
     uint64_t current;
     static uint64_t prev = 0; /* previous time so we never go backwards */
 
-#if (defined(_POSIX_TIMERS) && (_POSIX_TIMERS > 0) && (defined _POSIX_MONOTONIC_CLOCK)) || defined(__OpenBSD__)
+#if (defined(_POSIX_TIMERS) && (_POSIX_TIMERS > 0) && (defined _POSIX_MONOTONIC_CLOCK)) || defined(__OpenBSD__) || defined(__GNU__)
     struct timespec tp;
 
     clock_gettime(CLOCK_MONOTONIC, &tp);
@@ -51,7 +51,7 @@ nsuerror nsu_getmonotonic_ms(uint64_t *c
 
     time = os_read_monotonic_time();
     current = time * 10;
-#elif defined(__MACH__)
+#elif defined(__MACH__) && defined(__APPLE__)
     clock_serv_t cclock;
     mach_timespec_t mts;
 
--- netsurf-3.10.orig/netsurf/frontends/framebuffer/fetch.c
+++ netsurf-3.10/netsurf/frontends/framebuffer/fetch.c
@@ -48,13 +48,17 @@
  */
 static nsurl *get_resource_url(const char *path)
 {
-	char buf[PATH_MAX];
+	char *buf = NULL;
 	nsurl *url = NULL;
 
 	if (strcmp(path, "favicon.ico") == 0)
 		path = "favicon.png";
 
-	netsurf_path_to_nsurl(filepath_sfind(respaths, buf, path), &url);
+	netsurf_path_to_nsurl(filepath_sfind(respaths, &buf, path), &url);
+        
+        if (buf != NULL) {
+		free(buf);
+	}
 
 	return url;
 }
--- netsurf-3.10.orig/netsurf/frontends/framebuffer/font_freetype.c
+++ netsurf-3.10/netsurf/frontends/framebuffer/font_freetype.c
@@ -120,15 +120,18 @@ fb_new_face(const char *option, const ch
         fb_faceid_t *newf;
         FT_Error error;
         FT_Face aface;
-	char buf[PATH_MAX];
+	char *buf = NULL;
 
         newf = calloc(1, sizeof(fb_faceid_t));
 
         if (option != NULL) {
                 newf->fontfile = strdup(option);
         } else {
-		filepath_sfind(respaths, buf, fontname);
+		filepath_sfind(respaths, &buf, fontname);
                 newf->fontfile = strdup(buf);
+		if (buf != NULL) {
+			free(buf);
+		}
         }
 
         error = FTC_Manager_LookupFace(ft_cmanager, (FTC_FaceID)newf, &aface);
--- netsurf-3.10.orig/netsurf/frontends/gtk/fetch.c
+++ netsurf-3.10/netsurf/frontends/gtk/fetch.c
@@ -249,14 +249,17 @@ const char *fetch_filetype(const char *u
 
 static nsurl *nsgtk_get_resource_url(const char *path)
 {
-	char buf[PATH_MAX];
+	char *buf = NULL;
 	nsurl *url = NULL;
 
 	/* favicon.ico -> favicon.png */
 	if (strcmp(path, "favicon.ico") == 0) {
 		nsurl_create("resource:favicon.png", &url);
 	} else {
-		netsurf_path_to_nsurl(filepath_sfind(respaths, buf, path), &url);
+		netsurf_path_to_nsurl(filepath_sfind(respaths, &buf, path), &url);
+		if (buf != NULL) {
+			free(buf);
+		}
 	}
 
 	return url;
--- netsurf-3.10.orig/netsurf/frontends/gtk/gui.c
+++ netsurf-3.10/netsurf/frontends/gtk/gui.c
@@ -335,8 +335,8 @@ static nserror nsgtk_add_named_icons_to_
  */
 static nserror nsgtk_init(int argc, char** argv, char **respath)
 {
-	char buf[PATH_MAX];
-	char *resource_filename;
+	char *buf = NULL;
+	char *resource_filename = NULL;
 	char *addr = NULL;
 	nsurl *url;
 	nserror res;
@@ -407,8 +407,12 @@ static nserror nsgtk_init(int argc, char
 	browser_set_dpi(gdk_screen_get_resolution(gdk_screen_get_default()));
 	NSLOG(netsurf, INFO, "Set CSS DPI to %d", browser_get_dpi());
 
-	filepath_sfinddef(respath, buf, "mime.types", "/etc/");
+	filepath_sfinddef(respath, &buf, "mime.types", "/etc/");
 	gtk_fetch_filetype_init(buf);
+	
+	if (buf != NULL) {
+		free(buf);
+	}
 
 	save_complete_init();
 
--- netsurf-3.10.orig/netsurf/frontends/monkey/fetch.c
+++ netsurf-3.10/netsurf/frontends/monkey/fetch.c
@@ -36,10 +36,13 @@ extern char **respaths;
 
 static nsurl *gui_get_resource_url(const char *path)
 {
-	char buf[PATH_MAX];
+	char *buf = NULL;
 	nsurl *url = NULL;
 
-	netsurf_path_to_nsurl(filepath_sfind(respaths, buf, path), &url);
+	netsurf_path_to_nsurl(filepath_sfind(respaths, &buf, path), &url);
+	if (buf != NULL) {
+		free(buf);
+	}
 
 	return url;
 }
--- netsurf-3.10.orig/netsurf/frontends/monkey/main.c
+++ netsurf-3.10/netsurf/frontends/monkey/main.c
@@ -379,7 +379,7 @@ main(int argc, char **argv)
 {
 	char *messages;
 	char *options;
-	char buf[PATH_MAX];
+	char *buf = NULL;
 	nserror ret;
 	struct netsurf_table monkey_table = {
 		.misc = &monkey_misc_table,
@@ -441,8 +441,11 @@ main(int argc, char **argv)
 		die("NetSurf failed to initialise");
 	}
 
-	filepath_sfinddef(respaths, buf, "mime.types", "/etc/");
+	filepath_sfinddef(respaths, &buf, "mime.types", "/etc/");
 	monkey_fetch_filetype_init(buf);
+	if (buf != NULL) {
+		free(buf);
+	}
 
 	urldb_load(nsoption_charp(url_file));
 	urldb_load_cookies(nsoption_charp(cookie_file));
--- netsurf-3.10.orig/netsurf/frontends/windows/fetch.c
+++ netsurf-3.10/netsurf/frontends/windows/fetch.c
@@ -76,10 +76,13 @@ static const char *fetch_filetype(const
  */
 static nsurl *nsw32_get_resource_url(const char *path)
 {
-	char buf[PATH_MAX];
+	char *buf = NULL;
 	nsurl *url = NULL;
 
-	netsurf_path_to_nsurl(filepath_sfind(G_resource_pathv, buf, path), &url);
+	netsurf_path_to_nsurl(filepath_sfind(G_resource_pathv, &buf, path), &url);
+	if (buf != NULL) {
+		free(buf);
+	}
 
 	return url;
 }
--- netsurf-3.10.orig/netsurf/frontends/windows/main.c
+++ netsurf-3.10/netsurf/frontends/windows/main.c
@@ -191,7 +191,11 @@ static nserror set_defaults(struct nsopt
 	if (res_len > 0) {
 		nsoption_setnull_charp(ca_bundle, strdup(buf));
 	} else {
-		ptr = filepath_sfind(G_resource_pathv, buf, "ca-bundle.crt");
+		if (buf != NULL) {
+			free(buf);
+			buf = NULL;
+		}
+		ptr = filepath_sfind(G_resource_pathv, &buf, "ca-bundle.crt");
 		if (ptr != NULL) {
 			nsoption_setnull_charp(ca_bundle, strdup(buf));
 		}
@@ -204,6 +208,7 @@ static nserror set_defaults(struct nsopt
 	 * not available so use the obsolete method of user prodile
 	 * with downloads suffixed
 	 */
+	buf = realloc(buf,buf_bytes_size);
 	buf[0] = '\0';
 
 	hres = SHGetFolderPath(NULL,
--- netsurf-3.10.orig/netsurf/utils/filepath.c
+++ netsurf-3.10/netsurf/utils/filepath.c
@@ -24,6 +24,11 @@
  *  straightforward.
  */
 
+/* This is needed by asprinf type of functions on GNU/Hurd*/
+#if defined(__GNU__)
+#define _GNU_SOURCE 1
+#endif
+
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <stdarg.h>
@@ -42,44 +47,43 @@
 #define MAX_RESPATH 128
 
 /* exported interface documented in filepath.h */
-char *filepath_vsfindfile(char *str, const char *format, va_list ap)
+char *filepath_vsfindfile(char **str, const char *format, va_list ap)
 {
-	char *realpathname;
 	char *pathname;
 	int len;
 
-	pathname = malloc(PATH_MAX);
-	if (pathname == NULL)
-		return NULL; /* unable to allocate memory */
-
-	len = vsnprintf(pathname, PATH_MAX, format, ap);
-
-	if ((len < 0) || (len >= PATH_MAX)) {
-		/* error or output exceeded PATH_MAX length so
-		 * operation is doomed to fail.
-		 */
-		free(pathname);
+       if (str == NULL) {
 		return NULL;
+	}
+
+	len = vasprintf(&pathname, format, ap);
+
+        if (len < 0) {
+		return NULL; /* error in vasprintf */
 	}
 
-	realpathname = realpath(pathname, str);
+	*str = realpath(pathname, NULL);
 
-	free(pathname);
+	if (pathname != NULL) {
+		free(pathname);
+	}
 
-	if (realpathname != NULL) {
+	if (*str != NULL) {
 		/* sucessfully expanded pathname */
-		if (access(realpathname, R_OK) != 0) {
+		if (access(*str, R_OK) != 0) {
 			/* unable to read the file */
+			free(*str);
+			*str=NULL;
 			return NULL;
 		}
 	}
 
-	return realpathname;
+	return *str;
 }
 
 
 /* exported interface documented in filepath.h */
-char *filepath_sfindfile(char *str, const char *format, ...)
+char *filepath_sfindfile(char **str, const char *format, ...)
 {
 	va_list ap;
 	char *ret;
@@ -105,8 +109,9 @@ char *filepath_findfile(const char *form
 	return ret;
 }
 
+
 /* exported interface documented in filepath.h */
-char *filepath_sfind(char **respathv, char *filepath, const char *filename)
+char *filepath_sfind(char **respathv, char **filepath, const char *filename)
 {
 	int respathc = 0;
 
@@ -115,7 +120,7 @@ char *filepath_sfind(char **respathv, ch
 
 	while (respathv[respathc] != NULL) {
 		if (filepath_sfindfile(filepath, "%s/%s", respathv[respathc], filename) != NULL) {
-			return filepath;
+			return *filepath;
 		}
 
 		respathc++;
@@ -128,33 +133,23 @@ char *filepath_sfind(char **respathv, ch
 /* exported interface documented in filepath.h */
 char *filepath_find(char **respathv, const char *filename)
 {
-	char *ret;
-	char *filepath;
+	char *filepath = NULL;
 
 	if ((respathv == NULL) || (respathv[0] == NULL))
 		return NULL;
 
-	filepath = malloc(PATH_MAX);
-	if (filepath == NULL)
-		return NULL;
-
-	ret = filepath_sfind(respathv, filepath, filename);
-
-	if (ret == NULL)
-		free(filepath);
-
-	return ret;
+	return filepath_sfind(respathv, &filepath, filename);
 }
 
 
 /* exported interface documented in filepath.h */
 char *
 filepath_sfinddef(char **respathv,
-		  char *filepath,
+		  char **filepath,
 		  const char *filename,
 		  const char *def)
 {
-	char t[PATH_MAX];
+        char *t = NULL;
 	char *ret;
 
 	if ((respathv == NULL) || (respathv[0] == NULL) || (filepath == NULL))
@@ -164,17 +159,22 @@ filepath_sfinddef(char **respathv,
 
 	if ((ret == NULL) && (def != NULL)) {
 		/* search failed, return the path specified */
-		ret = filepath;
+		ret = *filepath;
 		if (def[0] == '~') {
-			snprintf(t, PATH_MAX, "%s/%s/%s", getenv("HOME"), def + 1, filename);
+			asprintf(&t, "%s/%s/%s", getenv("HOME"), def + 1, filename);
 		} else {
-			snprintf(t, PATH_MAX, "%s/%s", def, filename);
+			asprintf(&t, "%s/%s", def, filename);
 		}
 		if (realpath(t, ret) == NULL) {
-			strncpy(ret, t, PATH_MAX);
+			strncpy(ret, t, strlen(ret));
 		}
 
 	}
+
+	if (t != NULL) {
+		free(t);
+	}
+
 	return ret;
 }
 
--- netsurf-3.10.orig/netsurf/utils/filepath.h
+++ netsurf-3.10/netsurf/utils/filepath.h
@@ -35,14 +35,14 @@
  * normalised path is placed in str and a pointer to str returned
  * otherwise NULL is returned. The string in str is always modified.
  *
- * @param str A buffer to contain the normalised file name must be at
- *            least PATH_MAX bytes long.
+ * @param str A pointer to the normalised file name. Starts at NULL and
+ *        is allocate within the function. Must be freed by caller.
  * @param format A printf format for the filename.
  * @param ap The list of arguments for the format.
  * @return A pointer to the expanded filename or NULL if the file is
  *         not present or accessible.
  */
-char *filepath_vsfindfile(char *str, const char *format, va_list ap);
+char *filepath_vsfindfile(char **str, const char *format, va_list ap);
 
 
 /**
@@ -50,7 +50,7 @@ char *filepath_vsfindfile(char *str, con
  *
  * Similar to vsfindfile but takes variadic (printf like) parameters
  */
-char *filepath_sfindfile(char *str, const char *format, ...);
+char *filepath_sfindfile(char **str, const char *format, ...);
 
 
 /**
@@ -70,18 +70,19 @@ char *filepath_findfile(const char *form
  * can be found in any of the resource paths.
  *
  * \param respathv The resource path vector to iterate.
- * \param filepath The buffer to place the result in.
+ * \param filepath A NULL double pointer that will be allocated and
+ *                 point to the result. Needs to be freed by caller.
  * \param filename The filename of the resource to search for.
  * \return A pointer to filepath if a target is found or NULL if not.
  */
-char *filepath_sfind(char **respathv, char *filepath, const char *filename);
+char *filepath_sfind(char **respathv, char **filepath, const char *filename);
 
 
 /**
  * Searches an array of resource paths for a file.
  *
- * Similar to filepath_sfind except it allocates its own storage for
- * the returned string. The caller must free this sorage.
+ * Similar to filepath_sfind except the result double pointer does not need
+ * to be passed as argument or freed. The caller must free this sorage.
  */
 char *filepath_find(char **respathv, const char *filename);
 
@@ -95,12 +96,12 @@ char *filepath_find(char **respathv, con
  * path and the filename.
  *
  * \param respathv The resource path vector to iterate.
- * \param filepath The buffer to place the result in. Must have space for PATH_MAX bytes.
+ * \param filepath will be allocated and give the result.
  * \param filename The filename of the resource to search for.
  * \param def The default path to use
  * \return A pointer to filepath if a target is found or the default if not
  */
-char *filepath_sfinddef(char **respathv, char *filepath, const char *filename,
+char *filepath_sfinddef(char **respathv, char **filepath, const char *filename,
 		const char *def);
 
 
