int easprintf(char **, const char *, ...) __printflike(2, 3);
int evasprintf(char **, const char *, va_list) __printflike(2, 0);
void efree(void *);
-void *ecalloc(size_t, size_t);
-void *emalloc(size_t);
-void *emalloc2(size_t, size_t);
+void *ecalloc(size_t, size_t) __malloc_like;
+void *emalloc(size_t) __malloc_like;
+void *emalloc2(size_t, size_t) __malloc_like;
void *erealloc(void *, size_t);
void *erealloc3(void *, size_t, size_t);
void *erecalloc(void *, size_t, size_t, size_t);
-char *estrdup(const char *);
-char *estrndup(const char *, size_t);
+char *estrdup(const char *) __malloc_like;
+char *estrndup(const char *, size_t) __malloc_like;
#endif /* _SUDO_ALLOC_H */
# endif
#endif
+/* Hint to compiler that returned pointer is unique (malloc but not realloc). */
+#ifndef __malloc_like
+# if __GNUC_PREREQ__(2, 96)
+# define __malloc_like __attribute__((__malloc__))
+# else
+# define __malloc_like
+# endif
+#endif
+
#ifndef __dso_public
# ifdef HAVE_DSO_VISIBILITY
# if defined(__GNUC__)