On 01/07/15 15:32, Scarlett wrote:
> Updated diff to bump revision (whoops), and carrying over the change to use
> overflow-detecting malloc to matrix.c (patch-matrix_c). I forgot about
> this because my local fork of w3m has been fixed to build without MATRIX.

I think this is fine. I will note that you need to add RCS ID tags at
the top of every patch file (make update-patches is kind enough to do
this for you, for future reference). But besides that one nit w3m looks
like it works as expected. It's too bad you can't get all this
upstreamed (or can you?).

Anyone else want to weigh in/give oks?

~Brian

> Index: w3m/Makefile
> ===================================================================
> RCS file: /cvs/ports/www/w3m/Makefile,v
> retrieving revision 1.84
> diff -u -p -r1.84 Makefile
> --- w3m/Makefile      16 Jul 2014 08:20:01 -0000      1.84
> +++ w3m/Makefile      7 Jan 2015 20:21:59 -0000
> @@ -3,7 +3,7 @@
>  COMMENT=     pager/text-based web browser
>  
>  DISTNAME=    w3m-0.5.3
> -REVISION=    3
> +REVISION=    4
>  CATEGORIES=  www
>  HOMEPAGE=    http://w3m.sourceforge.net/
>  
> @@ -50,6 +50,9 @@ DOCSRC=             ${WRKSRC}/doc-jp
>  CONFIGURE_ARGS+=--enable-m17n=ISO-8859-1
>  DOCSRC=              ${WRKSRC}/doc
>  .endif
> +
> +post-patch:
> +     @cp ${FILESDIR}/alloc.h ${WRKSRC}
>  
>  post-install:
>       ${INSTALL_DATA_DIR} ${PREFIX}/share/doc/w3m
> Index: w3m/files/alloc.h
> ===================================================================
> RCS file: w3m/files/alloc.h
> diff -N w3m/files/alloc.h
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ w3m/files/alloc.h 7 Jan 2015 20:21:59 -0000
> @@ -0,0 +1,39 @@
> +/*
> + * by Scarlett. public domain.
> + * replacements for w3m's allocation macros which add overflow
> + * detection and concentrate the macros in one file
> + */
> +#ifndef W3_ALLOC_H
> +#define W3_ALLOC_H
> +#include <gc.h>
> +#include <stdlib.h>
> +#include <stdio.h>
> +#include <limits.h>
> +
> +static inline size_t
> +z_mult_no_oflow_(size_t n, size_t size)
> +{
> +     if (size != 0 && n > SIZE_MAX / size) {
> +             fprintf(stderr,
> +                 "w3m: overflow in malloc, %zu*%zu\n", n, size);
> +             exit(1);
> +     }
> +     return n * size;
> +}
> +
> +#define New(type) \
> +     (GC_MALLOC(sizeof(type)))
> +
> +#define NewAtom(type) \
> +     (GC_MALLOC_ATOMIC(sizeof(type)))
> +
> +#define New_N(type, n) \
> +     (GC_MALLOC(z_mult_no_oflow_((n), sizeof(type))))
> +
> +#define NewAtom_N(type, n) \
> +     (GC_MALLOC_ATOMIC(z_mult_no_oflow_((n), sizeof(type))))
> +
> +#define New_Reuse(type, ptr, n) \
> +     (GC_REALLOC((ptr), z_mult_no_oflow_((n), sizeof(type))))
> +
> +#endif /* W3_ALLOC_H */
> Index: w3m/patches/patch-Str_c
> ===================================================================
> RCS file: w3m/patches/patch-Str_c
> diff -N w3m/patches/patch-Str_c
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ w3m/patches/patch-Str_c   7 Jan 2015 20:21:59 -0000
> @@ -0,0 +1,127 @@
> +Use asprintf() instead of rolling our own printf string length detection.
> +
> +--- Str.c.orig       Mon Jan  5 22:49:07 2015
> ++++ Str.c    Mon Jan  5 22:52:59 2015
> +@@ -427,103 +427,27 @@
> + Str
> + Sprintf(char *fmt, ...)
> + {
> +-    int len = 0;
> +-    int status = SP_NORMAL;
> +-    int p = 0;
> +-    char *f;
> +-    Str s;
> +-    va_list ap;
> ++    Str s;
> ++    char *cb;
> ++    int ret;
> ++    size_t n;
> ++    va_list ap;
> + 
> +-    va_start(ap, fmt);
> +-    for (f = fmt; *f; f++) {
> +-      redo:
> +-    switch (status) {
> +-    case SP_NORMAL:
> +-        if (*f == '%') {
> +-            status = SP_PREC;
> +-            p = 0;
> +-        }
> +-        else
> +-            len++;
> +-        break;
> +-    case SP_PREC:
> +-        if (IS_ALPHA(*f)) {
> +-            /* conversion char. */
> +-            double vd;
> +-            int vi;
> +-            char *vs;
> +-            void *vp;
> +-
> +-            switch (*f) {
> +-            case 'l':
> +-            case 'h':
> +-            case 'L':
> +-            case 'w':
> +-                continue;
> +-            case 'd':
> +-            case 'i':
> +-            case 'o':
> +-            case 'x':
> +-            case 'X':
> +-            case 'u':
> +-                vi = va_arg(ap, int);
> +-                len += (p > 0) ? p : 10;
> +-                break;
> +-            case 'f':
> +-            case 'g':
> +-            case 'e':
> +-            case 'G':
> +-            case 'E':
> +-                vd = va_arg(ap, double);
> +-                len += (p > 0) ? p : 15;
> +-                break;
> +-            case 'c':
> +-                len += 1;
> +-                vi = va_arg(ap, int);
> +-                break;
> +-            case 's':
> +-                vs = va_arg(ap, char *);
> +-                vi = strlen(vs);
> +-                len += (p > vi) ? p : vi;
> +-                break;
> +-            case 'p':
> +-                vp = va_arg(ap, void *);
> +-                len += 10;
> +-                break;
> +-            case 'n':
> +-                vp = va_arg(ap, void *);
> +-                break;
> +-            }
> +-            status = SP_NORMAL;
> +-        }
> +-        else if (IS_DIGIT(*f))
> +-            p = p * 10 + *f - '0';
> +-        else if (*f == '.')
> +-            status = SP_PREC2;
> +-        else if (*f == '%') {
> +-            status = SP_NORMAL;
> +-            len++;
> +-        }
> +-        break;
> +-    case SP_PREC2:
> +-        if (IS_ALPHA(*f)) {
> +-            status = SP_PREC;
> +-            goto redo;
> +-        }
> +-        break;
> ++    va_start(ap, fmt);
> ++    ret = vasprintf(&cb, fmt, ap);
> ++    if (ret == -1) {
> ++            fprintf(stderr,
> ++                "Sprintf: vasprintf failed\n");
> ++            exit(1);
> +     }
> +-    }
> +-    va_end(ap);
> +-    s = Strnew_size(len * 2);
> +-    va_start(ap, fmt);
> +-    vsprintf(s->ptr, fmt, ap);
> +-    va_end(ap);
> +-    s->length = strlen(s->ptr);
> +-    if (s->length > len * 2) {
> +-    fprintf(stderr, "Sprintf: string too long\n");
> +-    exit(1);
> +-    }
> +-    return s;
> ++    va_end(ap);
> ++
> ++    n = (size_t) ret + 1;
> ++    s = Strnew_size(n);
> ++    s->length = ret;
> ++    memcpy(s->ptr, cb, n);
> ++    free(cb);
> ++    return s;
> + }
> + 
> + Str
> Index: w3m/patches/patch-cookie_c
> ===================================================================
> RCS file: w3m/patches/patch-cookie_c
> diff -N w3m/patches/patch-cookie_c
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ w3m/patches/patch-cookie_c        7 Jan 2015 20:21:59 -0000
> @@ -0,0 +1,27 @@
> +Pass the char pointer in the string struct to printf %s instead of
> +the string struct itself.
> +Print time_t using %lld instead of %ld to allow for 64-bit time_t
> +
> +--- cookie.c.orig    Mon Jan  5 22:28:06 2015
> ++++ cookie.c Mon Jan  5 22:43:18 2015
> +@@ -247,7 +247,7 @@
> +             Strcat(tmp, Sprintf("; $Domain=\"%s\"", p1->domain->ptr));
> +         if (p1->portl)
> +             Strcat(tmp,
> +-                   Sprintf("; $Port=\"%s\"", portlist2str(p1->portl)));
> ++                   Sprintf("; $Port=\"%s\"", portlist2str(p1->portl)->ptr));
> +     }
> +     }
> +     return tmp;
> +@@ -461,9 +461,9 @@
> +     for (p = First_cookie; p; p = p->next) {
> +     if (!(p->flag & COO_USE) || p->flag & COO_DISCARD)
> +         continue;
> +-    fprintf(fp, "%s\t%s\t%s\t%ld\t%s\t%s\t%d\t%d\t%s\t%s\t%s\n",
> ++    fprintf(fp, "%s\t%s\t%s\t%lld\t%s\t%s\t%d\t%d\t%s\t%s\t%s\n",
> +             parsedURL2Str(&p->url)->ptr,
> +-            p->name->ptr, p->value->ptr, p->expires,
> ++            p->name->ptr, p->value->ptr, (long long) p->expires,
> +             p->domain->ptr, p->path->ptr, p->flag,
> +             p->version, str2charp(p->comment),
> +             (p->portl) ? portlist2str(p->portl)->ptr : "",
> Index: w3m/patches/patch-indep_h
> ===================================================================
> RCS file: w3m/patches/patch-indep_h
> diff -N w3m/patches/patch-indep_h
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ w3m/patches/patch-indep_h 7 Jan 2015 20:21:59 -0000
> @@ -0,0 +1,25 @@
> +Use the overflow-detecting allocation macros from alloc.h
> +
> +--- indep.h.orig     Mon Jan  5 23:04:18 2015
> ++++ indep.h  Mon Jan  5 23:04:45 2015
> +@@ -1,7 +1,7 @@
> + /* $Id: indep.h,v 1.16 2003/09/22 21:02:19 ukai Exp $ */
> + #ifndef INDEP_H
> + #define INDEP_H
> +-#include <gc.h>
> ++#include "alloc.h"
> + #include "Str.h"
> + #include "config.h"
> + 
> +@@ -70,11 +70,5 @@
> + extern char *w3m_etc_dir();
> + extern char *w3m_conf_dir();
> + extern char *w3m_help_dir();
> +-
> +-#define New(type)   ((type*)GC_MALLOC(sizeof(type)))
> +-#define NewAtom(type)       ((type*)GC_MALLOC_ATOMIC(sizeof(type)))
> +-#define New_N(type,n)       ((type*)GC_MALLOC((n)*sizeof(type)))
> +-#define NewAtom_N(type,n)   ((type*)GC_MALLOC_ATOMIC((n)*sizeof(type)))
> +-#define New_Reuse(type,ptr,n)   ((type*)GC_REALLOC((ptr),(n)*sizeof(type)))
> + 
> + #endif                              /* INDEP_H */
> Index: w3m/patches/patch-libwc_charset_c
> ===================================================================
> RCS file: w3m/patches/patch-libwc_charset_c
> diff -N w3m/patches/patch-libwc_charset_c
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ w3m/patches/patch-libwc_charset_c 7 Jan 2015 20:21:59 -0000
> @@ -0,0 +1,14 @@
> +Use the overflow-detecting allocation macros from alloc.h
> +
> +--- libwc/charset.c.orig     Mon Jan  5 23:06:56 2015
> ++++ libwc/charset.c  Mon Jan  5 23:07:25 2015
> +@@ -1,8 +1,7 @@
> + 
> + #include <stdlib.h>
> + #include <ctype.h>
> +-#include <gc.h>
> +-#define New_N(type,n) ((type*)GC_MALLOC((n)*sizeof(type)))
> ++#include "../alloc.h"
> + 
> + #include "wc.h"
> + 
> Index: w3m/patches/patch-libwc_status_c
> ===================================================================
> RCS file: w3m/patches/patch-libwc_status_c
> diff -N w3m/patches/patch-libwc_status_c
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ w3m/patches/patch-libwc_status_c  7 Jan 2015 20:21:59 -0000
> @@ -0,0 +1,13 @@
> +Use the overflow-detecting allocation macros from alloc.h
> +
> +--- libwc/status.c.orig      Mon Jan  5 23:09:10 2015
> ++++ libwc/status.c   Mon Jan  5 23:12:39 2015
> +@@ -1,7 +1,6 @@
> + 
> + #include <string.h>
> +-#include <gc.h>
> +-#define New_N(type,n) ((type*)GC_MALLOC((n)*sizeof(type)))
> ++#include "../alloc.h"
> + 
> + #include "wc.h"
> + #ifdef USE_UNICODE
> Index: w3m/patches/patch-local_c
> ===================================================================
> RCS file: w3m/patches/patch-local_c
> diff -N w3m/patches/patch-local_c
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ w3m/patches/patch-local_c 7 Jan 2015 20:21:59 -0000
> @@ -0,0 +1,13 @@
> +Fix for a directory descriptor leak, from max at suse dot de
> +https://build.opensuse.org/package/view_file/openSUSE:Factory/w3m/w3m-closedir.patch?expand=1
> +
> +--- local.c.orig     Mon Jan  5 22:05:35 2015
> ++++ local.c  Mon Jan  5 22:06:33 2015
> +@@ -109,6 +109,7 @@
> +         n++;
> +     }
> +     }
> ++    (void)closedir(d);
> + 
> +     if (multicolList) {
> +     l = COLS / (maxlen + 2);
> Index: w3m/patches/patch-main_c
> ===================================================================
> RCS file: /cvs/ports/www/w3m/patches/patch-main_c,v
> retrieving revision 1.1
> diff -u -p -r1.1 patch-main_c
> --- w3m/patches/patch-main_c  1 Jun 2013 21:06:20 -0000       1.1
> +++ w3m/patches/patch-main_c  7 Jan 2015 20:21:59 -0000
> @@ -1,7 +1,34 @@
>  $OpenBSD: patch-main_c,v 1.1 2013/06/01 21:06:20 kurt Exp $
> ---- main.c.orig      Thu May 30 12:31:09 2013
> -+++ main.c   Thu May 30 12:32:02 2013
> -@@ -833,7 +833,9 @@ main(int argc, char **argv, char **envp)
> +
> +Call exit(1) when out of memory to avoid dereferencing null pointers
> +when gc's malloc fails. Update warn_proc for new gc API, and print
> +a long int using the correct format specifier.
> +
> +--- main.c.orig      Tue Jan  4 03:42:19 2011
> ++++ main.c   Mon Jan  5 22:33:28 2015
> +@@ -372,6 +372,13 @@
> +     return hs;
> + }
> + 
> ++static void *
> ++die_oom(size_t bytes)
> ++{
> ++    fprintf(stderr, "Out of memory: %zu bytes unavailable!\n", bytes);
> ++    exit(1);
> ++}
> ++
> + int
> + main(int argc, char **argv, char **envp)
> + {
> +@@ -398,6 +405,7 @@
> + #endif
> + #endif
> +     GC_INIT();
> ++    GC_set_oom_fn(die_oom);
> + #if defined(ENABLE_NLS) || (defined(USE_M17N) && 
> defined(HAVE_LANGINFO_CODESET))
> +     setlocale(LC_ALL, "");
> + #endif
> +@@ -833,7 +841,9 @@
>       mySignal(SIGPIPE, SigPipe);
>   #endif
>   
> @@ -12,3 +39,12 @@ $OpenBSD: patch-main_c,v 1.1 2013/06/01 
>       err_msg = Strnew();
>       if (load_argc == 0) {
>       /* no URL specified */
> +@@ -5671,7 +5681,7 @@
> +         set_environ("W3M_CURRENT_FORM", form2str((FormItemList *)a->url));
> +     else
> +         set_environ("W3M_CURRENT_FORM", "");
> +-    set_environ("W3M_CURRENT_LINE", Sprintf("%d",
> ++    set_environ("W3M_CURRENT_LINE", Sprintf("%ld",
> +                                             l->real_linenumber)->ptr);
> +     set_environ("W3M_CURRENT_COLUMN", Sprintf("%d",
> +                                               buf->currentColumn +
> Index: w3m/patches/patch-map_c
> ===================================================================
> RCS file: w3m/patches/patch-map_c
> diff -N w3m/patches/patch-map_c
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ w3m/patches/patch-map_c   7 Jan 2015 20:21:59 -0000
> @@ -0,0 +1,13 @@
> +Print size_t using the correct format specifier
> +
> +--- map.c.orig       Mon Jan  5 22:37:07 2015
> ++++ map.c    Mon Jan  5 22:37:52 2015
> +@@ -581,7 +581,7 @@
> +                "<tr valign=top><td nowrap>Number of lines<td>",
> +                Sprintf("%d", all)->ptr,
> +                "<tr valign=top><td nowrap>Transferred bytes<td>",
> +-               Sprintf("%d", buf->trbyte)->ptr, NULL);
> ++               Sprintf("%zu", buf->trbyte)->ptr, NULL);
> + 
> +     a = retrieveCurrentAnchor(buf);
> +     if (a != NULL) {
> Index: w3m/patches/patch-matrix_c
> ===================================================================
> RCS file: w3m/patches/patch-matrix_c
> diff -N w3m/patches/patch-matrix_c
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ w3m/patches/patch-matrix_c        7 Jan 2015 20:21:59 -0000
> @@ -0,0 +1,23 @@
> +Use the overflow-detecting allocation macros from alloc.h
> +
> +--- matrix.c.orig    Wed Jan  7 14:08:31 2015
> ++++ matrix.c Wed Jan  7 14:11:12 2015
> +@@ -34,17 +34,11 @@
> + 
> + #include "config.h"
> + #include "matrix.h"
> +-#include <gc.h>
> ++#include "alloc.h"
> + 
> + /* 
> +  * Macros from "fm.h".
> +  */
> +-
> +-#define New(type)       ((type*)GC_MALLOC(sizeof(type)))
> +-#define NewAtom(type)   ((type*)GC_MALLOC_ATOMIC(sizeof(type)))
> +-#define New_N(type,n)   ((type*)GC_MALLOC((n)*sizeof(type)))
> +-#define NewAtom_N(type,n)       ((type*)GC_MALLOC_ATOMIC((n)*sizeof(type)))
> +-#define Renew_N(type,ptr,n)   ((type*)GC_REALLOC((ptr),(n)*sizeof(type)))
> + 
> + #define SWAPD(a,b) { double tmp = a; a = b; b = tmp; }
> + #define SWAPI(a,b) { int tmp = a; a = b; b = tmp; }
> Index: w3m/patches/patch-parsetagx_c
> ===================================================================
> RCS file: w3m/patches/patch-parsetagx_c
> diff -N w3m/patches/patch-parsetagx_c
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ w3m/patches/patch-parsetagx_c     7 Jan 2015 20:21:59 -0000
> @@ -0,0 +1,14 @@
> +Fix for a null pointer deref when parsing "<input type>" in HTML,
> +from olh at suse dot de
> +https://build.opensuse.org/package/view_file/openSUSE:Factory/w3m/w3m-parsetagx-crash.patch?expand=1
> +
> +--- parsetagx.c.orig Mon Jan  5 22:02:56 2015
> ++++ parsetagx.c      Mon Jan  5 22:03:35 2015
> +@@ -221,6 +221,7 @@
> +          int j, hidden=FALSE;
> +          for (j=0; j<i; j++) {
> +            if (tag->attrid[j] == ATTR_TYPE &&
> ++               tag->value[j] != NULL &&
> +                strcmp("hidden",tag->value[j]) == 0) {
> +              hidden=TRUE;
> +              break;
> Index: w3m/patches/patch-w3mbookmark_c
> ===================================================================
> RCS file: w3m/patches/patch-w3mbookmark_c
> diff -N w3m/patches/patch-w3mbookmark_c
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ w3m/patches/patch-w3mbookmark_c   7 Jan 2015 20:21:59 -0000
> @@ -0,0 +1,15 @@
> +Use %s to print a string instead of passing it as the format string
> +to fprintf(), from Colin Watson at Ubuntu
> +http://anonscm.debian.org/cgit/collab-maint/w3m.git/commit/?h=bug/646321
> +
> +--- w3mbookmark.c.orig       Mon Jan  5 21:59:29 2015
> ++++ w3mbookmark.c    Mon Jan  5 21:59:55 2015
> +@@ -99,7 +99,7 @@
> +     fprintf(f, "<body>\n<h1>Bookmarks</h1>\n");
> +     fprintf(f, "<h2>%s</h2>\n<ul>\n", section);
> +     fprintf(f, "<li><a href=\"%s\">%s</a>\n", url, title);
> +-    fprintf(f, end_section);
> ++    fprintf(f, "%s", end_section);
> +     fprintf(f, "</ul>\n</body>\n</html>\n");
> +     fclose(f);
> +     }

Reply via email to