Allow struct_magic to be disabled.

When a subsystem is disabled, there will be no corresponding object
allocated, and no magic numbers on it.
This commit is contained in:
Nick Mathewson 2019-12-15 18:42:01 -05:00
parent 9082a6db3f
commit 419ba97df5
2 changed files with 23 additions and 2 deletions

View File

@ -131,6 +131,9 @@ typedef struct struct_member_t {
* *
* These 'magic numbers' are 32-bit values used to tag objects to make sure * These 'magic numbers' are 32-bit values used to tag objects to make sure
* that they have the correct type. * that they have the correct type.
*
* If all fields in this structure are zero or 0, the magic-number check is
* not performed.
*/ */
typedef struct struct_magic_decl_t { typedef struct struct_magic_decl_t {
/** The name of the structure */ /** The name of the structure */

View File

@ -29,14 +29,29 @@
#include <stddef.h> #include <stddef.h>
/**
* Return true iff all fields on <b>decl</b> are NULL or 0, indicating that
* there is no object or no magic number to check.
**/
static inline bool
magic_is_null(const struct_magic_decl_t *decl)
{
return decl->typename == NULL &&
decl->magic_offset == 0 &&
decl->magic_val == 0;
}
/** /**
* Set the 'magic number' on <b>object</b> to correspond to decl. * Set the 'magic number' on <b>object</b> to correspond to decl.
**/ **/
void void
struct_set_magic(void *object, const struct_magic_decl_t *decl) struct_set_magic(void *object, const struct_magic_decl_t *decl)
{ {
tor_assert(object);
tor_assert(decl); tor_assert(decl);
if (magic_is_null(decl))
return;
tor_assert(object);
uint32_t *ptr = STRUCT_VAR_P(object, decl->magic_offset); uint32_t *ptr = STRUCT_VAR_P(object, decl->magic_offset);
*ptr = decl->magic_val; *ptr = decl->magic_val;
} }
@ -47,8 +62,11 @@ struct_set_magic(void *object, const struct_magic_decl_t *decl)
void void
struct_check_magic(const void *object, const struct_magic_decl_t *decl) struct_check_magic(const void *object, const struct_magic_decl_t *decl)
{ {
tor_assert(object);
tor_assert(decl); tor_assert(decl);
if (magic_is_null(decl))
return;
tor_assert(object);
const uint32_t *ptr = STRUCT_VAR_P(object, decl->magic_offset); const uint32_t *ptr = STRUCT_VAR_P(object, decl->magic_offset);
tor_assertf(*ptr == decl->magic_val, tor_assertf(*ptr == decl->magic_val,