libgit2 / libgit2sharp

Git + .NET = ❤
http://libgit2.github.com
MIT License
3.18k stars 887 forks source link

invalid config path selector 1874839136 #1951

Closed frindler closed 2 years ago

frindler commented 2 years ago

When trying to run the libgit2sharp tests (freshly cloned repo) on my Apple Silicon Mac (arm64), using the arm64 version of the .NET 6 SDK, all tests fail with an exception. If I use the x64 SDK, it runs just fine.

Reproduction steps

Just clone the repo, add binaries NuGet package, try to run tests.

Expected behavior

Tests should pass.

Actual behavior

LibGit2Sharp.LibGit2SharpException invalid config path selector 1874839136 at LibGit2Sharp.Core.Ensure.HandleError(Int32 result) in /Playground/libgit2sharp/LibGit2Sharp/Core/Ensure.cs:line 154 at LibGit2Sharp.Core.Ensure.ZeroResult(Int32 result) in /Playground/libgit2sharp/LibGit2Sharp/Core/Ensure.cs:line 172 at LibGit2Sharp.Core.Proxy.git_libgit2_opts_set_search_path(ConfigurationLevel level, String path) in /Playground/libgit2sharp/LibGit2Sharp/Core/Proxy.cs:line 3436 at LibGit2Sharp.GlobalSettings.SetConfigSearchPaths(ConfigurationLevel level, String[] paths) in /Playground/libgit2sharp/LibGit2Sharp/GlobalSettings.cs:line 337 at LibGit2Sharp.Tests.TestHelpers.BaseFixture.BuildFakeConfigs(IPostTestDirectoryRemover dirRemover) in /Playground/libgit2sharp/LibGit2Sharp.Tests/TestHelpers/BaseFixture.cs:line 125 at LibGit2Sharp.Tests.TestHelpers.BaseFixture..ctor() in /Playground/libgit2sharp/LibGit2Sharp.Tests/TestHelpers/BaseFixture.cs:line 20 at LibGit2Sharp.Tests.ArchiveTarFixture..ctor() at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean wrapExceptions)

This is here:

public static void git_libgit2_opts_set_search_path(ConfigurationLevel level, string path)
        {
            var res = NativeMethods.git_libgit2_opts((int)LibGit2Option.SetSearchPath, (uint)level, path);
            Ensure.ZeroResult(res);
        }

level is 4, but seems to get marshalled wrong to libgit2 (where it seems to arrive as 1874839136).

Version of LibGit2Sharp (release number or SHA1)

1e6da83ab8c47058b5b4ef1e4e28e4732de44db0

Operating system(s) tested; .NET runtime tested

MacOS Monterey 12.3, Apple Silicon, .NET 6 Arm64 SDK

frindler commented 2 years ago

In libgit2 this seems to arrive at the following function in libgit2.c:

int git_libgit2_opts(int key, ...)
{
    int error = 0;
    va_list ap;

    va_start(ap, key);

    switch (key) {

{{omitted irrelevant cases}}

    case GIT_OPT_GET_SEARCH_PATH:
        {
            int sysdir = va_arg(ap, int);
            git_buf *out = va_arg(ap, git_buf *);
            git_str str = GIT_STR_INIT;
            const git_str *tmp;
            int level;

            if ((error = git_buf_tostr(&str, out)) < 0 ||
                (error = config_level_to_sysdir(&level, sysdir)) < 0 ||
                (error = git_sysdir_get(&tmp, level)) < 0 ||
                (error = git_str_put(&str, tmp->ptr, tmp->size)) < 0)
                break;

            error = git_buf_fromstr(out, &str);
        }
        break;

    case GIT_OPT_SET_SEARCH_PATH:
        {
            int level;

            if ((error = config_level_to_sysdir(&level, va_arg(ap, int))) >= 0)
                error = git_sysdir_set(level, va_arg(ap, const char *));
        }
        break;

{{etc.}}

then it goes to

static int config_level_to_sysdir(int *out, int config_level)
{
    switch (config_level) {
    case GIT_CONFIG_LEVEL_SYSTEM:
        *out = GIT_SYSDIR_SYSTEM;
        return 0;
    case GIT_CONFIG_LEVEL_XDG:
        *out = GIT_SYSDIR_XDG;
        return 0;
    case GIT_CONFIG_LEVEL_GLOBAL:
        *out = GIT_SYSDIR_GLOBAL;
        return 0;
    case GIT_CONFIG_LEVEL_PROGRAMDATA:
        *out = GIT_SYSDIR_PROGRAMDATA;
        return 0;
    default:
        break;
    }

    git_error_set(
        GIT_ERROR_INVALID, "invalid config path selector %d", config_level);
    return -1;
}

and this seems to produce this error.