Pointer validation code

Mike Muuss mike at BRL.MIL
Tue Feb 5 10:09:21 AEST 1991


Dan -

Glad you found the rt_malloc() code interesting.

Let me also share some of the "magic number checking" stuff, as well.

	Best,
	 -Mike

-------

/*
 *  Macros to check and validate a structure pointer, given that
 *  the first entry in the structure is a magic number.
 */
#define RT_CKMAG(_ptr, _magic, _str)	\
	if( !(_ptr) )  { \
		rt_log("ERROR: null %s ptr, file %s, line %d\n", \
			_str, __FILE__, __LINE__ ); \
		rt_bomb("NULL pointer"); \
	} else if( *((long *)(_ptr)) != (_magic) )  { \
		rt_log("ERROR: bad %s ptr x%x, s/b x%x, was %s(x%x), file %s, line %d\n", \
			_str, _ptr, _magic, \
			rt_identify_magic( *((long *)(_ptr)) ), \
			*((long *)(_ptr)), __FILE__, __LINE__ ); \
		rt_bomb("Bad pointer"); \
	}


Here is an example use of this:

/*
 *			R T _ E X T E R N A L
 * 
 *  An "opaque" handle for holding onto objects,
 *  typically in some kind of external form that is not directly
 *  usable without passing through an "importation" function.
 */
struct rt_external  {
	long	ext_magic;
	int	ext_nbytes;
	genptr_t ext_buf;
};
#define RT_EXTERNAL_MAGIC	0x768dbbd0
#define RT_INIT_EXTERNAL(_p)	{(_p)->ext_magic = RT_EXTERNAL_MAGIC; \
	(_p)->ext_buf = GENPTR_NULL; (_p)->ext_nbytes = 0;}
#define RT_CK_EXTERNAL(_p)	RT_CKMAG(_p, RT_EXTERNAL_MAGIC, "rt_external")

/*
 *
 *			D B _ P U T _ E X T E R N A L
 *
 *  Caller is responsible for freeing memory, using db_free_external().
 */
int
db_put_external( ep, dp, dbip )
struct rt_external	*ep;
struct directory	*dp;
struct db_i		*dbip;
{
	if(rt_g.debug&DEBUG_DB) rt_log("db_put_external(%s) ep=x%x, dbip=x%x, dp=x%x\n",
		dp->d_namep, ep, dbip, dp );
	RT_CK_DBI(dbip);
	RT_CK_EXTERNAL(ep);
	if( db_put( dbip, dp, (union record *)(ep->ext_buf), 0,
	    (ep->ext_nbytes+sizeof(union record)-1)/sizeof(union record)
	    ) < 0 )
		return(-1);
	return(0);
}



More information about the Comp.sys.sgi mailing list