Skip to content

Commit

Permalink
Merge pull request #592 from stoeckmann/oob
Browse files Browse the repository at this point in the history
Prevent out of boundary write on malicious input
  • Loading branch information
hawicz committed May 7, 2020
2 parents 8e3d3d5 + d07b910 commit 31243e4
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 5 deletions.
3 changes: 3 additions & 0 deletions arraylist.c
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,9 @@ int array_list_del_idx(struct array_list *arr, size_t idx, size_t count)
{
size_t i, stop;

/* Avoid overflow in calculation with large indices. */
if (idx > SIZE_T_MAX - count)
return -1;
stop = idx + count;
if (idx >= arr->length || stop > arr->length)
return -1;
Expand Down
10 changes: 8 additions & 2 deletions linkhash.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

#include "config.h"

#include <assert.h>
#include <limits.h>
#include <stdarg.h>
#include <stddef.h>
Expand Down Expand Up @@ -499,6 +500,8 @@ struct lh_table *lh_table_new(int size, lh_entry_free_fn *free_fn, lh_hash_fn *h
int i;
struct lh_table *t;

/* Allocate space for elements to avoid divisions by zero. */
assert(size > 0);
t = (struct lh_table *)calloc(1, sizeof(struct lh_table));
if (!t)
return NULL;
Expand Down Expand Up @@ -577,9 +580,12 @@ int lh_table_insert_w_hash(struct lh_table *t, const void *k, const void *v, con
{
unsigned long n;

if (t->count >= t->size * LH_LOAD_FACTOR)
if (lh_table_resize(t, t->size * 2) != 0)
if (t->count >= t->size * LH_LOAD_FACTOR) {
/* Avoid signed integer overflow with large tables. */
int new_size = INT_MAX / 2 < t->size ? t->size * 2 : INT_MAX;
if (t->size == INT_MAX || lh_table_resize(t, new_size) != 0)
return -1;
}

n = h % t->size;

Expand Down
19 changes: 16 additions & 3 deletions printbuf.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@

#include "config.h"

#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
Expand Down Expand Up @@ -65,10 +66,16 @@ static int printbuf_extend(struct printbuf *p, int min_size)

if (p->size >= min_size)
return 0;

new_size = p->size * 2;
if (new_size < min_size + 8)
/* Prevent signed integer overflows with large buffers. */
if (min_size > INT_MAX - 8)
return -1;
if (p->size > INT_MAX / 2)
new_size = min_size + 8;
else {
new_size = p->size * 2;
if (new_size < min_size + 8)
new_size = min_size + 8;
}
#ifdef PRINTBUF_DEBUG
MC_DEBUG("printbuf_memappend: realloc "
"bpos=%d min_size=%d old_size=%d new_size=%d\n",
Expand All @@ -83,6 +90,9 @@ static int printbuf_extend(struct printbuf *p, int min_size)

int printbuf_memappend(struct printbuf *p, const char *buf, int size)
{
/* Prevent signed integer overflows with large buffers. */
if (size > INT_MAX - p->bpos - 1)
return -1;
if (p->size <= p->bpos + size + 1)
{
if (printbuf_extend(p, p->bpos + size + 1) < 0)
Expand All @@ -100,6 +110,9 @@ int printbuf_memset(struct printbuf *pb, int offset, int charvalue, int len)

if (offset == -1)
offset = pb->bpos;
/* Prevent signed integer overflows with large buffers. */
if (len > INT_MAX - offset)
return -1;
size_needed = offset + len;
if (pb->size < size_needed)
{
Expand Down

0 comments on commit 31243e4

Please sign in to comment.