mirror of
https://github.com/git/git.git
synced 2024-11-24 10:26:17 +08:00
vcs-svn: improve reporting of input errors
Catch input errors and exit early enough to print a reasonable diagnosis based on errno. Signed-off-by: Jonathan Nieder <jrnieder@gmail.com> Signed-off-by: David Barr <david.barr@cordelta.com> Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
This commit is contained in:
parent
26557fc1b3
commit
c9d1c8ba05
@ -63,14 +63,23 @@ void fast_export_commit(uint32_t revision, uint32_t author, char *log,
|
||||
printf("progress Imported commit %"PRIu32".\n\n", revision);
|
||||
}
|
||||
|
||||
static void die_short_read(struct line_buffer *input)
|
||||
{
|
||||
if (buffer_ferror(input))
|
||||
die_errno("error reading dump file");
|
||||
die("invalid dump: unexpected end of file");
|
||||
}
|
||||
|
||||
void fast_export_blob(uint32_t mode, uint32_t mark, uint32_t len, struct line_buffer *input)
|
||||
{
|
||||
if (mode == REPO_MODE_LNK) {
|
||||
/* svn symlink blobs start with "link " */
|
||||
buffer_skip_bytes(input, 5);
|
||||
len -= 5;
|
||||
if (buffer_skip_bytes(input, 5) != 5)
|
||||
die_short_read(input);
|
||||
}
|
||||
printf("blob\nmark :%"PRIu32"\ndata %"PRIu32"\n", mark, len);
|
||||
buffer_copy_bytes(input, len);
|
||||
if (buffer_copy_bytes(input, len) != len)
|
||||
die_short_read(input);
|
||||
fputc('\n', stdout);
|
||||
}
|
||||
|
@ -149,6 +149,13 @@ static void handle_property(uint32_t key, const char *val, uint32_t len,
|
||||
}
|
||||
}
|
||||
|
||||
static void die_short_read(void)
|
||||
{
|
||||
if (buffer_ferror(&input))
|
||||
die_errno("error reading dump file");
|
||||
die("invalid dump: unexpected end of file");
|
||||
}
|
||||
|
||||
static void read_props(void)
|
||||
{
|
||||
uint32_t key = ~0;
|
||||
@ -170,12 +177,21 @@ static void read_props(void)
|
||||
uint32_t len;
|
||||
const char *val;
|
||||
const char type = t[0];
|
||||
int ch;
|
||||
|
||||
if (!type || t[1] != ' ')
|
||||
die("invalid property line: %s\n", t);
|
||||
len = atoi(&t[2]);
|
||||
val = buffer_read_string(&input, len);
|
||||
buffer_skip_bytes(&input, 1); /* Discard trailing newline. */
|
||||
if (!val || strlen(val) != len)
|
||||
die_short_read();
|
||||
|
||||
/* Discard trailing newline. */
|
||||
ch = buffer_read_char(&input);
|
||||
if (ch == EOF)
|
||||
die_short_read();
|
||||
if (ch != '\n')
|
||||
die("invalid dump: expected newline after %s", val);
|
||||
|
||||
switch (type) {
|
||||
case 'K':
|
||||
@ -344,7 +360,11 @@ void svndump_read(const char *url)
|
||||
node_ctx.prop_delta = !strcmp(val, "true");
|
||||
} else if (key == keys.content_length) {
|
||||
len = atoi(val);
|
||||
buffer_read_line(&input);
|
||||
t = buffer_read_line(&input);
|
||||
if (!t)
|
||||
die_short_read();
|
||||
if (*t)
|
||||
die("invalid dump: expected blank line after content length header");
|
||||
if (active_ctx == REV_CTX) {
|
||||
read_props();
|
||||
} else if (active_ctx == NODE_CTX) {
|
||||
@ -352,10 +372,13 @@ void svndump_read(const char *url)
|
||||
active_ctx = REV_CTX;
|
||||
} else {
|
||||
fprintf(stderr, "Unexpected content length header: %"PRIu32"\n", len);
|
||||
buffer_skip_bytes(&input, len);
|
||||
if (buffer_skip_bytes(&input, len) != len)
|
||||
die_short_read();
|
||||
}
|
||||
}
|
||||
}
|
||||
if (buffer_ferror(&input))
|
||||
die_short_read();
|
||||
if (active_ctx == NODE_CTX)
|
||||
handle_node();
|
||||
if (active_ctx != DUMP_CTX)
|
||||
|
Loading…
Reference in New Issue
Block a user