Bug#1014987: netsurf: FTBFS on the Hurd - refresh patch
X-Debbugs-CC: debian-hurd@lists.debian.org
Dear Maintainer,
Refreshing the patch fixing the FTBFS on the hurd to version 3.11 of netsurf.
I don't know if the framebuffer package should be built on the hurd. With the
attached patch the package builds, but when I try to run the program with the
SDL frontend, it crashes. But perhaps it is not expected to work.
In any case that would be the case for a separate bug report.
Many thanks,
João
--- netsurf-3.11.orig/netsurf/frontends/framebuffer/fetch.c
+++ netsurf-3.11/netsurf/frontends/framebuffer/fetch.c
@@ -48,13 +48,16 @@
*/
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);
+ buf = filepath_find(respaths, path);
+ netsurf_path_to_nsurl(buf, &url);
+
+ free(buf);
return url;
}
--- netsurf-3.11.orig/netsurf/frontends/framebuffer/font_freetype.c
+++ netsurf-3.11/netsurf/frontends/framebuffer/font_freetype.c
@@ -120,15 +120,16 @@ 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);
+ buf = filepath_find(respaths, fontname);
newf->fontfile = strdup(buf);
+ free(buf);
}
error = FTC_Manager_LookupFace(ft_cmanager, (FTC_FaceID)newf, &aface);
--- netsurf-3.11.orig/netsurf/frontends/gtk/fetch.c
+++ netsurf-3.11/netsurf/frontends/gtk/fetch.c
@@ -250,14 +250,16 @@ 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);
+ buf = filepath_find(respaths, path);
+ netsurf_path_to_nsurl(buf, &url);
+ free(buf);
}
return url;
--- netsurf-3.11.orig/netsurf/frontends/gtk/gui.c
+++ netsurf-3.11/netsurf/frontends/gtk/gui.c
@@ -909,8 +909,8 @@ static nserror nsgtk_add_named_icons_to_
*/
static nserror nsgtk_setup(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;
@@ -986,8 +986,9 @@ static nserror nsgtk_setup(int argc, cha
.pma = true,
});
- filepath_sfinddef(respath, buf, "mime.types", "/etc/");
+ buf = filepath_sfinddef(respath, "mime.types", "/etc/");
gtk_fetch_filetype_init(buf);
+ free(buf);
save_complete_init();
--- netsurf-3.11.orig/netsurf/frontends/monkey/fetch.c
+++ netsurf-3.11/netsurf/frontends/monkey/fetch.c
@@ -36,10 +36,12 @@ 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);
+ buf = filepath_find(respaths, path);
+ netsurf_path_to_nsurl(buf, &url);
+ free(buf);
return url;
}
--- netsurf-3.11.orig/netsurf/frontends/monkey/main.c
+++ netsurf-3.11/netsurf/frontends/monkey/main.c
@@ -390,7 +390,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,
@@ -452,8 +452,9 @@ main(int argc, char **argv)
die("NetSurf failed to initialise");
}
- filepath_sfinddef(respaths, buf, "mime.types", "/etc/");
+ buf = filepath_sfinddef(respaths, "mime.types", "/etc/");
monkey_fetch_filetype_init(buf);
+ free(buf);
urldb_load(nsoption_charp(url_file));
urldb_load_cookies(nsoption_charp(cookie_file));
--- netsurf-3.11.orig/netsurf/frontends/windows/fetch.c
+++ netsurf-3.11/netsurf/frontends/windows/fetch.c
@@ -76,10 +76,12 @@ 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);
+ buf = filepath_find(G_resource_pathv, path);
+ netsurf_path_to_nsurl(buf, &url);
+ free(buf);
return url;
}
--- netsurf-3.11.orig/netsurf/frontends/windows/main.c
+++ netsurf-3.11/netsurf/frontends/windows/main.c
@@ -171,12 +171,13 @@ static nserror set_defaults(struct nsopt
DWORD buf_bytes_size = sizeof(TCHAR) * buf_tchar_size;
char *ptr = NULL;
char *buf;
+ char *buftest;
char *fname;
HRESULT hres;
char dldir[] = "Downloads";
buf = malloc(buf_bytes_size);
- if (buf== NULL) {
+ if (buf == NULL) {
return NSERROR_NOMEM;
}
buf[0] = '\0';
@@ -191,8 +192,9 @@ 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 (ptr != NULL) {
+ free(buf);
+ buf = filepath_find(G_resource_pathv, "ca-bundle.crt");
+ if (buf != NULL) {
nsoption_setnull_charp(ca_bundle, strdup(buf));
}
}
@@ -204,6 +206,12 @@ static nserror set_defaults(struct nsopt
* not available so use the obsolete method of user prodile
* with downloads suffixed
*/
+ buftest = realloc(buf, buf_bytes_size);
+ if (buftest == NULL) {
+ free(buf);
+ return NSERROR_BAD_SIZE;
+ }
+ buf = buftest
buf[0] = '\0';
hres = SHGetFolderPath(NULL,
--- netsurf-3.11.orig/netsurf/utils/Makefile
+++ netsurf-3.11/netsurf/utils/Makefile
@@ -24,3 +24,6 @@ S_UTILS := \
utils.c
S_UTILS := $(addprefix utils/,$(S_UTILS))
+
+#This is needed by asprintf type of functions in utils/filepath.c
+CFLAGS += -D_GNU_SOURCE
--- netsurf-3.11.orig/netsurf/utils/filepath.c
+++ netsurf-3.11/netsurf/utils/filepath.c
@@ -42,27 +42,18 @@
#define MAX_RESPATH 128
/* exported interface documented in filepath.h */
-char *filepath_vsfindfile(char *str, const char *format, va_list ap)
+char *filepath_vsfindfile(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);
- return NULL;
- }
+ len = vasprintf(&pathname, format, ap);
+
+ if (len < 0)
+ return NULL; /* error in vasprintf */
- realpathname = realpath(pathname, str);
+ realpathname = realpath(pathname, NULL);
free(pathname);
@@ -70,6 +61,7 @@ char *filepath_vsfindfile(char *str, con
/* sucessfully expanded pathname */
if (access(realpathname, R_OK) != 0) {
/* unable to read the file */
+ free(realpathname);
return NULL;
}
}
@@ -79,13 +71,13 @@ char *filepath_vsfindfile(char *str, con
/* exported interface documented in filepath.h */
-char *filepath_sfindfile(char *str, const char *format, ...)
+char *filepath_findfile(const char *format, ...)
{
va_list ap;
char *ret;
va_start(ap, format);
- ret = filepath_vsfindfile(str, format, ap);
+ ret = filepath_vsfindfile(format, ap);
va_end(ap);
return ret;
@@ -93,28 +85,17 @@ char *filepath_sfindfile(char *str, cons
/* exported interface documented in filepath.h */
-char *filepath_findfile(const char *format, ...)
-{
- char *ret;
- va_list ap;
-
- va_start(ap, format);
- ret = filepath_vsfindfile(NULL, format, ap);
- va_end(ap);
-
- return ret;
-}
-
-/* exported interface documented in filepath.h */
-char *filepath_sfind(char **respathv, char *filepath, const char *filename)
+char *filepath_find(char **respathv, const char *filename)
{
int respathc = 0;
+ char *filepath = NULL;
if ((respathv == NULL) || (respathv[0] == NULL) || (filepath == NULL))
return NULL;
while (respathv[respathc] != NULL) {
- if (filepath_sfindfile(filepath, "%s/%s", respathv[respathc], filename) != NULL) {
+ filepath = filepath_findfile("%s/%s", respathv[respathc], filename);
+ if (filepath != NULL) {
return filepath;
}
@@ -126,55 +107,33 @@ char *filepath_sfind(char **respathv, ch
/* exported interface documented in filepath.h */
-char *filepath_find(char **respathv, const char *filename)
-{
- char *ret;
- char *filepath;
-
- 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;
-}
-
-
-/* exported interface documented in filepath.h */
char *
filepath_sfinddef(char **respathv,
- 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))
+ if ((respathv == NULL) || (respathv[0] == NULL))
return NULL;
- ret = filepath_sfind(respathv, filepath, filename);
+ ret = filepath_find(respathv, filename);
if ((ret == NULL) && (def != NULL)) {
/* search failed, return the path specified */
- 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);
- }
- if (realpath(t, ret) == NULL) {
- strncpy(ret, t, PATH_MAX);
+ asprintf(&t, "%s/%s", def, filename);
}
-
+ ret = realpath(t, NULL);
+ if (ret == NULL)
+ ret = t;
+ else
+ free(t);
}
+
return ret;
}
--- netsurf-3.11.orig/netsurf/utils/filepath.h
+++ netsurf-3.11/netsurf/utils/filepath.h
@@ -35,14 +35,12 @@
* 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 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(const char *format, va_list ap);
/**
@@ -50,15 +48,6 @@ char *filepath_vsfindfile(char *str, con
*
* Similar to vsfindfile but takes variadic (printf like) parameters
*/
-char *filepath_sfindfile(char *str, const char *format, ...);
-
-
-/**
- * Create a normalised file name.
- *
- * Similar to sfindfile but allocates its own storage for the
- * returned string. The caller must free this sorage.
- */
char *filepath_findfile(const char *format, ...);
@@ -70,19 +59,9 @@ 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 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);
-
-
-/**
- * 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.
- */
char *filepath_find(char **respathv, const char *filename);
@@ -95,12 +74,11 @@ 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 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, const char *filename,
const char *def);
Reply to: