mirror of
https://github.com/git/git.git
synced 2026-04-10 00:40:14 +02:00
Merge branch 'jk/pkt-line-cleanup'
Clean up pkt-line API, implementation and its callers to make them more robust. * jk/pkt-line-cleanup: do not use GIT_TRACE_PACKET=3 in tests remote-curl: always parse incoming refs remote-curl: move ref-parsing code up in file remote-curl: pass buffer straight to get_remote_heads teach get_remote_heads to read from a memory buffer pkt-line: share buffer/descriptor reading implementation pkt-line: provide a LARGE_PACKET_MAX static buffer pkt-line: move LARGE_PACKET_MAX definition from sideband pkt-line: teach packet_read_line to chomp newlines pkt-line: provide a generic reading function with options pkt-line: drop safe_write function pkt-line: move a misplaced comment write_or_die: raise SIGPIPE when we get EPIPE upload-archive: use argv_array to store client arguments upload-archive: do not copy repo name send-pack: prefer prefixcmp over memcmp in receive_status fetch-pack: fix out-of-bounds buffer offset in get_ack upload-pack: remove packet debugging harness upload-pack: do not add duplicate objects to shallow list upload-pack: use get_sha1_hex to parse "shallow" lines
This commit is contained in:
@@ -27,8 +27,8 @@ static int run_remote_archiver(int argc, const char **argv,
|
||||
const char *remote, const char *exec,
|
||||
const char *name_hint)
|
||||
{
|
||||
char buf[LARGE_PACKET_MAX];
|
||||
int fd[2], i, len, rv;
|
||||
char *buf;
|
||||
int fd[2], i, rv;
|
||||
struct transport *transport;
|
||||
struct remote *_remote;
|
||||
|
||||
@@ -53,21 +53,18 @@ static int run_remote_archiver(int argc, const char **argv,
|
||||
packet_write(fd[1], "argument %s\n", argv[i]);
|
||||
packet_flush(fd[1]);
|
||||
|
||||
len = packet_read_line(fd[0], buf, sizeof(buf));
|
||||
if (!len)
|
||||
buf = packet_read_line(fd[0], NULL);
|
||||
if (!buf)
|
||||
die(_("git archive: expected ACK/NAK, got EOF"));
|
||||
if (buf[len-1] == '\n')
|
||||
buf[--len] = 0;
|
||||
if (strcmp(buf, "ACK")) {
|
||||
if (len > 5 && !prefixcmp(buf, "NACK "))
|
||||
if (!prefixcmp(buf, "NACK "))
|
||||
die(_("git archive: NACK %s"), buf + 5);
|
||||
if (len > 4 && !prefixcmp(buf, "ERR "))
|
||||
if (!prefixcmp(buf, "ERR "))
|
||||
die(_("remote error: %s"), buf + 4);
|
||||
die(_("git archive: protocol error"));
|
||||
}
|
||||
|
||||
len = packet_read_line(fd[0], buf, sizeof(buf));
|
||||
if (len)
|
||||
if (packet_read_line(fd[0], NULL))
|
||||
die(_("git archive: expected a flush"));
|
||||
|
||||
/* Now, start reading from fd[0] and spit it out to stdout */
|
||||
|
||||
@@ -119,14 +119,11 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix)
|
||||
/* in stateless RPC mode we use pkt-line to read
|
||||
* from stdin, until we get a flush packet
|
||||
*/
|
||||
static char line[1000];
|
||||
for (;;) {
|
||||
int n = packet_read_line(0, line, sizeof(line));
|
||||
if (!n)
|
||||
char *line = packet_read_line(0, NULL);
|
||||
if (!line)
|
||||
break;
|
||||
if (line[n-1] == '\n')
|
||||
n--;
|
||||
add_sought_entry_mem(&sought, &nr_sought, &alloc_sought, line, n);
|
||||
add_sought_entry(&sought, &nr_sought, &alloc_sought, line);
|
||||
}
|
||||
}
|
||||
else {
|
||||
@@ -147,7 +144,7 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix)
|
||||
args.verbose ? CONNECT_VERBOSE : 0);
|
||||
}
|
||||
|
||||
get_remote_heads(fd[0], &ref, 0, NULL);
|
||||
get_remote_heads(fd[0], NULL, 0, &ref, 0, NULL);
|
||||
|
||||
ref = fetch_pack(&args, fd, conn, ref, dest,
|
||||
sought, nr_sought, pack_lockfile_ptr);
|
||||
|
||||
@@ -754,17 +754,15 @@ static struct command *read_head_info(void)
|
||||
struct command *commands = NULL;
|
||||
struct command **p = &commands;
|
||||
for (;;) {
|
||||
static char line[1000];
|
||||
char *line;
|
||||
unsigned char old_sha1[20], new_sha1[20];
|
||||
struct command *cmd;
|
||||
char *refname;
|
||||
int len, reflen;
|
||||
|
||||
len = packet_read_line(0, line, sizeof(line));
|
||||
if (!len)
|
||||
line = packet_read_line(0, &len);
|
||||
if (!line)
|
||||
break;
|
||||
if (line[len-1] == '\n')
|
||||
line[--len] = 0;
|
||||
if (len < 83 ||
|
||||
line[40] != ' ' ||
|
||||
line[81] != ' ' ||
|
||||
@@ -932,7 +930,7 @@ static void report(struct command *commands, const char *unpack_status)
|
||||
if (use_sideband)
|
||||
send_sideband(1, 1, buf.buf, buf.len, use_sideband);
|
||||
else
|
||||
safe_write(1, buf.buf, buf.len);
|
||||
write_or_die(1, buf.buf, buf.len);
|
||||
strbuf_release(&buf);
|
||||
}
|
||||
|
||||
|
||||
@@ -79,7 +79,7 @@ static void print_helper_status(struct ref *ref)
|
||||
}
|
||||
strbuf_addch(&buf, '\n');
|
||||
|
||||
safe_write(1, buf.buf, buf.len);
|
||||
write_or_die(1, buf.buf, buf.len);
|
||||
}
|
||||
strbuf_release(&buf);
|
||||
}
|
||||
@@ -207,7 +207,7 @@ int cmd_send_pack(int argc, const char **argv, const char *prefix)
|
||||
|
||||
memset(&extra_have, 0, sizeof(extra_have));
|
||||
|
||||
get_remote_heads(fd[0], &remote_refs, REF_NORMAL, &extra_have);
|
||||
get_remote_heads(fd[0], NULL, 0, &remote_refs, REF_NORMAL, &extra_have);
|
||||
|
||||
transport_verify_remote_names(nr_refspecs, refspecs);
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
#include "pkt-line.h"
|
||||
#include "sideband.h"
|
||||
#include "run-command.h"
|
||||
#include "argv-array.h"
|
||||
|
||||
static const char upload_archive_usage[] =
|
||||
"git upload-archive <repo>";
|
||||
@@ -18,51 +19,31 @@ static const char deadchild[] =
|
||||
|
||||
int cmd_upload_archive_writer(int argc, const char **argv, const char *prefix)
|
||||
{
|
||||
const char *sent_argv[MAX_ARGS];
|
||||
struct argv_array sent_argv = ARGV_ARRAY_INIT;
|
||||
const char *arg_cmd = "argument ";
|
||||
char *p, buf[4096];
|
||||
int sent_argc;
|
||||
int len;
|
||||
|
||||
if (argc != 2)
|
||||
usage(upload_archive_usage);
|
||||
|
||||
if (strlen(argv[1]) + 1 > sizeof(buf))
|
||||
die("insanely long repository name");
|
||||
|
||||
strcpy(buf, argv[1]); /* enter-repo smudges its argument */
|
||||
|
||||
if (!enter_repo(buf, 0))
|
||||
die("'%s' does not appear to be a git repository", buf);
|
||||
if (!enter_repo(argv[1], 0))
|
||||
die("'%s' does not appear to be a git repository", argv[1]);
|
||||
|
||||
/* put received options in sent_argv[] */
|
||||
sent_argc = 1;
|
||||
sent_argv[0] = "git-upload-archive";
|
||||
for (p = buf;;) {
|
||||
/* This will die if not enough free space in buf */
|
||||
len = packet_read_line(0, p, (buf + sizeof buf) - p);
|
||||
if (len == 0)
|
||||
argv_array_push(&sent_argv, "git-upload-archive");
|
||||
for (;;) {
|
||||
char *buf = packet_read_line(0, NULL);
|
||||
if (!buf)
|
||||
break; /* got a flush */
|
||||
if (sent_argc > MAX_ARGS - 2)
|
||||
die("Too many options (>%d)", MAX_ARGS - 2);
|
||||
if (sent_argv.argc > MAX_ARGS)
|
||||
die("Too many options (>%d)", MAX_ARGS - 1);
|
||||
|
||||
if (p[len-1] == '\n') {
|
||||
p[--len] = 0;
|
||||
}
|
||||
if (len < strlen(arg_cmd) ||
|
||||
strncmp(arg_cmd, p, strlen(arg_cmd)))
|
||||
if (prefixcmp(buf, arg_cmd))
|
||||
die("'argument' token or flush expected");
|
||||
|
||||
len -= strlen(arg_cmd);
|
||||
memmove(p, p + strlen(arg_cmd), len);
|
||||
sent_argv[sent_argc++] = p;
|
||||
p += len;
|
||||
*p++ = 0;
|
||||
argv_array_push(&sent_argv, buf + strlen(arg_cmd));
|
||||
}
|
||||
sent_argv[sent_argc] = NULL;
|
||||
|
||||
/* parse all options sent by the client */
|
||||
return write_archive(sent_argc, sent_argv, prefix, 0, NULL, 1);
|
||||
return write_archive(sent_argv.argc, sent_argv.argv, prefix, 0, NULL, 1);
|
||||
}
|
||||
|
||||
__attribute__((format (printf, 1, 2)))
|
||||
|
||||
Reference in New Issue
Block a user