From 2b5f8dcd61c1ba594a5c80ec470d3bb6378f660d Mon Sep 17 00:00:00 2001 From: Robert Clausecker Date: Sat, 9 Mar 2013 18:30:05 +0100 Subject: [PATCH 1/2] Workaround double free problems The source code for handling images has a double free problem. Recent versions of the GNU libc have a mechanism to automagically abort the program in such a case. This causes Mosaic to crash if images are displayed. I work around this issue by turning of automatical program abortion with a call to mallopt(). --- src/main.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main.c b/src/main.c index 93c30f4..f69f0cc 100644 --- a/src/main.c +++ b/src/main.c @@ -71,6 +71,7 @@ #include #include #include +#include /* swp */ #define _KCMS_H_ @@ -231,6 +232,14 @@ main (int argc, char **argv, char **envp) /* Since we're doing lots of TCP, just ignore SIGPIPE altogether. */ signal (SIGPIPE, SIG_IGN); +#ifdef M_CHECK_ACTION + /* some code here has the habit of freeing pointers twice. The glibc + catches this and causes the program to abort. In order to make the + code somehow work, we turn aborting the program off. */ + + mallopt(M_CHECK_ACTION,5); +#endif + InitChildProcessor(); MoCCIPreInitialize(); From a00b1bdd48a286a8b6d6a513eb933838ce6cfae4 Mon Sep 17 00:00:00 2001 From: Robert Clausecker Date: Sat, 9 Mar 2013 18:32:44 +0100 Subject: [PATCH 2/2] Enable compilation with clang Some functions that ought to return a value call return without any value. This commit adds a dummy value to each of those returns so that clang stops complaining. --- libhtmlw/HTML.c | 20 ++++++++++---------- libhtmlw/HTMLformat.c | 4 ++-- libhtmlw/HTMLtable.c | 4 ++-- libwww2/HTNews.c | 2 +- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/libhtmlw/HTML.c b/libhtmlw/HTML.c index 59698e6..08feca6 100644 --- a/libhtmlw/HTML.c +++ b/libhtmlw/HTML.c @@ -741,13 +741,13 @@ XGCValues values; hw->html.bgclip_SAVE=None; if (NoBodyImages(hw)) { - return; + return 0; } /* ??? Why is this here? */ hw->html.view->core.background_pixel = hw->html.background_SAVE ; - return; + return 0; } int NoBodyImages(Widget w) { @@ -770,7 +770,7 @@ unsigned long valuemask; XGCValues values; if (!bgname || !*bgname || !(hw->html.drawGC)) { - return; + return 0; } if (hw->html.delay_images==True || currently_delaying_images==1) { @@ -814,7 +814,7 @@ XGCValues values; } } - return; + return 0; } @@ -832,7 +832,7 @@ hw_do_color(Widget w, char *att, char *cname) int i; if (!att || !*att || !cname || !*cname) { - return; + return -1; } cmap = hw->core.colormap; @@ -847,14 +847,14 @@ hw_do_color(Widget w, char *att, char *cname) if(!allocated){ if(*val=='#') val++; if (!*val) { - return; + return -1; } if (strlen(val)>=6) { /* Must be valid hex */ for (i=0; i<6; i++) { if (!strchr("0123456789AaBbCcDdEeFf",val[i])) { - return; + return -1; } } @@ -875,10 +875,10 @@ hw_do_color(Widget w, char *att, char *cname) col.flags = DoRed | DoGreen | DoBlue; if (!XAllocColor(XtDisplay(w),cmap,&col)) { - return; + return -1; } } else { - return; + return -1; } } @@ -910,7 +910,7 @@ hw_do_color(Widget w, char *att, char *cname) hw->html.activeAnchor_fg = col.pixel; } - return; + return -1; } void diff --git a/libhtmlw/HTMLformat.c b/libhtmlw/HTMLformat.c index 26cef60..0b46f74 100644 --- a/libhtmlw/HTMLformat.c +++ b/libhtmlw/HTMLformat.c @@ -2706,7 +2706,7 @@ int extra; if ((*mptr)->is_end) { /* end of table */ - return; + return 0; } extra = 10; @@ -2715,7 +2715,7 @@ int extra; SetElement(hw, E_TABLE, currentFont, *x, *y, (char *) mptr, NULL, NULL, IMAGE_DEFAULT_BORDER); if (!Current->table_data) { /* no table */ - return; + return 0; } Current->alignment = ALIGN_MIDDLE; Current->width = Current->table_data->width; diff --git a/libhtmlw/HTMLtable.c b/libhtmlw/HTMLtable.c index 3edcd26..84b92c4 100644 --- a/libhtmlw/HTMLtable.c +++ b/libhtmlw/HTMLtable.c @@ -1078,11 +1078,11 @@ int baseLine; int yy; if (field->type == F_NONE) { /* nothing to display in field */ - return; + return -1; } if (field->type != F_TEXT) { /* routine only does text at this time */ - return; + return -1; } /* adjust for aesthetic surounding space */ diff --git a/libwww2/HTNews.c b/libwww2/HTNews.c index 4d46c4a..6f9d125 100644 --- a/libwww2/HTNews.c +++ b/libwww2/HTNews.c @@ -960,7 +960,7 @@ int NNTPgetarthdrs(char *art,char **ref, char **grp, char **subj, char **from) char ch = *p++ = HTGetCharacter (); if (ch==(char)EOF) { abort_socket(); /* End of file, close socket */ - return; /* End of file on response */ + return -1; /* End of file on response */ } if ((ch == LF)