2000-12-12 10:33:13 +00:00
|
|
|
/*
|
|
|
|
* PuTTY memory-handling header.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef PUTTY_PUTTYMEM_H
|
|
|
|
#define PUTTY_PUTTYMEM_H
|
|
|
|
|
2001-05-06 14:35:20 +00:00
|
|
|
#include <stddef.h> /* for size_t */
|
|
|
|
#include <string.h> /* for memcpy() */
|
2001-04-28 09:24:19 +00:00
|
|
|
|
Move standalone parts of misc.c into utils.c.
misc.c has always contained a combination of things that are tied
tightly into the PuTTY code base (e.g. they use the conf system, or
work with our sockets abstraction) and things that are pure standalone
utility functions like nullstrcmp() which could quite happily be
dropped into any C program without causing a link failure.
Now the latter kind of standalone utility code lives in the new source
file utils.c, whose only external dependency is on memory.c (for snew,
sfree etc), which in turn requires the user to provide an
out_of_memory() function. So it should now be much easier to link test
programs that use PuTTY's low-level functions without also pulling in
half its bulky infrastructure.
In the process, I came across a memory allocation logging system
enabled by -DMALLOC_LOG that looks long since bit-rotted; in any case
we have much more advanced tools for that kind of thing these days,
like valgrind and Leak Sanitiser, so I've just removed it rather than
trying to transplant it somewhere sensible. (We can always pull it
back out of the version control history if really necessary, but I
haven't used it in at least a decade.)
The other slightly silly thing I did was to give bufchain a function
pointer field that points to queue_idempotent_callback(), and disallow
direct setting of the 'ic' field in favour of calling
bufchain_set_callback which will fill that pointer in too. That allows
the bufchain system to live in utils.c rather than misc.c, so that
programs can use it without also having to link in the callback system
or provide an annoying stub of that function. In fact that's just
allowed me to remove stubs of that kind from PuTTYgen and Pageant!
2019-01-03 08:44:11 +00:00
|
|
|
#include "defs.h"
|
2001-04-28 09:24:19 +00:00
|
|
|
|
2005-02-20 10:30:05 +00:00
|
|
|
#define smalloc(z) safemalloc(z,1)
|
|
|
|
#define snmalloc safemalloc
|
|
|
|
#define srealloc(y,z) saferealloc(y,z,1)
|
|
|
|
#define snrealloc saferealloc
|
2000-12-12 10:33:13 +00:00
|
|
|
#define sfree safefree
|
|
|
|
|
2005-02-20 10:30:05 +00:00
|
|
|
void *safemalloc(size_t, size_t);
|
|
|
|
void *saferealloc(void *, size_t, size_t);
|
2000-12-12 10:33:13 +00:00
|
|
|
void safefree(void *);
|
|
|
|
|
2003-03-29 16:14:26 +00:00
|
|
|
/*
|
|
|
|
* Direct use of smalloc within the code should be avoided where
|
2019-01-03 10:51:52 +00:00
|
|
|
* possible, in favour of these type-casting macros which ensure you
|
|
|
|
* don't mistakenly allocate enough space for one sort of structure
|
|
|
|
* and assign it to a different sort of pointer. sresize also uses
|
|
|
|
* TYPECHECK to verify that the _input_ pointer is a pointer to the
|
|
|
|
* correct type.
|
2003-03-29 16:14:26 +00:00
|
|
|
*/
|
2005-02-20 10:30:05 +00:00
|
|
|
#define snew(type) ((type *)snmalloc(1, sizeof(type)))
|
|
|
|
#define snewn(n, type) ((type *)snmalloc((n), sizeof(type)))
|
2019-01-03 10:51:52 +00:00
|
|
|
#define sresize(ptr, n, type) TYPECHECK((type *)0 == (ptr), \
|
|
|
|
((type *)snrealloc((ptr), (n), sizeof(type))))
|
2001-04-28 09:24:19 +00:00
|
|
|
|
2018-06-06 05:42:52 +00:00
|
|
|
/*
|
|
|
|
* For cases where you want to allocate a struct plus a subsidiary
|
|
|
|
* data buffer in one step, this macro lets you add a constant to the
|
|
|
|
* amount malloced.
|
|
|
|
*
|
|
|
|
* Since the return value is already cast to the struct type, a
|
|
|
|
* pointer to that many bytes of extra data can be conveniently
|
|
|
|
* obtained by simply adding 1 to the returned pointer!
|
|
|
|
* snew_plus_get_aux is a handy macro that does that and casts the
|
|
|
|
* result to void *, so you can assign it straight to wherever you
|
|
|
|
* wanted it.
|
|
|
|
*/
|
|
|
|
#define snew_plus(type, extra) ((type *)snmalloc(1, sizeof(type) + (extra)))
|
|
|
|
#define snew_plus_get_aux(ptr) ((void *)((ptr) + 1))
|
|
|
|
|
Move standalone parts of misc.c into utils.c.
misc.c has always contained a combination of things that are tied
tightly into the PuTTY code base (e.g. they use the conf system, or
work with our sockets abstraction) and things that are pure standalone
utility functions like nullstrcmp() which could quite happily be
dropped into any C program without causing a link failure.
Now the latter kind of standalone utility code lives in the new source
file utils.c, whose only external dependency is on memory.c (for snew,
sfree etc), which in turn requires the user to provide an
out_of_memory() function. So it should now be much easier to link test
programs that use PuTTY's low-level functions without also pulling in
half its bulky infrastructure.
In the process, I came across a memory allocation logging system
enabled by -DMALLOC_LOG that looks long since bit-rotted; in any case
we have much more advanced tools for that kind of thing these days,
like valgrind and Leak Sanitiser, so I've just removed it rather than
trying to transplant it somewhere sensible. (We can always pull it
back out of the version control history if really necessary, but I
haven't used it in at least a decade.)
The other slightly silly thing I did was to give bufchain a function
pointer field that points to queue_idempotent_callback(), and disallow
direct setting of the 'ic' field in favour of calling
bufchain_set_callback which will fill that pointer in too. That allows
the bufchain system to live in utils.c rather than misc.c, so that
programs can use it without also having to link in the callback system
or provide an annoying stub of that function. In fact that's just
allowed me to remove stubs of that kind from PuTTYgen and Pageant!
2019-01-03 08:44:11 +00:00
|
|
|
/*
|
|
|
|
* This function is called by the innermost safemalloc/saferealloc
|
|
|
|
* functions when allocation fails. Usually it's provided by misc.c
|
|
|
|
* which ties it into an application's existing modalfatalbox()
|
|
|
|
* system, but standalone test applications can reimplement it some
|
|
|
|
* other way if they prefer.
|
|
|
|
*/
|
|
|
|
NORETURN void out_of_memory(void);
|
|
|
|
|
2019-02-28 18:50:13 +00:00
|
|
|
#ifdef MINEFIELD
|
|
|
|
/*
|
|
|
|
* Definitions for Minefield, PuTTY's own Windows-specific malloc
|
|
|
|
* debugger in the style of Electric Fence. Implemented in winmisc.c,
|
|
|
|
* and referred to by the main malloc wrappers in memory.c.
|
|
|
|
*/
|
|
|
|
void *minefield_c_malloc(size_t size);
|
|
|
|
void minefield_c_free(void *p);
|
|
|
|
void *minefield_c_realloc(void *p, size_t size);
|
|
|
|
#endif
|
|
|
|
|
2000-12-12 10:33:13 +00:00
|
|
|
#endif
|