D 成员函数 std.process.environment.toAA 有问题吗?
Is D member function std.process.environment.toAA buggy?
来自/snap/dlang/43/usr/include/dlang/dmd/std/process.d
:
string[string] toAA() @trusted
{
import std.conv : to;
string[string] aa;
version (Posix)
{
auto environ = getEnvironPtr;
for (int i=0; environ[i] != null; ++i)
{
import std.string : indexOf;
immutable varDef = to!string(environ[i]);
immutable eq = indexOf(varDef, '=');
assert(eq >= 0);
immutable name = varDef[0 .. eq];
immutable value = varDef[eq+1 .. $];
// In POSIX, environment variables may be defined more
// than once. This is a security issue, which we avoid
// by checking whether the key already exists in the array.
// For more info:
// http://www.dwheeler.com/secure-programs/Secure-Programs-HOWTO/environment-variables.html
if (name !in aa) aa[name] = value;
}
}
// ...
}
但是getEnvironPtr()
定义如下:
extern(C) extern __gshared const char** environ;
const(char**) getEnvironPtr() @trusted
{
return environ;
}
上面的代码对我来说似乎不是线程安全的,因为使用 __gshared
并且 environ
外部变量是可修改的。这是 D 中的错误吗?或者我可能误解了什么?
这是 Posix 中唯一的方法。该变量被标记为 const,因此您不能修改它,但您可以声明另一个可以修改同一内存的 extern(C) 变量。所以不要那样做。
D 在确保安全方面做了很多工作,但真正确保安全的唯一方法是消除 extern(C)。或者摆脱 Posix 并在 D 中从头开始重建 OS。这些都是与问题的规模不成比例的极端措施。
来自/snap/dlang/43/usr/include/dlang/dmd/std/process.d
:
string[string] toAA() @trusted
{
import std.conv : to;
string[string] aa;
version (Posix)
{
auto environ = getEnvironPtr;
for (int i=0; environ[i] != null; ++i)
{
import std.string : indexOf;
immutable varDef = to!string(environ[i]);
immutable eq = indexOf(varDef, '=');
assert(eq >= 0);
immutable name = varDef[0 .. eq];
immutable value = varDef[eq+1 .. $];
// In POSIX, environment variables may be defined more
// than once. This is a security issue, which we avoid
// by checking whether the key already exists in the array.
// For more info:
// http://www.dwheeler.com/secure-programs/Secure-Programs-HOWTO/environment-variables.html
if (name !in aa) aa[name] = value;
}
}
// ...
}
但是getEnvironPtr()
定义如下:
extern(C) extern __gshared const char** environ;
const(char**) getEnvironPtr() @trusted
{
return environ;
}
上面的代码对我来说似乎不是线程安全的,因为使用 __gshared
并且 environ
外部变量是可修改的。这是 D 中的错误吗?或者我可能误解了什么?
这是 Posix 中唯一的方法。该变量被标记为 const,因此您不能修改它,但您可以声明另一个可以修改同一内存的 extern(C) 变量。所以不要那样做。
D 在确保安全方面做了很多工作,但真正确保安全的唯一方法是消除 extern(C)。或者摆脱 Posix 并在 D 中从头开始重建 OS。这些都是与问题的规模不成比例的极端措施。