Является ли функция члена D std.process.environment.toAA глючной? - PullRequest
0 голосов
/ 24 января 2019

С /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;
}

Приведенный выше код кажется мне beign не потокобезопасным из-за использования __gshared и того факта, что переменная environ extern является изменяемой. Это ошибка в D? Или что я могу неправильно понять?

1 Ответ

0 голосов
/ 25 января 2019

Это единственный способ сделать это в Posix.Переменная помечена как const, поэтому вы не можете ее изменить, но вы можете объявить другую переменную extern (C), которая может изменить ту же память.Так что не делайте этого.

D многое делает для обеспечения безопасности, но единственный способ сделать это действительно безопасным - это исключить extern (C).Или избавиться от Posix и перестроить ОС с нуля в D. Это обе радикальные меры, несоразмерные размеру проблемы.

...