mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-12-06 19:41:15 +01:00
Merge branch 'disable_memory_sentinels_squashed'
This commit is contained in:
@@ -12,6 +12,9 @@
|
||||
#include "util.h"
|
||||
#include "compat.h"
|
||||
#include "torlog.h"
|
||||
#include "container.h"
|
||||
|
||||
#ifndef DISABLE_MEMORY_SENTINELS
|
||||
|
||||
/** If true, we try to detect any attempts to write beyond the length of a
|
||||
* memarea. */
|
||||
@@ -304,3 +307,91 @@ memarea_assert_ok(memarea_t *area)
|
||||
}
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
struct memarea_t {
|
||||
smartlist_t *pieces;
|
||||
};
|
||||
|
||||
memarea_t *
|
||||
memarea_new(void)
|
||||
{
|
||||
memarea_t *ma = tor_malloc_zero(sizeof(memarea_t));
|
||||
ma->pieces = smartlist_new();
|
||||
return ma;
|
||||
}
|
||||
void
|
||||
memarea_drop_all(memarea_t *area)
|
||||
{
|
||||
memarea_clear(area);
|
||||
smartlist_free(area->pieces);
|
||||
tor_free(area);
|
||||
}
|
||||
void
|
||||
memarea_clear(memarea_t *area)
|
||||
{
|
||||
SMARTLIST_FOREACH(area->pieces, void *, p, tor_free_(p));
|
||||
smartlist_clear(area->pieces);
|
||||
}
|
||||
int
|
||||
memarea_owns_ptr(const memarea_t *area, const void *ptr)
|
||||
{
|
||||
SMARTLIST_FOREACH(area->pieces, const void *, p, if (ptr == p) return 1;);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void *
|
||||
memarea_alloc(memarea_t *area, size_t sz)
|
||||
{
|
||||
void *result = tor_malloc(sz);
|
||||
smartlist_add(area->pieces, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
void *
|
||||
memarea_alloc_zero(memarea_t *area, size_t sz)
|
||||
{
|
||||
void *result = tor_malloc_zero(sz);
|
||||
smartlist_add(area->pieces, result);
|
||||
return result;
|
||||
}
|
||||
void *
|
||||
memarea_memdup(memarea_t *area, const void *s, size_t n)
|
||||
{
|
||||
void *r = memarea_alloc(area, n);
|
||||
memcpy(r, s, n);
|
||||
return r;
|
||||
}
|
||||
char *
|
||||
memarea_strdup(memarea_t *area, const char *s)
|
||||
{
|
||||
size_t n = strlen(s);
|
||||
char *r = memarea_alloc(area, n+1);
|
||||
memcpy(r, s, n);
|
||||
r[n] = 0;
|
||||
return r;
|
||||
}
|
||||
char *
|
||||
memarea_strndup(memarea_t *area, const char *s, size_t n)
|
||||
{
|
||||
size_t ln = strnlen(s, n);
|
||||
char *r = memarea_alloc(area, ln+1);
|
||||
memcpy(r, s, ln);
|
||||
r[ln] = 0;
|
||||
return r;
|
||||
}
|
||||
void
|
||||
memarea_get_stats(memarea_t *area,
|
||||
size_t *allocated_out, size_t *used_out)
|
||||
{
|
||||
(void)area;
|
||||
*allocated_out = *used_out = 128;
|
||||
}
|
||||
void
|
||||
memarea_assert_ok(memarea_t *area)
|
||||
{
|
||||
(void)area;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
+9
-1
@@ -83,7 +83,11 @@ static int parse_socks_client(const uint8_t *data, size_t datalen,
|
||||
#define CHUNK_HEADER_LEN STRUCT_OFFSET(chunk_t, mem[0])
|
||||
|
||||
/* We leave this many NUL bytes at the end of the buffer. */
|
||||
#ifdef DISABLE_MEMORY_SENTINELS
|
||||
#define SENTINEL_LEN 0
|
||||
#else
|
||||
#define SENTINEL_LEN 4
|
||||
#endif
|
||||
|
||||
/* Header size plus NUL bytes at the end */
|
||||
#define CHUNK_OVERHEAD (CHUNK_HEADER_LEN + SENTINEL_LEN)
|
||||
@@ -97,18 +101,22 @@ static int parse_socks_client(const uint8_t *data, size_t datalen,
|
||||
|
||||
#define DEBUG_SENTINEL
|
||||
|
||||
#ifdef DEBUG_SENTINEL
|
||||
#if defined(DEBUG_SENTINEL) && !defined(DISABLE_MEMORY_SENTINELS)
|
||||
#define DBG_S(s) s
|
||||
#else
|
||||
#define DBG_S(s) (void)0
|
||||
#endif
|
||||
|
||||
#ifdef DISABLE_MEMORY_SENTINELS
|
||||
#define CHUNK_SET_SENTINEL(chunk, alloclen) STMT_NIL
|
||||
#else
|
||||
#define CHUNK_SET_SENTINEL(chunk, alloclen) do { \
|
||||
uint8_t *a = (uint8_t*) &(chunk)->mem[(chunk)->memlen]; \
|
||||
DBG_S(uint8_t *b = &((uint8_t*)(chunk))[(alloclen)-SENTINEL_LEN]); \
|
||||
DBG_S(tor_assert(a == b)); \
|
||||
memset(a,0,SENTINEL_LEN); \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
/** Return the next character in <b>chunk</b> onto which data can be appended.
|
||||
* If the chunk is full, this might be off the end of chunk->mem. */
|
||||
|
||||
@@ -3340,6 +3340,13 @@ test_util_memarea(void *arg)
|
||||
void *malloced_ptr = NULL;
|
||||
int i;
|
||||
|
||||
#ifdef DISABLE_MEMORY_SENTINELS
|
||||
/* If memory sentinels are disabled, this whole module is just an alias for
|
||||
malloc(), which is free to lay out memory most any way it wants. */
|
||||
if (1)
|
||||
tt_skip();
|
||||
#endif
|
||||
|
||||
(void)arg;
|
||||
tt_assert(area);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user