{"thread":{"id":"24526","subject":"[PATCH] config --get --path: check for unset $HOME","startedAt":"2010-07-26T15:06:51Z","lastAt":"2010-07-26T17:48:57Z","messageCount":5,"participants":["Jonathan Nieder","Julien Cristau","Ævar Arnfjörð Bjarmason"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"146380","messageId":"20100726150651.GA4021@burratino","threadId":"24526","inReplyTo":"20100726140756.GH12476@radis.liafa.jussieu.fr","subject":"[PATCH] config --get --path: check for unset $HOME","fromName":"Jonathan Nieder","fromEmail":"jrnieder@gmail.com","sentAt":"2010-07-26T15:06:51Z","receivedAt":"2010-07-26T15:06:51Z","isPatch":true,"sender":{"key":"jrnieder@gmail.com","avatar":"https://avatars.githubusercontent.com/u/281595?v=4"},"body":"If $HOME is unset (as in some automated build situations),\ncurrently\n\n\tgit config --path path.home \"~\"\n\tgit config --path --get path.home\n\nsegfaults.  Error out with\n\n\tFailed to expand user dir in: '~/'\n\ninstead.\n\nReported-by: Julien Cristau <jcristau@debian.org>\nSigned-off-by: Jonathan Nieder <jrnieder@gmail.com>\n---\nJulien Cristau wrote:\n\n> * expecting success: \n>         git config --get --path path.home > result &&\n>         git config --get --path path.normal >> result &&\n>         git config --get --path path.trailingtilde >> result &&\n>         test_cmp expect result\n> \n> Segmentation fault\n\nGood catch.  \n\n path.c                 |    2 ++\n t/t1300-repo-config.sh |   24 +++++++++++++++++++++++-\n 2 files changed, 25 insertions(+), 1 deletions(-)\n\ndiff --git a/path.c b/path.c\nindex b4c8d91..6b23023 100644\n--- a/path.c\n+++ b/path.c\n@@ -316,6 +316,8 @@ char *expand_user_path(const char *path)\n \t\tsize_t username_len = first_slash - username;\n \t\tif (username_len == 0) {\n \t\t\tconst char *home = getenv(\"HOME\");\n+\t\t\tif (!home)\n+\t\t\t\tgoto return_null;\n \t\t\tstrbuf_add(&user_path, home, strlen(home));\n \t\t} else {\n \t\t\tstruct passwd *pw = getpw_str(username, username_len);\ndiff --git a/t/t1300-repo-config.sh b/t/t1300-repo-config.sh\nindex f11f98c..7ddab5f 100755\n--- a/t/t1300-repo-config.sh\n+++ b/t/t1300-repo-config.sh\n@@ -707,19 +707,41 @@ test_expect_success 'set --path' '\n \tgit config --path path.trailingtilde \"foo~\" &&\n \ttest_cmp expect .git/config'\n \n+if test \"${HOME+set}\"\n+then\n+\ttest_set_prereq HOMEVAR\n+fi\n+\n cat >expect <<EOF\n $HOME/\n /dev/null\n foo~\n EOF\n \n-test_expect_success 'get --path' '\n+test_expect_success HOMEVAR 'get --path' '\n \tgit config --get --path path.home > result &&\n \tgit config --get --path path.normal >> result &&\n \tgit config --get --path path.trailingtilde >> result &&\n \ttest_cmp expect result\n '\n \n+cat >expect <<\\EOF\n+/dev/null\n+foo~\n+EOF\n+\n+test_expect_success 'get --path copes with unset $HOME' '\n+\t(\n+\t\tunset HOME;\n+\t\ttest_must_fail git config --get --path path.home \\\n+\t\t\t>result 2>msg &&\n+\t\tgit config --get --path path.normal >>result &&\n+\t\tgit config --get --path path.trailingtilde >>result\n+\t) &&\n+\tgrep \"[Ff]ailed to expand.*~/\" msg &&\n+\ttest_cmp expect result\n+'\n+\n rm .git/config\n \n git config quote.leading \" test\"\n-- \n1.7.1\n"},{"id":"146385","messageId":"20100726153310.GK12476@radis.liafa.jussieu.fr","threadId":"24526","inReplyTo":"20100726150651.GA4021@burratino","subject":"Re: [PATCH] config --get --path: check for unset $HOME","fromName":"Julien Cristau","fromEmail":"jcristau@debian.org","sentAt":"2010-07-26T15:33:10Z","receivedAt":"2010-07-26T15:33:10Z","isPatch":true,"sender":{"key":"jcristau@debian.org","avatar":null},"body":"On Mon, Jul 26, 2010 at 10:06:51 -0500, Jonathan Nieder wrote:\n\n> If $HOME is unset (as in some automated build situations),\n> currently\n> \n> \tgit config --path path.home \"~\"\n> \tgit config --path --get path.home\n> \n> segfaults.  Error out with\n> \n> \tFailed to expand user dir in: '~/'\n> \n> instead.\n> \n> Reported-by: Julien Cristau <jcristau@debian.org>\n> Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>\n\nTested-by: Julien Cristau <jcristau@debian.org>\n\nThanks!\n\nCheers,\nJulien\n"},{"id":"146391","messageId":"AANLkTimf73aczIILlQ5N_id97kJNmGAUf0QLlMl8my2r@mail.gmail.com","threadId":"24526","inReplyTo":"20100726150651.GA4021@burratino","subject":"Re: [PATCH] config --get --path: check for unset $HOME","fromName":"Ævar Arnfjörð Bjarmason","fromEmail":"avarab@gmail.com","sentAt":"2010-07-26T16:35:56Z","receivedAt":"2010-07-26T16:35:56Z","isPatch":true,"sender":{"key":"avarab@gmail.com","avatar":"https://avatars.githubusercontent.com/u/45301?v=4"},"body":"On Mon, Jul 26, 2010 at 15:06, Jonathan Nieder <jrnieder@gmail.com> wrote:\n>                size_t username_len = first_slash - username;\n>                if (username_len == 0) {\n>                        const char *home = getenv(\"HOME\");\n> +                       if (!home)\n> +                               goto return_null;\n>                        strbuf_add(&user_path, home, strlen(home));\n>                } else {\n>                        struct passwd *pw = getpw_str(username, username_len);\n\nShould we maybe fall back on checking pw_dir in getpwuid() if $HOME isn't set?\n"},{"id":"146396","messageId":"20100726170837.GC4399@burratino","threadId":"24526","inReplyTo":"AANLkTimf73aczIILlQ5N_id97kJNmGAUf0QLlMl8my2r@mail.gmail.com","subject":"Re: [PATCH] config --get --path: check for unset $HOME","fromName":"Jonathan Nieder","fromEmail":"jrnieder@gmail.com","sentAt":"2010-07-26T17:08:37Z","receivedAt":"2010-07-26T17:08:37Z","isPatch":true,"sender":{"key":"jrnieder@gmail.com","avatar":"https://avatars.githubusercontent.com/u/281595?v=4"},"body":"Ævar Arnfjörð Bjarmason wrote:\n\n> Should we maybe fall back on checking pw_dir in getpwuid() if $HOME isn't set?\n\nMaybe.  Why?  On Unix I suspect it is such a rare case as to not\njustify complicating the rules, but I do not know if it would help on\nother platforms.\n\nJonathan\n"},{"id":"146399","messageId":"AANLkTin6RxdVWW6qYVAyydtncGSxLK_Aoy2aWVIuoptQ@mail.gmail.com","threadId":"24526","inReplyTo":"20100726170837.GC4399@burratino","subject":"Re: [PATCH] config --get --path: check for unset $HOME","fromName":"Ævar Arnfjörð Bjarmason","fromEmail":"avarab@gmail.com","sentAt":"2010-07-26T17:48:57Z","receivedAt":"2010-07-26T17:48:57Z","isPatch":true,"sender":{"key":"avarab@gmail.com","avatar":"https://avatars.githubusercontent.com/u/45301?v=4"},"body":"On Mon, Jul 26, 2010 at 17:08, Jonathan Nieder <jrnieder@gmail.com> wrote:\n> Ęvar Arnfjörš Bjarmason wrote:\n>\n>> Should we maybe fall back on checking pw_dir in getpwuid() if $HOME isn't set?\n>\n> Maybe.  Why?  On Unix I suspect it is such a rare case as to not\n> justify complicating the rules, but I do not know if it would help on\n> other platforms.\n\nI don't know if this is worth it, but in the Perl world this is a\nfairly common idiom:\n\n    my $home = $ENV{HOME} || (getpwuid($<))[7];\n\nSometimes you're executing under some buggy wrapper that's scrubbing\nyour environment. I recall running into this issue e.g. on some odd\nSolaris webserver, which was executing CGI scripts under my user, but\n$HOME wasn't set.\n"}]}