From aa64597e8ba0e4a2da32a0a351c43aa27eb8e165 Mon Sep 17 00:00:00 2001 From: Leonid Yuriev Date: Sat, 13 Oct 2018 12:47:12 +0300 Subject: [PATCH] mdbx: avoid on-stack allocation/chkstk inside mdbx_env_walk(). 5 of 17 for https://github.com/leo-yuriev/libmdbx/issues/43 Change-Id: Iadb833ff38dbd0922eda69238b365f5906b9109f --- src/mdbx.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/mdbx.c b/src/mdbx.c index 243aae22..d1ad912c 100644 --- a/src/mdbx.c +++ b/src/mdbx.c @@ -12793,9 +12793,20 @@ static int __cold mdbx_env_walk(mdbx_walk_ctx_t *ctx, const char *dbi, MDBX_db db; memcpy(&db, NODEDATA(node), sizeof(db)); - char *name = memcpy(alloca(namelen + 1), NODEKEY(node), namelen); - name[namelen] = 0; - rc = mdbx_env_walk(ctx, name, db.md_root, deep + 1); + + char namebuf_onstask[142]; + char *const name = (namelen < sizeof(namebuf_onstask)) + ? namebuf_onstask + : mdbx_malloc(namelen + 1); + if (name) { + memcpy(name, NODEKEY(node), namelen); + name[namelen] = 0; + rc = mdbx_env_walk(ctx, name, db.md_root, deep + 1); + if (name != namebuf_onstask) + mdbx_free(name); + } else { + rc = MDBX_ENOMEM; + } } break; case F_SUBDATA | F_DUPDATA /* dupsorted sub-tree */: {