Commit cbec7032 authored by Scarlett's avatar Scarlett Committed by Tatsuya Kinoshita

Add overflow detection

Origin: http://marc.info/?l=openbsd-ports&m=142090828929750&w=2

* main.c: Call exit(1) when out of memory to avoid dereferencing null
pointers when gc's malloc fails.

* alloc.h: Replacements for w3m's allocation macros which add
overflow detection and concentrate the macros in one file.

* indep.h, libwc/charset.c, libwc/status.c, matrix.c: Use the
overflow-detecting allocation macros from alloc.h.
parent fde71b37
/*
* 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 */
/* $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"
......@@ -92,11 +92,6 @@ 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)))
#define NewWithoutGC(type) ((type*)xmalloc(sizeof(type)))
#define NewWithoutGC_N(type,n) ((type*)xmalloc((n)*sizeof(type)))
#define NewWithoutGC_Reuse(type,ptr,n) ((type*)xrealloc(ptr,(n)*sizeof(type)))
......
#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"
......
#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
......
......@@ -383,6 +383,13 @@ make_optional_header_string(char *s)
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)
{
......@@ -412,6 +419,7 @@ main(int argc, char **argv, char **envp)
char **getimage_args = NULL;
#endif /* defined(DONT_CALL_GC_AFTER_FORK) && defined(USE_IMAGE) */
GC_INIT();
GC_set_oom_fn(die_oom);
#if defined(ENABLE_NLS) || (defined(USE_M17N) && defined(HAVE_LANGINFO_CODESET))
setlocale(LC_ALL, "");
#endif
......
......@@ -34,18 +34,12 @@
#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; }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment