Skip to content

Commit 03cd51d

Browse files
committed
Process: Rename StringsTable to StringsArena
Also this fixes a bug on the written StringView incorrectly containing extra null terminator
1 parent 476fbf8 commit 03cd51d

File tree

5 files changed

+39
-24
lines changed

5 files changed

+39
-24
lines changed

Libraries/Process/Internal/EnvironmentTable.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// Copyright (c) Stefano Cristiano
22
// SPDX-License-Identifier: MIT
33
#pragma once
4-
#include "StringsTable.h"
4+
#include "StringsArena.h"
55
namespace SC
66
{
77
template <int MAX_NUM_ENVIRONMENT>
@@ -14,7 +14,7 @@ struct SC::EnvironmentTable
1414
using environment_ptr = const native_char_t* const*;
1515
const native_char_t* childEnvs[MAX_NUM_ENVIRONMENT];
1616

17-
Result writeTo(environment_ptr& environmentArray, bool inheritEnvironment, const StringsTable& table,
17+
Result writeTo(environment_ptr& environmentArray, bool inheritEnvironment, const StringsArena& table,
1818
const ProcessEnvironment& parentEnv)
1919
{
2020
if (table.bufferString.view().isEmpty())

Libraries/Process/Internal/ProcessPosix.inl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ SC::Result SC::Process::launchImplementation()
211211

212212
const char* const* environmentArray = environ;
213213
ProcessEnvironment parentEnv;
214-
StringsTable table = {environment, environmentNumber, environmentByteOffset};
214+
StringsArena table = {environment, environmentNumber, environmentByteOffset};
215215

216216
EnvironmentTable<MAX_NUM_ENVIRONMENT> environmentTable;
217217
SC_TRY(environmentTable.writeTo(environmentArray, inheritEnv, table, parentEnv));
@@ -296,10 +296,10 @@ SC::Result SC::Process::launchImplementation()
296296

297297
SC::Result SC::Process::formatArguments(Span<const StringView> params)
298298
{
299-
StringsTable table = {command, commandArgumentsNumber, commandArgumentsByteOffset};
299+
StringsArena table = {command, commandArgumentsNumber, commandArgumentsByteOffset};
300300
for (size_t idx = 0; idx < params.sizeInElements(); ++idx)
301301
{
302-
SC_TRY(table.append(params[idx]));
302+
SC_TRY(table.appendAsSingleString(params[idx]));
303303
}
304304
return Result(true);
305305
}

Libraries/Process/Internal/ProcessWindows.inl

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -87,20 +87,25 @@ SC::Result SC::Process::launchImplementation()
8787
LPCWSTR wideDir = currentDirectory.view().isEmpty() ? nullptr : currentDirectory.view().getNullTerminatedNative();
8888
LPWSTR wideEnv = nullptr; // by default inherit parent environment
8989

90-
EnvironmentTable<MAX_NUM_ENVIRONMENT> environmenTable;
91-
ProcessEnvironment parentEnv;
90+
EnvironmentTable<MAX_NUM_ENVIRONMENT> environmentTable;
9291

9392
const wchar_t* const* environmentArray = nullptr;
94-
StringsTable table = {environment, environmentNumber, environmentByteOffset};
95-
SC_TRY(environmenTable.writeTo(environmentArray, inheritEnv, table, parentEnv));
93+
94+
StringsArena arena = {environment, environmentNumber, environmentByteOffset};
95+
96+
ProcessEnvironment parentEnv;
97+
SC_TRY(environmentTable.writeTo(environmentArray, inheritEnv, arena, parentEnv));
9698

9799
if (environmentArray != nullptr)
98100
{
99101
for (size_t idx = environmentNumber; environmentArray[idx] != nullptr; ++idx)
100102
{
101-
SC_TRY(table.append(StringView({environmentArray[idx], ::wcslen(environmentArray[idx])}, true)));
103+
const StringView environmentString({environmentArray[idx], ::wcslen(environmentArray[idx])}, true);
104+
SC_TRY(arena.appendAsSingleString(environmentString));
102105
}
103-
SC_TRY(table.append({"\0"})); // add final \0
106+
SC_TRY(arena.appendAsSingleString({"\0"})); // add final \0 (CreateProcessW requires it to signal end of array)
107+
108+
// const_cast is required by CreateProcessW signature unfortunately
104109
wideEnv = const_cast<LPWSTR>(environment.view().getNullTerminatedNative());
105110
}
106111
PROCESS_INFORMATION processInfo;

Libraries/Process/Internal/StringsTable.h renamed to Libraries/Process/Internal/StringsArena.h

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,27 @@
44

55
namespace SC
66
{
7-
struct StringsTable;
7+
struct StringsArena;
88
}
99

10-
/// @brief Appends a number of null-terminated StringView in a String keeping track of their starts
11-
/// Making this internal for now
12-
struct SC::StringsTable
10+
/// @brief Appends a variable number of null-terminated StringView in asingle String by keeping track of their starts
11+
struct SC::StringsArena
1312
{
14-
String& bufferString;
15-
size_t& numberOfStrings; // Counts number of arguments (including executable name)
16-
Span<size_t> stringsStart; // Tracking start of each string in the table
13+
String& bufferString; // The underlying buffer / arena where strings are written to
14+
size_t& numberOfStrings; // Counts number of arguments
15+
Span<size_t> stringsStart; // Tracking start of each string in the table, its size is used as max number of elements
1716

18-
[[nodiscard]] Result append(Span<const StringView> strings)
17+
[[nodiscard]] Result appendMultipleStrings(Span<const StringView> strings)
18+
{
19+
for (const StringView string : strings)
20+
{
21+
SC_TRY(appendAsSingleString(string));
22+
}
23+
return Result(true);
24+
}
25+
26+
// Appends a single string by joining multiple StringView together
27+
[[nodiscard]] Result appendAsSingleString(Span<const StringView> strings)
1928
{
2029
if (numberOfStrings >= stringsStart.sizeInElements())
2130
{
@@ -25,7 +34,7 @@ struct SC::StringsTable
2534
stringsStart[numberOfStrings] = bufferString.sizeInBytesIncludingTerminator();
2635
for (size_t idx = 0; idx < strings.sizeInElements(); ++idx)
2736
{
28-
SC_TRY(converter.appendNullTerminated(strings[idx], idx > 0)); // 0 == false
37+
SC_TRY(converter.appendNullTerminated(strings[idx], idx > 0)); // idx > 0 == popExistingNullTerminator
2938
}
3039
numberOfStrings++;
3140
return Result(true);
@@ -38,12 +47,13 @@ struct SC::StringsTable
3847
{
3948
return Result::Error("StringTable::writeTo insufficient destination span");
4049
}
50+
const auto sizeOfZero = StringEncodingGetSize(bufferString.getEncoding());
4151
for (size_t idx = 0; idx < numberOfStrings; ++idx)
4252
{
4353
const size_t lengthInBytes =
4454
idx + 1 < numberOfStrings ? stringsStart[idx + 1] : bufferString.sizeInBytesIncludingTerminator();
45-
strings[idx] = StringView({tableStart + stringsStart[idx], lengthInBytes - stringsStart[idx]}, true,
46-
bufferString.getEncoding());
55+
strings[idx] = StringView({tableStart + stringsStart[idx], lengthInBytes - stringsStart[idx] - sizeOfZero},
56+
true, bufferString.getEncoding());
4757
}
4858
return Result(true);
4959
}

Libraries/Process/Process.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,6 @@ SC::Result SC::Process::setWorkingDirectory(StringView processWorkingDirectory)
231231

232232
SC::Result SC::Process::setEnvironment(StringView name, StringView value)
233233
{
234-
StringsTable table = {environment, environmentNumber, environmentByteOffset};
235-
return table.append({name, SC_NATIVE_STR("="), value});
234+
StringsArena table = {environment, environmentNumber, environmentByteOffset};
235+
return table.appendAsSingleString({name, SC_NATIVE_STR("="), value});
236236
}

0 commit comments

Comments
 (0)