return result; /* 0 is OK, !0 is !OK, just like memcmp */
}
+
+void fr_memset_secure(void *ptr, size_t len)
+{
+ if (!len) return;
+
+#if defined(HAVE_MEMSET_S)
+ (void) memset_s(ptr, len, 0, len);
+
+#elif defined(HAVE_EXPLICIT_BZERO)
+ explicit_bzero(ptr, len);
+
+#else
+ volatile unsigned char *volatile p = (volatile unsigned char *volatile) ptr;
+ size_t i = len;
+
+ while (i--) {
+ *(p++) = 0;
+ }
+#endif
+}
void fr_quick_sort(void const *to_sort[], int min_idx, int max_idx, fr_cmp_t cmp);
int fr_digest_cmp(uint8_t const *a, uint8_t const *b, size_t length) CC_HINT(nonnull);
+void fr_memset_secure(void *ptr, size_t len);
+
#ifdef __cplusplus
}
#endif
fr_pair_list_free(&vp->vp_group);
break;
+ case FR_TYPE_STRING:
+ case FR_TYPE_OCTETS:
+ if (vp->data.secret) fr_memset_secure(vp->vp_ptr, vp->vp_length);
+ break;
+
default:
+ if (vp->data.secret) fr_memset_secure(&vp->data, sizeof(vp->data));
break;
}
switch (data->type) {
case FR_TYPE_OCTETS:
case FR_TYPE_STRING:
+ if (data->secret) fr_memset_secure(data->datum.ptr, data->vb_length);
talloc_free(data->datum.ptr);
break;