From d8ea32176611219e8ee3a9281ab8c2f1d718de77 Mon Sep 17 00:00:00 2001 From: Greg Hudson Date: Tue, 24 Nov 2009 01:25:10 +0000 Subject: [PATCH] Punt the volatile cast in the non-gcc, non-Windows version of zap. Use a function call into libkrb5support instead, since that's hard to inline. git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@23339 dc483132-0cff-0310-8789-dd5450dbe970 --- src/include/k5-int.h | 5 ++- src/include/k5-platform.h | 2 + src/util/support/Makefile.in | 5 ++- src/util/support/deps | 3 ++ src/util/support/libkrb5support-fixed.exports | 1 + src/util/support/zap.c | 38 +++++++++++++++++++ 6 files changed, 51 insertions(+), 3 deletions(-) create mode 100644 src/util/support/zap.c diff --git a/src/include/k5-int.h b/src/include/k5-int.h index 2edf1d511..3d5268836 100644 --- a/src/include/k5-int.h +++ b/src/include/k5-int.h @@ -790,8 +790,9 @@ static inline void zap(void *ptr, size_t len) asm volatile ("" : : "g" (ptr), "g" (len)); } #else -# define zap(ptr, len) memset((void *)(volatile void *)ptr, 0, len) -#endif /* WIN32 */ +/* Use a function from libkrb5support to defeat inlining. */ +# define zap(ptr, len) krb5int_zap(ptr, len) +#endif /* Convenience function: zap and free ptr if it is non-NULL. */ static inline void diff --git a/src/include/k5-platform.h b/src/include/k5-platform.h index 7c1c57d70..ee3730ad0 100644 --- a/src/include/k5-platform.h +++ b/src/include/k5-platform.h @@ -976,6 +976,8 @@ extern int krb5int_mkstemp(char *); #define mkstemp krb5int_mkstemp #endif +extern void krb5int_zap(void *ptr, size_t len); + /* Fudge for future adoption of gettext or the like. */ #ifndef _ #define _(X) (X) diff --git a/src/util/support/Makefile.in b/src/util/support/Makefile.in index ef0b71d5a..6c2be57bb 100644 --- a/src/util/support/Makefile.in +++ b/src/util/support/Makefile.in @@ -62,6 +62,7 @@ STLIBOBJS= \ fake-addrinfo.o \ utf8.o \ utf8_conv.o \ + zap.o \ $(IPC_ST_OBJ) \ $(STRLCPY_ST_OBJ) \ $(PRINTF_ST_OBJ) \ @@ -77,6 +78,7 @@ LIBOBJS= \ $(OUTPRE)fake-addrinfo.$(OBJEXT) \ $(OUTPRE)utf8.$(OBJEXT) \ $(OUTPRE)utf8_conv.$(OBJEXT) \ + $(OUTPRE)zap.$(OBJEXT) \ $(IPC_OBJ) \ $(STRLCPY_OBJ) \ $(PRINTF_OBJ) \ @@ -101,7 +103,8 @@ SRCS=\ $(srcdir)/printf.c \ $(srcdir)/mkstemp.c \ $(srcdir)/t_k5buf.c \ - $(srcdir)/t_unal.c + $(srcdir)/t_unal.c \ + $(srcdir)/zap.c SHLIB_EXPDEPS = # Add -lm if dumping thread stats, for sqrt. diff --git a/src/util/support/deps b/src/util/support/deps index 140c3fb61..0f2991a0f 100644 --- a/src/util/support/deps +++ b/src/util/support/deps @@ -47,3 +47,6 @@ t_k5buf.so t_k5buf.po $(OUTPRE)t_k5buf.$(OBJEXT): $(BUILDTOP)/include/autoconf.h t_unal.so t_unal.po $(OUTPRE)t_unal.$(OBJEXT): $(BUILDTOP)/include/autoconf.h \ $(top_srcdir)/include/k5-platform.h $(top_srcdir)/include/k5-thread.h \ t_unal.c +zap.so zap.po $(OUTPRE)zap.$(OBJEXT): $(BUILDTOP)/include/autoconf.h \ + $(top_srcdir)/include/k5-platform.h $(top_srcdir)/include/k5-thread.h \ + zap.c diff --git a/src/util/support/libkrb5support-fixed.exports b/src/util/support/libkrb5support-fixed.exports index 3560ce63a..40023e709 100644 --- a/src/util/support/libkrb5support-fixed.exports +++ b/src/util/support/libkrb5support-fixed.exports @@ -48,3 +48,4 @@ krb5int_utf8_to_ucs4 krb5int_utf8_lentab krb5int_utf8_mintab krb5int_utf8_next +krb5int_zap diff --git a/src/util/support/zap.c b/src/util/support/zap.c new file mode 100644 index 000000000..896168749 --- /dev/null +++ b/src/util/support/zap.c @@ -0,0 +1,38 @@ +/* -*- mode: c; indent-tabs-mode: nil -*- */ + +/* + * zap.c + * + * Copyright 2008 Massachusetts Institute of Technology. + * All Rights Reserved. + * + * Export of this software from the United States of America may + * require a specific license from the United States Government. + * It is the responsibility of any person or organization contemplating + * export to obtain such a license before exporting. + * + * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and + * distribute this software and its documentation for any purpose and + * without fee is hereby granted, provided that the above copyright + * notice appear in all copies and that both that copyright notice and + * this permission notice appear in supporting documentation, and that + * the name of M.I.T. not be used in advertising or publicity pertaining + * to distribution of the software without specific, written prior + * permission. Furthermore if you modify this software you must label + * your software as modified software and not distribute it in such a + * fashion that it might be confused with the original M.I.T. software. + * M.I.T. makes no representations about the suitability of + * this software for any purpose. It is provided "as is" without express + * or implied warranty. + * + * krb5int_zap() is used by zap() (a static inline function defined in + * k5-int.h) on non-Windows, non-gcc compilers, in order to prevent the + * compiler from inlining and optimizing out the memset() call. + */ + +#include + +void krb5int_zap(void *ptr, size_t len) +{ + memset(ptr, 0, len); +} -- 2.26.2