Merge branch 'jn/vcs-svn'
vcs-svn updates to clean-up compilation, lift 32-bit limitations, etc. * jn/vcs-svn: vcs-svn: allow 64-bit Prop-Content-Length vcs-svn: suppress a signed/unsigned comparison warning vcs-svn: suppress a signed/unsigned comparison warning vcs-svn: suppress signed/unsigned comparison warnings vcs-svn: use strstr instead of memmem vcs-svn: use constcmp instead of prefixcmp vcs-svn: simplify cleanup in apply_one_window vcs-svn: avoid self-assignment in dummy initialization of pre_off vcs-svn: drop no-op reset methods vcs-svn: suppress -Wtype-limits warning vcs-svn: allow import of > 4GiB files vcs-svn: rename check_overflow and its arguments for clarity
This commit is contained in:
commit
fde1cc1dc2
@ -87,6 +87,5 @@ int main(int argc, char *argv[])
|
||||
die("input error");
|
||||
if (ferror(stdout))
|
||||
die("output error");
|
||||
buffer_reset(&stdin_buf);
|
||||
return 0;
|
||||
}
|
||||
|
@ -31,9 +31,7 @@ static int apply_delta(int argc, char *argv[])
|
||||
die_errno("cannot close preimage");
|
||||
if (buffer_deinit(&delta))
|
||||
die_errno("cannot close delta");
|
||||
buffer_reset(&preimage);
|
||||
strbuf_release(&preimage_view.buf);
|
||||
buffer_reset(&delta);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -42,11 +42,6 @@ void fast_export_deinit(void)
|
||||
die_errno("error closing fast-import feedback stream");
|
||||
}
|
||||
|
||||
void fast_export_reset(void)
|
||||
{
|
||||
buffer_reset(&report_buffer);
|
||||
}
|
||||
|
||||
void fast_export_delete(const char *path)
|
||||
{
|
||||
putchar('D');
|
||||
@ -163,7 +158,7 @@ static int parse_cat_response_line(const char *header, off_t *len)
|
||||
|
||||
if (ends_with(header, headerlen, " missing"))
|
||||
return error("cat-blob reports missing blob: %s", header);
|
||||
type = memmem(header, headerlen, " blob ", strlen(" blob "));
|
||||
type = strstr(header, " blob ");
|
||||
if (!type)
|
||||
return error("cat-blob header has wrong object type: %s", header);
|
||||
n = strtoumax(type + strlen(" blob "), (char **) &end, 10);
|
||||
@ -259,7 +254,7 @@ static int parse_ls_response(const char *response, uint32_t *mode,
|
||||
}
|
||||
|
||||
/* Mode. */
|
||||
if (response_end - response < strlen("100644") ||
|
||||
if (response_end - response < (signed) strlen("100644") ||
|
||||
response[strlen("100644")] != ' ')
|
||||
die("invalid ls response: missing mode: %s", response);
|
||||
*mode = 0;
|
||||
@ -272,7 +267,7 @@ static int parse_ls_response(const char *response, uint32_t *mode,
|
||||
}
|
||||
|
||||
/* ' blob ' or ' tree ' */
|
||||
if (response_end - response < strlen(" blob ") ||
|
||||
if (response_end - response < (signed) strlen(" blob ") ||
|
||||
(response[1] != 'b' && response[1] != 't'))
|
||||
die("unexpected ls response: not a tree or blob: %s", response);
|
||||
response += strlen(" blob ");
|
||||
|
@ -6,7 +6,6 @@ struct line_buffer;
|
||||
|
||||
void fast_export_init(int fd);
|
||||
void fast_export_deinit(void);
|
||||
void fast_export_reset(void);
|
||||
|
||||
void fast_export_delete(const char *path);
|
||||
void fast_export_modify(const char *path, uint32_t mode, const char *dataref);
|
||||
|
@ -124,7 +124,3 @@ off_t buffer_skip_bytes(struct line_buffer *buf, off_t nbytes)
|
||||
}
|
||||
return done;
|
||||
}
|
||||
|
||||
void buffer_reset(struct line_buffer *buf)
|
||||
{
|
||||
}
|
||||
|
@ -14,7 +14,6 @@ struct line_buffer {
|
||||
int buffer_init(struct line_buffer *buf, const char *filename);
|
||||
int buffer_fdinit(struct line_buffer *buf, int fd);
|
||||
int buffer_deinit(struct line_buffer *buf);
|
||||
void buffer_reset(struct line_buffer *buf);
|
||||
|
||||
int buffer_tmpfile_init(struct line_buffer *buf);
|
||||
FILE *buffer_tmpfile_rewind(struct line_buffer *buf); /* prepare to write. */
|
||||
|
@ -54,7 +54,7 @@ int move_window(struct sliding_view *view, off_t off, size_t width)
|
||||
return -1;
|
||||
if (off < view->off || off + width < view->off + view->width)
|
||||
return error("invalid delta: window slides left");
|
||||
if (view->max_off >= 0 && view->max_off < off + width)
|
||||
if (view->max_off >= 0 && view->max_off < off + (off_t) width)
|
||||
return error("delta preimage ends early");
|
||||
|
||||
file_offset = view->off + view->buf.len;
|
||||
|
@ -77,8 +77,9 @@ static int error_short_read(struct line_buffer *input)
|
||||
static int read_chunk(struct line_buffer *delta, off_t *delta_len,
|
||||
struct strbuf *buf, size_t len)
|
||||
{
|
||||
assert(*delta_len >= 0);
|
||||
strbuf_reset(buf);
|
||||
if (len > *delta_len ||
|
||||
if (len > (uintmax_t) *delta_len ||
|
||||
buffer_read_binary(delta, buf, len) != len)
|
||||
return error_short_read(delta);
|
||||
*delta_len -= buf->len;
|
||||
@ -258,6 +259,7 @@ static int apply_window_in_core(struct window *ctx)
|
||||
static int apply_one_window(struct line_buffer *delta, off_t *delta_len,
|
||||
struct sliding_view *preimage, FILE *out)
|
||||
{
|
||||
int rv = -1;
|
||||
struct window ctx = WINDOW_INIT(preimage);
|
||||
size_t out_len;
|
||||
size_t instructions_len;
|
||||
@ -275,27 +277,26 @@ static int apply_one_window(struct line_buffer *delta, off_t *delta_len,
|
||||
if (apply_window_in_core(&ctx))
|
||||
goto error_out;
|
||||
if (ctx.out.len != out_len) {
|
||||
error("invalid delta: incorrect postimage length");
|
||||
rv = error("invalid delta: incorrect postimage length");
|
||||
goto error_out;
|
||||
}
|
||||
if (write_strbuf(&ctx.out, out))
|
||||
goto error_out;
|
||||
window_release(&ctx);
|
||||
return 0;
|
||||
rv = 0;
|
||||
error_out:
|
||||
window_release(&ctx);
|
||||
return -1;
|
||||
return rv;
|
||||
}
|
||||
|
||||
int svndiff0_apply(struct line_buffer *delta, off_t delta_len,
|
||||
struct sliding_view *preimage, FILE *postimage)
|
||||
{
|
||||
assert(delta && preimage && postimage);
|
||||
assert(delta && preimage && postimage && delta_len >= 0);
|
||||
|
||||
if (read_magic(delta, &delta_len))
|
||||
return -1;
|
||||
while (delta_len) { /* For each window: */
|
||||
off_t pre_off = pre_off; /* stupid GCC... */
|
||||
off_t pre_off = -1;
|
||||
size_t pre_len;
|
||||
|
||||
if (read_offset(delta, &pre_off, &delta_len) ||
|
||||
|
@ -34,14 +34,13 @@
|
||||
#define NODE_CTX 2 /* node metadata */
|
||||
#define INTERNODE_CTX 3 /* between nodes */
|
||||
|
||||
#define LENGTH_UNKNOWN (~0)
|
||||
#define DATE_RFC2822_LEN 31
|
||||
|
||||
static struct line_buffer input = LINE_BUFFER_INIT;
|
||||
|
||||
static struct {
|
||||
uint32_t action, propLength, srcRev, type;
|
||||
off_t text_length;
|
||||
uint32_t action, srcRev, type;
|
||||
off_t prop_length, text_length;
|
||||
struct strbuf src, dst;
|
||||
uint32_t text_delta, prop_delta;
|
||||
} node_ctx;
|
||||
@ -61,7 +60,7 @@ static void reset_node_ctx(char *fname)
|
||||
{
|
||||
node_ctx.type = 0;
|
||||
node_ctx.action = NODEACT_UNKNOWN;
|
||||
node_ctx.propLength = LENGTH_UNKNOWN;
|
||||
node_ctx.prop_length = -1;
|
||||
node_ctx.text_length = -1;
|
||||
strbuf_reset(&node_ctx.src);
|
||||
node_ctx.srcRev = 0;
|
||||
@ -209,7 +208,7 @@ static void read_props(void)
|
||||
static void handle_node(void)
|
||||
{
|
||||
const uint32_t type = node_ctx.type;
|
||||
const int have_props = node_ctx.propLength != LENGTH_UNKNOWN;
|
||||
const int have_props = node_ctx.prop_length != -1;
|
||||
const int have_text = node_ctx.text_length != -1;
|
||||
/*
|
||||
* Old text for this node:
|
||||
@ -273,7 +272,7 @@ static void handle_node(void)
|
||||
if (have_props) {
|
||||
if (!node_ctx.prop_delta)
|
||||
node_ctx.type = type;
|
||||
if (node_ctx.propLength)
|
||||
if (node_ctx.prop_length)
|
||||
read_props();
|
||||
}
|
||||
|
||||
@ -361,7 +360,7 @@ void svndump_read(const char *url)
|
||||
reset_rev_ctx(atoi(val));
|
||||
break;
|
||||
case sizeof("Node-path"):
|
||||
if (prefixcmp(t, "Node-"))
|
||||
if (constcmp(t, "Node-"))
|
||||
continue;
|
||||
if (!constcmp(t + strlen("Node-"), "path")) {
|
||||
if (active_ctx == NODE_CTX)
|
||||
@ -409,22 +408,26 @@ void svndump_read(const char *url)
|
||||
node_ctx.srcRev = atoi(val);
|
||||
break;
|
||||
case sizeof("Text-content-length"):
|
||||
if (!constcmp(t, "Text-content-length")) {
|
||||
if (constcmp(t, "Text") && constcmp(t, "Prop"))
|
||||
continue;
|
||||
if (constcmp(t + 4, "-content-length"))
|
||||
continue;
|
||||
{
|
||||
char *end;
|
||||
uintmax_t textlen;
|
||||
uintmax_t len;
|
||||
|
||||
textlen = strtoumax(val, &end, 10);
|
||||
len = strtoumax(val, &end, 10);
|
||||
if (!isdigit(*val) || *end)
|
||||
die("invalid dump: non-numeric length %s", val);
|
||||
if (textlen > maximum_signed_value_of_type(off_t))
|
||||
if (len > maximum_signed_value_of_type(off_t))
|
||||
die("unrepresentable length in dump: %s", val);
|
||||
node_ctx.text_length = (off_t) textlen;
|
||||
|
||||
if (*t == 'T')
|
||||
node_ctx.text_length = (off_t) len;
|
||||
else
|
||||
node_ctx.prop_length = (off_t) len;
|
||||
break;
|
||||
}
|
||||
if (constcmp(t, "Prop-content-length"))
|
||||
continue;
|
||||
node_ctx.propLength = atoi(val);
|
||||
break;
|
||||
case sizeof("Text-delta"):
|
||||
if (!constcmp(t, "Text-delta")) {
|
||||
node_ctx.text_delta = !strcmp(val, "true");
|
||||
@ -499,8 +502,6 @@ void svndump_deinit(void)
|
||||
|
||||
void svndump_reset(void)
|
||||
{
|
||||
fast_export_reset();
|
||||
buffer_reset(&input);
|
||||
strbuf_release(&dump_ctx.uuid);
|
||||
strbuf_release(&dump_ctx.url);
|
||||
strbuf_release(&rev_ctx.log);
|
||||
|
Loading…
Reference in New Issue
Block a user