From 2d54b9ea8b99df7b448f64a7847f7f3879964e12 Mon Sep 17 00:00:00 2001 From: Jonathan Nieder Date: Thu, 2 Feb 2012 04:19:35 -0600 Subject: vcs-svn: allow import of > 4GiB files There is no reason in principle that an svn-format dump would not be able to represent a file whose length does not fit in a 32-bit integer. Use off_t consistently (instead of uint32_t) to represent file lengths so we can handle that. Most of our code is already ready to do that without this patch and already passes values of type off_t around. The type mismatch due to stragglers was noticed with gcc -Wtype-limits. Inspired-by: Ramsay Jones Signed-off-by: Jonathan Nieder --- vcs-svn/svndump.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) (limited to 'vcs-svn/svndump.c') diff --git a/vcs-svn/svndump.c b/vcs-svn/svndump.c index ca63760fe2..644fdc71ba 100644 --- a/vcs-svn/svndump.c +++ b/vcs-svn/svndump.c @@ -40,7 +40,8 @@ static struct line_buffer input = LINE_BUFFER_INIT; static struct { - uint32_t action, propLength, textLength, srcRev, type; + uint32_t action, propLength, srcRev, type; + off_t text_length; struct strbuf src, dst; uint32_t text_delta, prop_delta; } node_ctx; @@ -61,7 +62,7 @@ static void reset_node_ctx(char *fname) node_ctx.type = 0; node_ctx.action = NODEACT_UNKNOWN; node_ctx.propLength = LENGTH_UNKNOWN; - node_ctx.textLength = LENGTH_UNKNOWN; + node_ctx.text_length = -1; strbuf_reset(&node_ctx.src); node_ctx.srcRev = 0; strbuf_reset(&node_ctx.dst); @@ -209,7 +210,7 @@ static void handle_node(void) { const uint32_t type = node_ctx.type; const int have_props = node_ctx.propLength != LENGTH_UNKNOWN; - const int have_text = node_ctx.textLength != LENGTH_UNKNOWN; + const int have_text = node_ctx.text_length != -1; /* * Old text for this node: * NULL - directory or bug @@ -291,12 +292,12 @@ static void handle_node(void) } if (!node_ctx.text_delta) { fast_export_modify(node_ctx.dst.buf, node_ctx.type, "inline"); - fast_export_data(node_ctx.type, node_ctx.textLength, &input); + fast_export_data(node_ctx.type, node_ctx.text_length, &input); return; } fast_export_modify(node_ctx.dst.buf, node_ctx.type, "inline"); fast_export_blob_delta(node_ctx.type, old_mode, old_data, - node_ctx.textLength, &input); + node_ctx.text_length, &input); } static void begin_revision(void) @@ -409,7 +410,15 @@ void svndump_read(const char *url) break; case sizeof("Text-content-length"): if (!constcmp(t, "Text-content-length")) { - node_ctx.textLength = atoi(val); + char *end; + uintmax_t textlen; + + textlen = 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)) + die("unrepresentable length in dump: %s", val); + node_ctx.text_length = (off_t) textlen; break; } if (constcmp(t, "Prop-content-length")) -- cgit v1.2.3 From 3b8a3051733e754dad587e5a73fba7f367c7e0db Mon Sep 17 00:00:00 2001 From: David Barr Date: Fri, 1 Jun 2012 00:41:30 +1000 Subject: vcs-svn: drop no-op reset methods Since v1.7.5~42^2~6 (vcs-svn: remove buffer_read_string) buffer_reset() does nothing thus fast_export_reset() also. Signed-off-by: David Barr Signed-off-by: Jonathan Nieder --- test-line-buffer.c | 1 - test-svn-fe.c | 2 -- vcs-svn/fast_export.c | 5 ----- vcs-svn/fast_export.h | 1 - vcs-svn/line_buffer.c | 4 ---- vcs-svn/line_buffer.h | 1 - vcs-svn/svndump.c | 2 -- 7 files changed, 16 deletions(-) (limited to 'vcs-svn/svndump.c') diff --git a/test-line-buffer.c b/test-line-buffer.c index 7ec9b13c9b..ef1d7bae14 100644 --- a/test-line-buffer.c +++ b/test-line-buffer.c @@ -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; } diff --git a/test-svn-fe.c b/test-svn-fe.c index 332a5f711d..83633a21e5 100644 --- a/test-svn-fe.c +++ b/test-svn-fe.c @@ -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; } diff --git a/vcs-svn/fast_export.c b/vcs-svn/fast_export.c index b823b8519c..b4be91cc76 100644 --- a/vcs-svn/fast_export.c +++ b/vcs-svn/fast_export.c @@ -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'); diff --git a/vcs-svn/fast_export.h b/vcs-svn/fast_export.h index aa629f54ff..8823aca15c 100644 --- a/vcs-svn/fast_export.h +++ b/vcs-svn/fast_export.h @@ -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); diff --git a/vcs-svn/line_buffer.c b/vcs-svn/line_buffer.c index 01fcb842f1..57cc1cec03 100644 --- a/vcs-svn/line_buffer.c +++ b/vcs-svn/line_buffer.c @@ -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) -{ -} diff --git a/vcs-svn/line_buffer.h b/vcs-svn/line_buffer.h index 8901f214ba..ee23b4f490 100644 --- a/vcs-svn/line_buffer.h +++ b/vcs-svn/line_buffer.h @@ -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. */ diff --git a/vcs-svn/svndump.c b/vcs-svn/svndump.c index 644fdc71ba..f6c0d4c8a0 100644 --- a/vcs-svn/svndump.c +++ b/vcs-svn/svndump.c @@ -499,8 +499,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); -- cgit v1.2.3 From d8d8708bd6a56818ee3a85007e36a8ff201f9512 Mon Sep 17 00:00:00 2001 From: David Barr Date: Fri, 1 Jun 2012 00:41:27 +1000 Subject: vcs-svn: use constcmp instead of prefixcmp Since the length of t is already known, we can simplify a little by using memcmp() instead of strncmp() to carry out a prefix comparison. All nearby code already does this. Noticed in the standalone svn-dump-fast-export project which has not needed to implement prefixcmp() yet. Signed-off-by: David Barr Signed-off-by: Jonathan Nieder --- vcs-svn/svndump.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'vcs-svn/svndump.c') diff --git a/vcs-svn/svndump.c b/vcs-svn/svndump.c index f6c0d4c8a0..c5d07a6687 100644 --- a/vcs-svn/svndump.c +++ b/vcs-svn/svndump.c @@ -361,7 +361,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) -- cgit v1.2.3 From e32b79cb3211992505d68c421a3f66b29590d72c Mon Sep 17 00:00:00 2001 From: Jonathan Nieder Date: Thu, 5 Jul 2012 22:47:47 -0500 Subject: vcs-svn: allow 64-bit Prop-Content-Length Currently the vcs-svn/ library only pays attention to the presence of the Prop-Content-Length field and doesn't care about its value, but some day we might care about the value. Parse it as an off_t instead of arbitrarily limiting to 32 bits for intuitiveness. So now you can import from a dump with more than 2 GiB of properties for a node. In practice that isn't likely to happen often, and this is mostly meant as a cleanup. Based-on-patch-by: David Barr Signed-off-by: Jonathan Nieder --- vcs-svn/svndump.c | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) (limited to 'vcs-svn/svndump.c') diff --git a/vcs-svn/svndump.c b/vcs-svn/svndump.c index c5d07a6687..a7f3ea64a5 100644 --- a/vcs-svn/svndump.c +++ b/vcs-svn/svndump.c @@ -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(); } @@ -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"); -- cgit v1.2.3