emscripten-core / emscripten-core/emscripten

Allocate arguments (argv) on stack in a single contiguous chunk

Open
#13,106 4 comments 0 reactions 0 assignees View on GitHub
Dominant language
C++
Stars
27.6k
Forks
3.6k
Avg merge
1d 1h
Merged PRs (30d)
105

Description

It seems that some programs, e.g. OpenBSD's [diff](https://github.com/openbsd/src/blob/master/usr.bin/diff/diff.c#L276) assume that subsequent arguments have larger memory addresses. But stack is supposed to grow downward, right?

I am proposing to compute the total argv UTF8 size, and then encode it as one chunk + insert null-bytes at correct locations. How does one do that?

Indeed, replacing:
```js
Module.HEAP32[argv >> 2] = Module.allocateUTF8OnStack(Module.thisProgram);
for (let i = 1; i < argc; i++)
Module.HEAP32[(argv >> 2) + i] = Module.allocateUTF8OnStack(args[i - 1]);
Module.HEAP32[(argv >> 2) + argc] = 0;
```
by
```js
args = [Module.thisProgram].concat(args);
const lens = args.map(a => Module.lengthBytesUTF8(a));
Module.HEAP32[argv >> 2] = Module.allocateUTF8OnStack(args.join('\0'));
for(let i = 1; i < argc; i++)
Module.HEAP32[(argv >> 2) + i] = Module.HEAP32[(argv >> 2) + i - 1] + lens[i - 1] + 1;
Module.HEAP32[(argv >> 2) + argc] = 0;
```
solves the problem

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.