On 23 Jul 2016, at 10:14, Eric Wong <e@xxxxxxxxx> wrote: > larsxschneider@xxxxxxxxx wrote: >> Please note that the protocol filters do not support stream processing >> with this implemenatation because the filter needs to know the length of >> the result in advance. A protocol version 2 could address this in a >> future patch. > > Would it be prudent to reuse pkt-line for this? Peff suggested that, too, in $gmane/299902. However, this would make the protocol a bit more complicated and it wouldn't buy us anything for Git large file processing filters (my main motivation for this patch) as these filters can't leverage streaming anyways. >> +static void stop_protocol_filter(struct cmd2process *entry) { >> + if (!entry) >> + return; >> + sigchain_push(SIGPIPE, SIG_IGN); >> + close(entry->process.in); >> + close(entry->process.out); >> + sigchain_pop(SIGPIPE); >> + finish_command(&entry->process); >> + child_process_clear(&entry->process); >> + hashmap_remove(&cmd_process_map, entry, NULL); >> + free(entry); >> +} >> + >> +static struct cmd2process *start_protocol_filter(const char *cmd) >> +{ >> + int ret = 1; >> + struct cmd2process *entry = NULL; >> + struct child_process *process = NULL; > > These are unconditionally set below, so initializing to NULL > may hide future bugs. OK. I thought it is generally a good thing to initialize a pointer with NULL. Can you explain to me how this might hide future bugs? I will remove the initialization. >> + struct strbuf nbuf = STRBUF_INIT; >> + struct string_list split = STRING_LIST_INIT_NODUP; >> + const char *argv[] = { NULL, NULL }; >> + const char *header = "git-filter-protocol\nversion"; > > static const char header[] = "git-filter-protocol\nversion"; > > ...might be smaller by avoiding the extra pointer > (but compilers ought to be able to optimize it) Agreed! >> + entry = xmalloc(sizeof(*entry)); >> + hashmap_entry_init(entry, strhash(cmd)); >> + entry->cmd = cmd; >> + process = &entry->process; > > <snip> > >> + ret &= strncmp(header, split.items[0].string, strlen(header)) == 0; > > starts_with() is probably more readable, here. OK, will fix. >> +static int apply_protocol_filter(const char *path, const char *src, size_t len, >> + int fd, struct strbuf *dst, const char *cmd, >> + const char *filter_type) >> +{ >> + int ret = 1; >> + struct cmd2process *entry = NULL; >> + struct child_process *process = NULL; > > I would leave process initialized, here, since it should > always be set below: OK, will fix. >> + struct stat fileStat; >> + struct strbuf nbuf = STRBUF_INIT; >> + size_t nbuf_len; >> + char *strtol_end; >> + char c; >> + >> + if (!cmd || !*cmd) >> + return 0; >> + >> + if (!dst) >> + return 1; >> + >> + if (!cmd_process_map_init) { >> + cmd_process_map_init = 1; >> + hashmap_init(&cmd_process_map, (hashmap_cmp_fn) cmd2process_cmp, 0); >> + } else { >> + entry = find_protocol_filter_entry(cmd); >> + } >> + >> + if (!entry){ >> + entry = start_protocol_filter(cmd); >> + if (!entry) { >> + stop_protocol_filter(entry); > > stop_protocol_filter is a no-op, here, since entry is NULL Oops - a result of my own refactoring :-) Thank you! >> + return 0; >> + } >> + } >> + process = &entry->process; >> + >> + sigchain_push(SIGPIPE, SIG_IGN); >> + switch (entry->protocol) { >> + case 1: >> + if (fd >= 0 && !src) { >> + ret &= fstat(fd, &fileStat) != -1; >> + len = fileStat.st_size; > > There's a truncation bug when sizeof(size_t) < sizeof(off_t) OK. What would you suggest to do in that case? Should we just let the filter fail? Is there anything else we could do? > (and mixedCase is inconsistent with our style) OK, will fix. >> + my $filelen = <STDIN>; >> + chomp $filelen; >> + print $debug " $filelen"; >> + >> + $filelen = int($filelen); > > Calling int() here is unnecessary and may hide bugs if you > forget to check $debug. Perhaps a regexp check is safer: > > $filelen =~ /\A\d+\z/ or die "bad filelen: $filelen\n"; OK, will fix! Thanks for your review, Lars -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html