diff options
author | phk <phk@FreeBSD.org> | 2002-04-23 11:48:45 +0000 |
---|---|---|
committer | phk <phk@FreeBSD.org> | 2002-04-23 11:48:45 +0000 |
commit | 90094c67a16d89b3653201488f9e98ee89d6623a (patch) | |
tree | 754de5091c1790b87d24d309621fe77cb2ad731e /sys/geom/geom.h | |
parent | ba95eb1f7bc0c8e89dee499da75356dc54782d32 (diff) | |
download | FreeBSD-src-90094c67a16d89b3653201488f9e98ee89d6623a.zip FreeBSD-src-90094c67a16d89b3653201488f9e98ee89d6623a.tar.gz |
Introduce some serious paranoia to try to catch a memory overwrite problem
as early as possible.
Sponsored by: DARPA & NAI Labs
Diffstat (limited to 'sys/geom/geom.h')
-rw-r--r-- | sys/geom/geom.h | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/sys/geom/geom.h b/sys/geom/geom.h index f6e65bd..d707a34 100644 --- a/sys/geom/geom.h +++ b/sys/geom/geom.h @@ -95,14 +95,16 @@ struct g_class { LIST_ENTRY(g_class) class; LIST_HEAD(,g_geom) geom; struct g_event *event; + u_int protect; }; -#define G_CLASS_INITSTUFF { 0, 0 }, { 0 }, 0 +#define G_CLASS_INITSTUFF { 0, 0 }, { 0 }, 0, 0 /* * The g_geom is an instance of a g_class. */ struct g_geom { + u_int protect; char *name; struct g_class *class; LIST_ENTRY(g_geom) geom; @@ -139,6 +141,7 @@ struct g_bioq { */ struct g_consumer { + u_int protect; struct g_geom *geom; LIST_ENTRY(g_consumer) consumer; struct g_provider *provider; @@ -154,6 +157,7 @@ struct g_consumer { * A g_provider is a "logical disk". */ struct g_provider { + u_int protect; char *name; LIST_ENTRY(g_provider) provider; struct g_geom *geom; @@ -205,6 +209,7 @@ struct g_geom * g_insert_geom(char *class, struct g_consumer *cp); struct g_consumer * g_new_consumer(struct g_geom *gp); struct g_geom * g_new_geomf(struct g_class *mp, char *fmt, ...); struct g_provider * g_new_providerf(struct g_geom *gp, char *fmt, ...); +void g_sanity(void *ptr); void g_spoil(struct g_provider *pp, struct g_consumer *cp); int g_std_access(struct g_provider *pp, int dr, int dw, int de); void g_std_done(struct bio *bp); @@ -247,12 +252,16 @@ g_malloc(int size, int flags) mtx_lock(&Giant); p = malloc(size, M_GEOM, flags); mtx_unlock(&Giant); + g_sanity(p); + /* printf("malloc(%d, %x) -> %p\n", size, flags, p); */ return (p); } static __inline void g_free(void *ptr) { + g_sanity(ptr); + /* printf("free(%p)\n", ptr); */ mtx_lock(&Giant); free(ptr, M_GEOM); mtx_unlock(&Giant); @@ -260,8 +269,8 @@ g_free(void *ptr) extern struct sx topology_lock; #define g_topology_lock() do { mtx_assert(&Giant, MA_NOTOWNED); sx_xlock(&topology_lock); } while (0) -#define g_topology_unlock() sx_xunlock(&topology_lock) -#define g_topology_assert() sx_assert(&topology_lock, SX_XLOCKED) +#define g_topology_unlock() do { g_sanity(NULL); sx_xunlock(&topology_lock); } while (0) +#define g_topology_assert() do { g_sanity(NULL); sx_assert(&topology_lock, SX_XLOCKED); } while (0) #define DECLARE_GEOM_CLASS(class, name) \ static void \ @@ -273,6 +282,6 @@ extern struct sx topology_lock; } \ SYSINIT(name, SI_SUB_PSEUDO, SI_ORDER_FIRST, name##init, NULL); -#endif +#endif /* _KERNEL */ #endif /* _GEOM_GEOM_H_ */ |