return res;
}
+char *
+egg_secure_strndup_full (const char *tag,
+ const char *str,
+ size_t length,
+ int options)
+{
+ size_t len;
+ char *res;
+ const char *end;
+
+ if (!str)
+ return NULL;
+
+ end = memchr (str, '\0', length);
+ if (end != NULL)
+ length = (end - str);
+ len = length + 1;
+ res = (char *)egg_secure_alloc_full (tag, len, options);
+ memcpy (res, str, len);
+ return res;
+}
+
void
egg_secure_clear (void *p, size_t length)
{
} \
static inline void* egg_secure_strdup (const char *str) { \
return egg_secure_strdup_full (G_STRINGIFY (tag), str, EGG_SECURE_USE_FALLBACK); \
+ } \
+ static inline void* egg_secure_strndup (const char *str, size_t length) { \
+ return egg_secure_strndup_full (G_STRINGIFY (tag), str, length, EGG_SECURE_USE_FALLBACK); \
}
void* egg_secure_alloc_full (const char *tag, size_t length, int options);
char* egg_secure_strdup_full (const char *tag, const char *str, int options);
+char* egg_secure_strndup_full (const char *tag, const char *str, size_t length, int options);
+
void egg_secure_strclear (char *str);
void egg_secure_strfree (char *str);
result = val->secret;
} else {
- result = egg_secure_strdup (val->secret);
+ result = egg_secure_strndup (val->secret, val->length);
if (val->destroy)
(val->destroy) (val->secret);
}
g_slice_free (SecretValue, val);
} else {
- result = egg_secure_strdup (val->secret);
+ result = egg_secure_strndup (val->secret, val->length);
}
return result;
result = val->secret;
} else {
- result = g_strdup (val->secret);
+ result = g_strndup (val->secret, val->length);
if (val->destroy)
(val->destroy) (val->secret);
}
g_slice_free (SecretValue, val);
} else {
- result = g_strdup (val->secret);
+ result = g_strndup (val->secret, val->length);
}
return result;