git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: Fw: git-core: SIGSEGV during {peek,ls}-remote on HTTP remotes.

From
Junio C Hamano <gitster@pobox.com>
Date
Nov 1, 2009, 20:15 UTC
Message-ID
<7vljiqxapw.fsf@alter.siamese.dyndns.org>
In-Reply-To
<alpine.LNX.2.00.0911011348190.14365@iabervon.org>
Daniel Barkalow <barkalow@iabervon.org> writes:
Show 19 quoted lines
> On Sat, 31 Oct 2009, Junio C Hamano wrote:
> ...
>> Attached is a minimum fix/work around, but this is done without being very
>> familiar with the current assumptions in the codepaths involved.
>> 
>> Issues I want area experts to consider before coming up with the final fix
>> are:
>> ... 
> I think there's no benefit to allowing NULL for the remote; I think you 
> can always get a struct remote for what you want to access. So it's 
> probably just as well to require it, particularly because, as in the case 
> of cmd_ls_remote() below, you'd need a special case to not get a struct 
> remote.
>
> Is there any way in which the intended semantics of "transport_get(NULL, 
> url)" is not the same as "transport_get(remote_get(url), url)"?
> (And, in the extended series, I make "transport_get(remote_get(url), 
> NULL)" also mean the same thing as above, while "transport_get(NULL, 
> NULL)" is obviously underspecified.)

That was really my question to people who are involved in the transport layer code. I didn't know how transport->url and transport->remote->url are intended to relate to each other, for example, and that was why you were on Cc list. In other words, you are the area expert, you tell me ;-)

Sverre seemed to think slightly differently; perhaps having worked on the foreign vcs interface he has some other input.

Show 25 quoted lines
>>  - When helping to handle ls-remote request, there is no need for the
>>    helper to know anything about the local state.  We probably shouldn't
>>    even run setup_git_directory_gently() at all in this case.  But when
>>    helping other kinds of request, the helper does need to know where our
>>    repository is.
>> 
>>    In general, what should the initial environment for helpers be?  Should
>>    they assume that they have to figure out where the git repository is
>>    themselves (in other words, should they assume they cannot rely on
>>    anything the caller does before they are called?  Would the caller
>>    generally have done the usual repo discovery (including chdir() to the
>>    toplevel), and there are some set of assumptions they can make?  If so
>>    what are they?
>
> Probably, the helper should be run with a predicable initial environment, 
> simply because operations that use remote repositories are most often run 
> from the toplevel of a repo, so people will fail to notice their bugs 
> which trigger on running from subdirectories....
> Perhaps we should actively tell the helper if there is no git repository 
> (or, if any git repository we happen to be in is merely coincidental and 
> shouldn't affect the helper)? Helpers involving importing will probably 
> want to know they don't have a private refs namespace, private state 
> directory, etc. even for implementing "list" for ls-remote, and it would 
> probably be best to require helper authors to report that they've 
> considered this possibility before trying to use it.
I think that is a sane approach.
Show 16 quoted lines
>> diff --git a/builtin-ls-remote.c b/builtin-ls-remote.c
>> index 78a88f7..a8d5613 100644
>> --- a/builtin-ls-remote.c
>> +++ b/builtin-ls-remote.c
>> @@ -86,7 +86,7 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix)
>>  			pattern[j - i] = p;
>>  		}
>>  	}
>> -	remote = nongit ? NULL : remote_get(dest);
>> +	remote = remote_get(dest);
>>  	if (remote && !remote->url_nr)
>>  		die("remote %s has no configured URL", dest);
>>  	transport = transport_get(remote, remote ? remote->url[0] : dest);
>
> You can also drop the two checks for remote being non-NULL here, since 
> it's now always non-NULL...
You are probably right; I didn't even look when I did the above.
Show 19 quoted lines
>> diff --git a/remote-curl.c b/remote-curl.c
>> index ad6a163..7c83f77 100644
>> --- a/remote-curl.c
>> +++ b/remote-curl.c
>> @@ -81,8 +81,9 @@ int main(int argc, const char **argv)
>>  	struct strbuf buf = STRBUF_INIT;
>>  	const char *url;
>>  	struct walker *walker = NULL;
>> +	int nongit = 0;
>>  
>> -	setup_git_directory();
>> +	setup_git_directory_gently(&nongit);
>>  	if (argc < 2) {
>>  		fprintf(stderr, "Remote needed\n");
>>  		return 1;
>
> Do things like git_path() fail cleanly if there was no git directory?  If
> not, there should probably be tests of nongit on paths that actually need 
> a git directory,...
I don't know.  Again, you tell me ;-)

It probably makes sesne as you outlined in the earlier part of your response for the caller to give a bit more clue to the helper to help making such a decision.

Previous: Daniel BarkalowNext: Daniel Barkalow
Message 8 of 13 in “Fw: git-core: SIGSEGV during {peek,ls}-remote on HTTP remotes.”
  1. Samium GromoffOct 31, 2009
  2. Junio C HamanoNov 1, 2009
  3. Sverre RabbelierNov 1, 2009
  4. Daniel BarkalowNov 1, 2009
  5. Sverre RabbelierNov 1, 2009
  6. Junio C HamanoNov 2, 2009
  7. Daniel BarkalowNov 1, 2009
  8. Junio C HamanoNov 1, 2009
  9. Daniel BarkalowNov 1, 2009
  10. Jeff KingNov 1, 2009
  11. Daniel BarkalowNov 2, 2009
  12. Clemens BuchacherNov 2, 2009
  13. Mike HommeyNov 1, 2009

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.