return pret;
}
+
+HANDLER_WRAPPERS(memory_feature, char *, strndup, const char *, str, size_t, n)
+{
+ static void *(*strndupp)(const char *, size_t);
+ size_t size = 0;
+ DECLARE_VARIABLE_STANDARD;
+ char *pret;
+
+ strndupp = (void *)PROBE_GET_FUNC(probe_data);
+
+ PRE_PROBEBLOCK();
+
+ pret = (*strndupp)(str, n);
+
+ if (pret) {
+ size = strnlen(pret, n) + 1; /* +1 for terminate \0 */
+ add_memory_hash(pret, size, MEMTYPE_ALLOC,
+ PROBE_GET_CALL_TYPE(probe_data));
+ }
+
+ POST_PACK_PROBEBLOCK_BEGIN();
+
+ PREPARE_LOCAL_BUF();
+ PACK_COMMON_BEGIN(MSG_PROBE_MEMORY, API_ID_strndup, "pn", str, n);
+ PACK_COMMON_END('p', pret, newerrno, probe_data);
+ PACK_MEMORY((uint64_t)size, MEMORY_API_ALLOC, pret);
+ FLUSH_LOCAL_BUF();
+
+ POST_PACK_PROBEBLOCK_END();
+
+ return pret;
+}
+
+HANDLER_WRAPPERS(memory_feature, wchar_t *, wcsdup, const wchar_t *, str)
+{
+ static wchar_t *(*wcsdupp)(const wchar_t *);
+ size_t size = 0;
+ DECLARE_VARIABLE_STANDARD;
+ wchar_t *pret;
+
+ wcsdupp = (void *)PROBE_GET_FUNC(probe_data);
+
+ PRE_PROBEBLOCK();
+
+ pret = (*wcsdupp)(str);
+
+ if (pret) {
+ /* +1 for terminate \0 */
+ size = (wcslen(pret) + 1) * sizeof(*pret);
+ add_memory_hash(pret, size, MEMTYPE_ALLOC,
+ PROBE_GET_CALL_TYPE(probe_data));
+ }
+
+ POST_PACK_PROBEBLOCK_BEGIN();
+
+ PREPARE_LOCAL_BUF();
+ PACK_COMMON_BEGIN(MSG_PROBE_MEMORY, API_ID_wcsdup, "p", str);
+ PACK_COMMON_END('p', pret, newerrno, probe_data);
+ PACK_MEMORY((uint64_t)size, MEMORY_API_ALLOC, pret);
+ FLUSH_LOCAL_BUF();
+
+ POST_PACK_PROBEBLOCK_END();
+
+ return pret;
+}
+
+HANDLER_WRAPPERS_VAR(memory_feature, fmt, int, asprintf, char **, strp,
+ const char *, fmt, ...)
+{
+ size_t size = 0;
+ DECLARE_VARIABLE_STANDARD;
+ int pret;
+
+ PRE_PROBEBLOCK();
+
+ pret = vasprintf(strp, fmt, args);
+
+ if (pret != -1) {
+ size = strlen(*strp) + 1; /* +1 for terminate \0 */
+ add_memory_hash(*strp, size, MEMTYPE_ALLOC,
+ PROBE_GET_CALL_TYPE(probe_data));
+ }
+
+ POST_PACK_PROBEBLOCK_BEGIN();
+
+ PREPARE_LOCAL_BUF();
+ PACK_COMMON_BEGIN(MSG_PROBE_MEMORY, API_ID_asprintf, "pp", strp, fmt);
+ PACK_COMMON_END('d', pret, newerrno, probe_data);
+ PACK_MEMORY((uint64_t)size, MEMORY_API_ALLOC, pret);
+ FLUSH_LOCAL_BUF();
+
+ POST_PACK_PROBEBLOCK_END();
+
+ return pret;
+}
+
+HANDLER_WRAPPERS(memory_feature, int, vasprintf, char **, strp,
+ const char *, fmt, va_list, valist)
+{
+ static int(*vasprintfp)(char **, const char *, va_list);
+ size_t size = 0;
+ DECLARE_VARIABLE_STANDARD;
+ int pret;
+
+ vasprintfp = (void *)PROBE_GET_FUNC(probe_data);
+
+ PRE_PROBEBLOCK();
+ pret = (*vasprintfp)(strp, fmt, valist);
+
+ if (pret != -1) {
+ size = strlen(*strp) + 1; /* +1 for terminate \0 */
+ add_memory_hash(*strp, size, MEMTYPE_ALLOC,
+ PROBE_GET_CALL_TYPE(probe_data));
+ }
+
+ POST_PACK_PROBEBLOCK_BEGIN();
+
+ PREPARE_LOCAL_BUF();
+ PACK_COMMON_BEGIN(MSG_PROBE_MEMORY, API_ID_vasprintf, "pp", strp, fmt);
+ PACK_COMMON_END('d', pret, newerrno, probe_data);
+ PACK_MEMORY((uint64_t)size, MEMORY_API_ALLOC, pret);
+ FLUSH_LOCAL_BUF();
+
+ POST_PACK_PROBEBLOCK_END();
+
+ return pret;
+}
+
+HANDLER_WRAPPERS(memory_feature, void *, memalign, size_t, boundary,
+ size_t, size)
+{
+ static void *(*memalignp)(size_t, size_t);
+ DECLARE_VARIABLE_STANDARD;
+ void *pret;
+
+ memalignp = (void *)PROBE_GET_FUNC(probe_data);
+
+ PRE_PROBEBLOCK();
+
+ pret = (*memalignp)(boundary, size);
+
+ if (pret)
+ add_memory_hash(pret, size, MEMTYPE_ALLOC,
+ PROBE_GET_CALL_TYPE(probe_data));
+
+ POST_PACK_PROBEBLOCK_BEGIN();
+
+ PREPARE_LOCAL_BUF();
+ PACK_COMMON_BEGIN(MSG_PROBE_MEMORY, API_ID_memalign,
+ "xx", boundary, size);
+ PACK_COMMON_END('p', pret, newerrno, probe_data);
+ PACK_MEMORY(size, MEMORY_API_ALLOC, pret);
+ FLUSH_LOCAL_BUF();
+
+ POST_PACK_PROBEBLOCK_END();
+
+ return pret;
+}
+
+HANDLER_WRAPPERS(memory_feature, void *, valloc, size_t, size)
+{
+ static void *(*vallocp)(size_t);
+ DECLARE_VARIABLE_STANDARD;
+ void *pret;
+
+ vallocp = (void *)PROBE_GET_FUNC(probe_data);
+
+ PRE_PROBEBLOCK();
+
+ pret = (*vallocp)(size);
+
+ if (pret)
+ add_memory_hash(pret, size, MEMTYPE_ALLOC,
+ PROBE_GET_CALL_TYPE(probe_data));
+
+ POST_PACK_PROBEBLOCK_BEGIN();
+
+ PREPARE_LOCAL_BUF();
+ PACK_COMMON_BEGIN(MSG_PROBE_MEMORY, API_ID_valloc, "x", size);
+ PACK_COMMON_END('p', pret, newerrno, probe_data);
+ PACK_MEMORY(size, MEMORY_API_ALLOC, pret);
+ FLUSH_LOCAL_BUF();
+
+ POST_PACK_PROBEBLOCK_END();
+
+ return pret;
+}
X(PROBE_NAME(memcmp), memcmp, GT_TARGET_PROBE) \
X(PROBE_NAME(memcpy), memcpy, GT_TARGET_PROBE) \
X(PROBE_NAME(posix_memalign), posix_memalign, GT_ALWAYS_PROBE) \
- X(PROBE_NAME(strdup), strdup, GT_ALWAYS_PROBE)
+ X(PROBE_NAME(strdup), strdup, GT_ALWAYS_PROBE) \
+ X(PROBE_NAME(strndup), strndup, GT_ALWAYS_PROBE) \
+ X(PROBE_NAME(wcsdup), wcsdup, GT_ALWAYS_PROBE) \
+ X(PROBE_NAME(asprintf), asprintf, GT_ALWAYS_PROBE) \
+ X(PROBE_NAME(vasprintf), vasprintf, GT_ALWAYS_PROBE) \
+ X(PROBE_NAME(memalign), memalign, GT_ALWAYS_PROBE) \
+ X(PROBE_NAME(valloc), valloc, GT_ALWAYS_PROBE)
/* TODO generate PROBES_LIST with api_names.txt */
X(CONCAT(PROBE_NAME(memcpy), _always), memcpy, GT_ALWAYS_PROBE) \
X(CONCAT(PROBE_NAME(posix_memalign), _always), posix_memalign, \
GT_ALWAYS_PROBE) \
- X(CONCAT(PROBE_NAME(strdup), _always), strdup, GT_ALWAYS_PROBE)
+ X(CONCAT(PROBE_NAME(strdup), _always), strdup, GT_ALWAYS_PROBE) \
+ X(CONCAT(PROBE_NAME(strndup), _always), strndup, GT_ALWAYS_PROBE) \
+ X(CONCAT(PROBE_NAME(wcsdup), _always), wcsdup, GT_ALWAYS_PROBE) \
+ X(CONCAT(PROBE_NAME(asprintf), _always), asprintf, GT_ALWAYS_PROBE) \
+ X(CONCAT(PROBE_NAME(vasprintf), _always), vasprintf, GT_ALWAYS_PROBE) \
+ X(CONCAT(PROBE_NAME(memalign), _always), memalign, GT_ALWAYS_PROBE) \
+ X(CONCAT(PROBE_NAME(valloc), _always), valloc, GT_ALWAYS_PROBE)
/* TODO generate PROBES_LIST with api_names.txt */