aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Willi <martin@revosec.ch>2011-05-24 10:00:57 +0200
committerMartin Willi <martin@revosec.ch>2011-05-24 11:49:20 +0200
commitd45b242b6041d21e1cae3add18b7c69f5e45b940 (patch)
tree5e0d12f6c7e4bd36efea591babd4d0dbafb0e03f
parent8c1bfe6545f477f89a70b4dfbfedd4ab2e36d30b (diff)
downloadstrongswan-d45b242b6041d21e1cae3add18b7c69f5e45b940.tar.bz2
strongswan-d45b242b6041d21e1cae3add18b7c69f5e45b940.tar.xz
Fix memwipe() of leading unaligned bytes
-rw-r--r--src/libstrongswan/utils.h13
1 files changed, 8 insertions, 5 deletions
diff --git a/src/libstrongswan/utils.h b/src/libstrongswan/utils.h
index a334954ae..bef6f6638 100644
--- a/src/libstrongswan/utils.h
+++ b/src/libstrongswan/utils.h
@@ -347,17 +347,20 @@ void memwipe_noinline(void *ptr, size_t n);
static inline void memwipe_inline(void *ptr, size_t n)
{
volatile char *c = (volatile char*)ptr;
- int m, i;
+ size_t m, i;
/* byte wise until long aligned */
- for (i = 0; (uintptr_t)&c % sizeof(long) && i < n; i++)
+ for (i = 0; (uintptr_t)&c[i] % sizeof(long) && i < n; i++)
{
c[i] = 0;
}
- /* word wize */
- for (m = n - sizeof(long); i <= m; i += sizeof(long))
+ /* word wise */
+ if (n >= sizeof(long))
{
- *(volatile long*)&c[i] = 0;
+ for (m = n - sizeof(long); i <= m; i += sizeof(long))
+ {
+ *(volatile long*)&c[i] = 0;
+ }
}
/* byte wise of the rest */
for (; i < n; i++)