{"thread":{"id":"55243","subject":"bug: conflicting core.bare setting causes segfault during bare clone","startedAt":"2021-03-03T06:42:22Z","lastAt":"2021-03-10T23:34:15Z","messageCount":10,"participants":["Vusich, Joseph","brian m. carlson","Junio C Hamano","Eric Sunshine"],"isPatch":false,"patchVersion":null,"patchTotal":null},"messages":[{"id":"418122","messageId":"D99DD9AD-54E5-4357-BA50-8B9CAE23084E@amazon.com","threadId":"55243","inReplyTo":null,"subject":"bug: conflicting core.bare setting causes segfault during bare clone","fromName":"Vusich, Joseph","fromEmail":"jvusich@amazon.com","sentAt":"2021-03-03T00:06:01Z","receivedAt":"2021-03-03T06:42:22Z","isPatch":false,"sender":{"key":"jvusich@amazon.com","avatar":null},"body":"Thank you for filling out a Git bug report!\nPlease answer the following questions to help us understand your issue.\n\nWhat did you do before the bug happened? (Steps to reproduce your issue)\n\n$ env | grep GIT\n\n$ git config --list\nuser.email=jvusich@amazon.com\nuser.name=Joseph Vusich\ncore.bare=false\n\n$ git clone --bare https://github.com/josephvusich/fixture\nCloning into bare repository 'fixture.git'...\nzsh: segmentation fault  /opt/local/bin/git clone --bare https://github.com/josephvusich/fixture\n\nWhat did you expect to happen? (Expected behavior)\n\n\"git clone --bare\" should clone a bare repository, regardless of the core.bare setting in the global config\n\nWhat happened instead? (Actual behavior)\n\n\"git clone --bare\" causes a segfault if the global gitconfig has core.bare=false\n\nAnything else you want to add:\n\n* Non-bare clones still work when core.bare=false\n* Bare clones only work when core.bare=true, or if core.bare is absent from gitconfig\n* Started failing with Git 2.30.0, also fails on 2.30.1, but succeeds on 2.29.2\n* Issue reproduced on multiple machines, running Ubuntu, Mac OS, and Alpine Linux\n* Running with all TRACEs enabled shows only one additional line prior to \"Cloning\"\n    15:38:08.567292 git.c:444  trace: built-in: git clone --bare https://github.com/josephvusich/fixture\n* The fixture.git directory is created prior to the segfault, the fixture.git/config file content is below:\n  [core]\n    repositoryformatversion = 0\n    filemode = true\n    bare = false\n    logallrefupdates = true\n\nPlease review the rest of the bug report below.\nYou can delete any lines you don't wish to share.\n\n\n[System Info]\ngit version:\ngit version 2.30.1\ncpu: x86_64\nno commit associated with this build\nsizeof-long: 8\nsizeof-size_t: 8\nshell-path: /bin/sh\nuname: Darwin 19.6.0 Darwin Kernel Version 19.6.0: Tue Jan 12 22:13:05 PST 2021; root:xnu-6153.141.16~1/RELEASE_X86_64 x86_64\ncompiler info: clang: 12.0.0 (clang-1200.0.32.2)\nlibc info: no libc information available\n$SHELL (typically, interactive shell): /bin/zsh\n\n\n[Enabled Hooks]\nnot run from a git repository - no hooks to show\n\n"},{"id":"418179","messageId":"YEAi4OkkNnp+IMJD@camp.crustytoothpaste.net","threadId":"55243","inReplyTo":"D99DD9AD-54E5-4357-BA50-8B9CAE23084E@amazon.com","subject":"Re: bug: conflicting core.bare setting causes segfault during bare clone","fromName":"brian m. carlson","fromEmail":"sandals@crustytoothpaste.net","sentAt":"2021-03-03T23:59:28Z","receivedAt":"2021-03-04T00:26:49Z","isPatch":false,"sender":{"key":"sandals@crustytoothpaste.net","avatar":"https://avatars.githubusercontent.com/u/497054?v=4"},"body":"On 2021-03-03 at 00:06:01, Vusich, Joseph wrote:\n> Thank you for filling out a Git bug report!\n> Please answer the following questions to help us understand your issue.\n> \n> What did you do before the bug happened? (Steps to reproduce your issue)\n> \n> $ env | grep GIT\n> \n> $ git config --list\n> user.email=jvusich@amazon.com\n> user.name=Joseph Vusich\n> core.bare=false\n> \n> $ git clone --bare https://github.com/josephvusich/fixture\n> Cloning into bare repository 'fixture.git'...\n> zsh: segmentation fault  /opt/local/bin/git clone --bare https://github.com/josephvusich/fixture\n> \n> What did you expect to happen? (Expected behavior)\n> \n> \"git clone --bare\" should clone a bare repository, regardless of the core.bare setting in the global config\n> \n> What happened instead? (Actual behavior)\n> \n> \"git clone --bare\" causes a segfault if the global gitconfig has core.bare=false\n\nI appreciate the report, and I can reproduce with 45526154a5 from next.\nWe should definitely not segfault in this case.  I completely agree that\nsegfaulting is the wrong behavior (because it's always the wrong\nbehavior for a command-line tool).\n\nI do, however, think we should either ignore core.bare in the global\nconfiguration, if we don't already, or produce an error.  The\ndocumentation says, \"If true this repository is assumed to be bare\" and\nmuch like we ignore certain other settings outside of .git/config, we\nshould ignore this one.\n\nI also agree that \"git clone --bare\" should clone a bare repository\nsince we'd ignore the global setting.\n\nI'm probably not going to get a chance to look at this before the\nweekend, so anyone is free to come up with a patch in the meantime, but\nif nobody has gotten to it then, I'll try to send out a patch.\n\nI will admit being a bit interested in how this was discovered, since it\nseems like an odd configuration to have, so if you can share, I'd\nappreciate it, if only to satisfy my curiosity.\n-- \nbrian m. carlson (he/him or they/them)\nHouston, Texas, US\n"},{"id":"418198","messageId":"xmqq4khrg1qx.fsf@gitster.c.googlers.com","threadId":"55243","inReplyTo":"YEAi4OkkNnp+IMJD@camp.crustytoothpaste.net","subject":"Re: bug: conflicting core.bare setting causes segfault during bare clone","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2021-03-04T01:13:10Z","receivedAt":"2021-03-04T01:15:22Z","isPatch":false,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"\"brian m. carlson\" <sandals@crustytoothpaste.net> writes:\n\n> I will admit being a bit interested in how this was discovered, since it\n> seems like an odd configuration to have, so if you can share, I'd\n> appreciate it, if only to satisfy my curiosity.\n\nI had the same reaction.  Forcing everything to be bare is quite\nunusual.\n"},{"id":"418226","messageId":"6962C073-60A9-4FCB-8FAA-02549A78547D@amazon.com","threadId":"55243","inReplyTo":"xmqq4khrg1qx.fsf@gitster.c.googlers.com","subject":"Re: bug: conflicting core.bare setting causes segfault during bare clone","fromName":"Vusich, Joseph","fromEmail":"jvusich@amazon.com","sentAt":"2021-03-04T11:48:27Z","receivedAt":"2021-03-04T11:50:24Z","isPatch":false,"sender":{"key":"jvusich@amazon.com","avatar":null},"body":"\n> \"brian m. carlson\" <sandals@crustytoothpaste.net> writes:\n\n> I will admit being a bit interested in how this was discovered, since it\n> seems like an odd configuration to have, so if you can share, I'd\n> appreciate it, if only to satisfy my curiosity.\n\nQuite by accident. A machine-generated .gitconfig with some \"default\"\nvalues, which inadvertently included core.bare=false.\n\n\n> \"Junio C Hamano\" <gitster@pobox.com> wrote:\n\n> I had the same reaction.  Forcing everything to be bare is quite\n> unusual.\n\nTechnically non-bare in this case, although the field seems to be ignored\nin the global config, at least prior to Git 2.30.0. In any case, it never\nhad any observable effect, and was therefore never noticed.\n\n"},{"id":"418444","messageId":"20210308131718.546055-1-sandals@crustytoothpaste.net","threadId":"55243","inReplyTo":"D99DD9AD-54E5-4357-BA50-8B9CAE23084E@amazon.com","subject":"[PATCH] builtin/init-db: handle bare clones when core.bare set to false","fromName":"brian m. carlson","fromEmail":"sandals@crustytoothpaste.net","sentAt":"2021-03-08T13:17:18Z","receivedAt":"2021-03-08T13:18:35Z","isPatch":true,"sender":{"key":"sandals@crustytoothpaste.net","avatar":"https://avatars.githubusercontent.com/u/497054?v=4"},"body":"In 552955ed7f (\"clone: use more conventional config/option layering\",\n2020-10-01), clone learned to read configuration options earlier in its\nexecution, before creating the new repository.  However, that led to a\nproblem: if the core.bare setting is set to false in the global config,\ncloning a bare repository segfaults.  This happens because the\nrepository is falsely thought to be non-bare, but clone has set the work\ntree to NULL, which is then dereferenced.\n\nThe code to initialize the repository already considers the fact that a\nuser might want to override the --bare option for git init, but it\ndoesn't take into account clone, which uses a different option.  Let's\njust check that the work tree is not NULL, since that's how clone\nindicates that the repository is bare.  This is also the case for git\ninit, so we won't be regressing that case.\n\nSigned-off-by: brian m. carlson <sandals@crustytoothpaste.net>\n---\nIt appears from my reading of the init code that we did intentionally\nalready honor core.bare in some case, so I have not implemented ignoring\nthat here and instead went for the limited approach.\n\n builtin/init-db.c        | 4 ++--\n t/t5606-clone-options.sh | 7 +++++++\n 2 files changed, 9 insertions(+), 2 deletions(-)\n\ndiff --git a/builtin/init-db.c b/builtin/init-db.c\nindex dcc45bef51..f82efe4aff 100644\n--- a/builtin/init-db.c\n+++ b/builtin/init-db.c\n@@ -212,6 +212,7 @@ static int create_default_files(const char *template_path,\n \tint reinit;\n \tint filemode;\n \tstruct strbuf err = STRBUF_INIT;\n+\tconst char *work_tree = get_git_work_tree();\n \n \t/* Just look for `init.templatedir` */\n \tinit_db_template_dir = NULL; /* re-set in case it was set before */\n@@ -235,7 +236,7 @@ static int create_default_files(const char *template_path,\n \t * We must make sure command-line options continue to override any\n \t * values we might have just re-read from the config.\n \t */\n-\tis_bare_repository_cfg = init_is_bare_repository;\n+\tis_bare_repository_cfg = init_is_bare_repository || !work_tree;\n \tif (init_shared_repository != -1)\n \t\tset_shared_repository(init_shared_repository);\n \n@@ -299,7 +300,6 @@ static int create_default_files(const char *template_path,\n \tif (is_bare_repository())\n \t\tgit_config_set(\"core.bare\", \"true\");\n \telse {\n-\t\tconst char *work_tree = get_git_work_tree();\n \t\tgit_config_set(\"core.bare\", \"false\");\n \t\t/* allow template config file to override the default */\n \t\tif (log_all_ref_updates == LOG_REFS_UNSET)\ndiff --git a/t/t5606-clone-options.sh b/t/t5606-clone-options.sh\nindex 52e5789fb0..9b62708d76 100755\n--- a/t/t5606-clone-options.sh\n+++ b/t/t5606-clone-options.sh\n@@ -104,6 +104,13 @@ test_expect_success 'redirected clone -v does show progress' '\n \n '\n \n+test_expect_success 'clone does not segfault with --bare and core.bare=false' '\n+\ttest_config_global core.bare false &&\n+\tgit clone --bare \"file://$(pwd)/parent\" clone-bare &&\n+\tgit -C clone-bare rev-parse --is-bare-repository >is-bare &&\n+\ttest \"$(cat is-bare)\" = true\n+'\n+\n test_expect_success 'chooses correct default initial branch name' '\n \tGIT_TEST_DEFAULT_INITIAL_BRANCH_NAME= \\\n \tgit -c init.defaultBranch=foo init --bare empty &&\n"},{"id":"418479","messageId":"CAPig+cRoZPg96aSgPoswYf-fz1_1Hxc1NfAER0kUB8Hy00WB9Q@mail.gmail.com","threadId":"55243","inReplyTo":"20210308131718.546055-1-sandals@crustytoothpaste.net","subject":"Re: [PATCH] builtin/init-db: handle bare clones when core.bare set to false","fromName":"Eric Sunshine","fromEmail":"sunshine@sunshineco.com","sentAt":"2021-03-08T16:43:58Z","receivedAt":"2021-03-08T16:45:08Z","isPatch":true,"sender":{"key":"sunshine@sunshineco.com","avatar":"https://avatars.githubusercontent.com/u/163641?v=4"},"body":"On Mon, Mar 8, 2021 at 8:18 AM brian m. carlson\n<sandals@crustytoothpaste.net> wrote:\n> In 552955ed7f (\"clone: use more conventional config/option layering\",\n> 2020-10-01), clone learned to read configuration options earlier in its\n> execution, before creating the new repository.  However, that led to a\n> problem: if the core.bare setting is set to false in the global config,\n> cloning a bare repository segfaults.  This happens because the\n> repository is falsely thought to be non-bare, but clone has set the work\n> tree to NULL, which is then dereferenced.\n> [...]\n> Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>\n> ---\n\nPerhaps this deserves a:\n\n    Reported-by: Joseph Vusich <jvusich@amazon.com>\n\n> diff --git a/t/t5606-clone-options.sh b/t/t5606-clone-options.sh\n> @@ -104,6 +104,13 @@ test_expect_success 'redirected clone -v does show progress' '\n> +test_expect_success 'clone does not segfault with --bare and core.bare=false' '\n> +       test_config_global core.bare false &&\n> +       git clone --bare \"file://$(pwd)/parent\" clone-bare &&\n\nCan this be done more simply as:\n\n    git clone --bare parent clone-bare &&\n\nor even:\n\n    git clone --bare . clone-bare &&\n\nwithout mucking about with $(pwd)?\n\n> +       git -C clone-bare rev-parse --is-bare-repository >is-bare &&\n> +       test \"$(cat is-bare)\" = true\n\nThese days, we'd probably say:\n\n    echo true >expect &&\n    git -C clone-bare rev-parse --is-bare-repository >actual &&\n    test_cmp expect actual\n\nbut it's subjective and minor; not at all worth a re-roll.\n"},{"id":"418547","messageId":"YEaxomZIluLVRWEr@camp.crustytoothpaste.net","threadId":"55243","inReplyTo":"CAPig+cRoZPg96aSgPoswYf-fz1_1Hxc1NfAER0kUB8Hy00WB9Q@mail.gmail.com","subject":"Re: [PATCH] builtin/init-db: handle bare clones when core.bare set to false","fromName":"brian m. carlson","fromEmail":"sandals@crustytoothpaste.net","sentAt":"2021-03-08T23:22:10Z","receivedAt":"2021-03-08T23:23:38Z","isPatch":true,"sender":{"key":"sandals@crustytoothpaste.net","avatar":"https://avatars.githubusercontent.com/u/497054?v=4"},"body":"On 2021-03-08 at 16:43:58, Eric Sunshine wrote:\n> On Mon, Mar 8, 2021 at 8:18 AM brian m. carlson\n> <sandals@crustytoothpaste.net> wrote:\n> > In 552955ed7f (\"clone: use more conventional config/option layering\",\n> > 2020-10-01), clone learned to read configuration options earlier in its\n> > execution, before creating the new repository.  However, that led to a\n> > problem: if the core.bare setting is set to false in the global config,\n> > cloning a bare repository segfaults.  This happens because the\n> > repository is falsely thought to be non-bare, but clone has set the work\n> > tree to NULL, which is then dereferenced.\n> > [...]\n> > Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>\n> > ---\n> \n> Perhaps this deserves a:\n> \n>     Reported-by: Joseph Vusich <jvusich@amazon.com>\n\nGood point.  Will fix.\n\n> > diff --git a/t/t5606-clone-options.sh b/t/t5606-clone-options.sh\n> > @@ -104,6 +104,13 @@ test_expect_success 'redirected clone -v does show progress' '\n> > +test_expect_success 'clone does not segfault with --bare and core.bare=false' '\n> > +       test_config_global core.bare false &&\n> > +       git clone --bare \"file://$(pwd)/parent\" clone-bare &&\n> \n> Can this be done more simply as:\n> \n>     git clone --bare parent clone-bare &&\n> \n> or even:\n> \n>     git clone --bare . clone-bare &&\n> \n> without mucking about with $(pwd)?\n\nSure.  I pulled the line from the test above, but I agree that's nicer.\n\n> > +       git -C clone-bare rev-parse --is-bare-repository >is-bare &&\n> > +       test \"$(cat is-bare)\" = true\n> \n> These days, we'd probably say:\n> \n>     echo true >expect &&\n>     git -C clone-bare rev-parse --is-bare-repository >actual &&\n>     test_cmp expect actual\n> \n> but it's subjective and minor; not at all worth a re-roll.\n\nThere's enough nits to warrant a v2, so I can do one.\n-- \nbrian m. carlson (he/him or they/them)\nHouston, Texas, US\n"},{"id":"418673","messageId":"20210310011120.1151749-1-sandals@crustytoothpaste.net","threadId":"55243","inReplyTo":"D99DD9AD-54E5-4357-BA50-8B9CAE23084E@amazon.com","subject":"[PATCH v2] builtin/init-db: handle bare clones when core.bare set to false","fromName":"brian m. carlson","fromEmail":"sandals@crustytoothpaste.net","sentAt":"2021-03-10T01:11:20Z","receivedAt":"2021-03-10T01:12:49Z","isPatch":true,"sender":{"key":"sandals@crustytoothpaste.net","avatar":"https://avatars.githubusercontent.com/u/497054?v=4"},"body":"In 552955ed7f (\"clone: use more conventional config/option layering\",\n2020-10-01), clone learned to read configuration options earlier in its\nexecution, before creating the new repository.  However, that led to a\nproblem: if the core.bare setting is set to false in the global config,\ncloning a bare repository segfaults.  This happens because the\nrepository is falsely thought to be non-bare, but clone has set the work\ntree to NULL, which is then dereferenced.\n\nThe code to initialize the repository already considers the fact that a\nuser might want to override the --bare option for git init, but it\ndoesn't take into account clone, which uses a different option.  Let's\njust check that the work tree is not NULL, since that's how clone\nindicates that the repository is bare.  This is also the case for git\ninit, so we won't be regressing that case.\n\nReported-by: Joseph Vusich <jvusich@amazon.com>\nSigned-off-by: brian m. carlson <sandals@crustytoothpaste.net>\n---\n builtin/init-db.c        | 4 ++--\n t/t5606-clone-options.sh | 8 ++++++++\n 2 files changed, 10 insertions(+), 2 deletions(-)\n\ndiff --git a/builtin/init-db.c b/builtin/init-db.c\nindex dcc45bef51..f82efe4aff 100644\n--- a/builtin/init-db.c\n+++ b/builtin/init-db.c\n@@ -212,6 +212,7 @@ static int create_default_files(const char *template_path,\n \tint reinit;\n \tint filemode;\n \tstruct strbuf err = STRBUF_INIT;\n+\tconst char *work_tree = get_git_work_tree();\n \n \t/* Just look for `init.templatedir` */\n \tinit_db_template_dir = NULL; /* re-set in case it was set before */\n@@ -235,7 +236,7 @@ static int create_default_files(const char *template_path,\n \t * We must make sure command-line options continue to override any\n \t * values we might have just re-read from the config.\n \t */\n-\tis_bare_repository_cfg = init_is_bare_repository;\n+\tis_bare_repository_cfg = init_is_bare_repository || !work_tree;\n \tif (init_shared_repository != -1)\n \t\tset_shared_repository(init_shared_repository);\n \n@@ -299,7 +300,6 @@ static int create_default_files(const char *template_path,\n \tif (is_bare_repository())\n \t\tgit_config_set(\"core.bare\", \"true\");\n \telse {\n-\t\tconst char *work_tree = get_git_work_tree();\n \t\tgit_config_set(\"core.bare\", \"false\");\n \t\t/* allow template config file to override the default */\n \t\tif (log_all_ref_updates == LOG_REFS_UNSET)\ndiff --git a/t/t5606-clone-options.sh b/t/t5606-clone-options.sh\nindex 52e5789fb0..c2b71e78c5 100755\n--- a/t/t5606-clone-options.sh\n+++ b/t/t5606-clone-options.sh\n@@ -104,6 +104,14 @@ test_expect_success 'redirected clone -v does show progress' '\n \n '\n \n+test_expect_success 'clone does not segfault with --bare and core.bare=false' '\n+\ttest_config_global core.bare false &&\n+\tgit clone --bare parent clone-bare &&\n+\techo true >expect &&\n+\tgit -C clone-bare rev-parse --is-bare-repository >actual &&\n+\ttest_cmp expect actual\n+'\n+\n test_expect_success 'chooses correct default initial branch name' '\n \tGIT_TEST_DEFAULT_INITIAL_BRANCH_NAME= \\\n \tgit -c init.defaultBranch=foo init --bare empty &&\n"},{"id":"418750","messageId":"xmqq7dmeip1v.fsf@gitster.g","threadId":"55243","inReplyTo":"20210310011120.1151749-1-sandals@crustytoothpaste.net","subject":"Re: [PATCH v2] builtin/init-db: handle bare clones when core.bare set to false","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2021-03-10T23:09:32Z","receivedAt":"2021-03-10T23:10:30Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"\"brian m. carlson\" <sandals@crustytoothpaste.net> writes:\n\n> diff --git a/t/t5606-clone-options.sh b/t/t5606-clone-options.sh\n> index 52e5789fb0..c2b71e78c5 100755\n> --- a/t/t5606-clone-options.sh\n> +++ b/t/t5606-clone-options.sh\n> @@ -104,6 +104,14 @@ test_expect_success 'redirected clone -v does show progress' '\n>  \n>  '\n>  \n> +test_expect_success 'clone does not segfault with --bare and core.bare=false' '\n> +\ttest_config_global core.bare false &&\n> +\tgit clone --bare parent clone-bare &&\n\nBecause \"git clone\" does so many different things from the normal\ncodepath in the \"local\" codepath, I'd prefer to see this one done\nwith the \"--no-local\" option (or alternatively, we could test both,\nbut that may be overkill).\n\n> +\techo true >expect &&\n> +\tgit -C clone-bare rev-parse --is-bare-repository >actual &&\n> +\ttest_cmp expect actual\n> +'\n> +\n>  test_expect_success 'chooses correct default initial branch name' '\n>  \tGIT_TEST_DEFAULT_INITIAL_BRANCH_NAME= \\\n>  \tgit -c init.defaultBranch=foo init --bare empty &&\n"},{"id":"418753","messageId":"YElXQhgTFLS61MuF@camp.crustytoothpaste.net","threadId":"55243","inReplyTo":"xmqq7dmeip1v.fsf@gitster.g","subject":"Re: [PATCH v2] builtin/init-db: handle bare clones when core.bare set to false","fromName":"brian m. carlson","fromEmail":"sandals@crustytoothpaste.net","sentAt":"2021-03-10T23:33:22Z","receivedAt":"2021-03-10T23:34:15Z","isPatch":true,"sender":{"key":"sandals@crustytoothpaste.net","avatar":"https://avatars.githubusercontent.com/u/497054?v=4"},"body":"On 2021-03-10 at 23:09:32, Junio C Hamano wrote:\n> \"brian m. carlson\" <sandals@crustytoothpaste.net> writes:\n> \n> > diff --git a/t/t5606-clone-options.sh b/t/t5606-clone-options.sh\n> > index 52e5789fb0..c2b71e78c5 100755\n> > --- a/t/t5606-clone-options.sh\n> > +++ b/t/t5606-clone-options.sh\n> > @@ -104,6 +104,14 @@ test_expect_success 'redirected clone -v does show progress' '\n> >  \n> >  '\n> >  \n> > +test_expect_success 'clone does not segfault with --bare and core.bare=false' '\n> > +\ttest_config_global core.bare false &&\n> > +\tgit clone --bare parent clone-bare &&\n> \n> Because \"git clone\" does so many different things from the normal\n> codepath in the \"local\" codepath, I'd prefer to see this one done\n> with the \"--no-local\" option (or alternatively, we could test both,\n> but that may be overkill).\n\nI can reroll with that.\n-- \nbrian m. carlson (he/him or they/them)\nHouston, Texas, US\n"}]}