explicit_bzero.c 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. /*-------------------------------------------------------------------------
  2. *
  3. * explicit_bzero.c
  4. *
  5. * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
  6. * Portions Copyright (c) 1994, Regents of the University of California
  7. *
  8. *
  9. * IDENTIFICATION
  10. * src/port/explicit_bzero.c
  11. *
  12. *-------------------------------------------------------------------------
  13. */
  14. #include <stddef.h>
  15. #if defined(HAVE_MEMSET_S)
  16. void
  17. explicit_bzero(void *buf, size_t len)
  18. {
  19. (void) memset_s(buf, len, 0, len);
  20. }
  21. #elif defined(WIN32)
  22. #include <Windows.h>
  23. void
  24. explicit_bzero(void *buf, size_t len)
  25. {
  26. (void) SecureZeroMemory(buf, len);
  27. }
  28. #else
  29. /*
  30. * Indirect call through a volatile pointer to hopefully avoid dead-store
  31. * optimisation eliminating the call. (Idea taken from OpenSSH.) We can't
  32. * assume bzero() is present either, so for simplicity we define our own.
  33. */
  34. static void
  35. bzero2(void *buf, size_t len)
  36. {
  37. memset(buf, 0, len);
  38. }
  39. static void (*volatile bzero_p) (void *, size_t) = bzero2;
  40. void
  41. explicit_bzero(void *buf, size_t len)
  42. {
  43. bzero_p(buf, len);
  44. }
  45. #endif