You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by iv...@apache.org on 2015/11/23 13:10:23 UTC
svn commit: r1715777 - in /subversion/trunk/subversion:
libsvn_subr/config_file.c tests/libsvn_subr/config-test.c
Author: ivan
Date: Mon Nov 23 12:10:23 2015
New Revision: 1715777
URL: http://svn.apache.org/viewvc?rev=1715777&view=rev
Log:
Convert assertion failure to error if configuration file contains just one
0xEE character.
* subversion/libsvn_subr/config_file.c
(parse_context_t): Add HIT_STREAM_EOF member.
(parser_getc): Set CTX->HIT_STREAM_EOF to TRUE once we hit end-of-file and
do not attempt to read from stream after that.
(skip_bom): Extend SVN_ERR_ASSERT() condition. Check for subsequent BOM
characters only if we have more than two bytes in buffer remaining.
* subversion/tests/libsvn_subr/config-test.c
(test_invalid_bom): New test.
(test_funcs): Add test_invalid_bom test to list.
Modified:
subversion/trunk/subversion/libsvn_subr/config_file.c
subversion/trunk/subversion/tests/libsvn_subr/config-test.c
Modified: subversion/trunk/subversion/libsvn_subr/config_file.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_subr/config_file.c?rev=1715777&r1=1715776&r2=1715777&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_subr/config_file.c (original)
+++ subversion/trunk/subversion/libsvn_subr/config_file.c Mon Nov 23 12:10:23 2015
@@ -74,6 +74,9 @@ typedef struct parse_context_t
char parser_buffer[SVN__STREAM_CHUNK_SIZE]; /* Larger than most config files */
size_t buffer_pos; /* Current position within parser_buffer */
size_t buffer_size; /* parser_buffer contains this many bytes */
+
+ /* Non-zero if we hit EOF on the stream. */
+ svn_boolean_t hit_stream_eof;
} parse_context_t;
@@ -101,11 +104,15 @@ parser_getc(parse_context_t *ctx, int *c
}
else
{
- ctx->buffer_pos = 0;
- ctx->buffer_size = sizeof(ctx->parser_buffer);
+ if (!ctx->hit_stream_eof)
+ {
+ ctx->buffer_pos = 0;
+ ctx->buffer_size = sizeof(ctx->parser_buffer);
- SVN_ERR(svn_stream_read_full(ctx->stream, ctx->parser_buffer,
- &(ctx->buffer_size)));
+ SVN_ERR(svn_stream_read_full(ctx->stream, ctx->parser_buffer,
+ &(ctx->buffer_size)));
+ ctx->hit_stream_eof = (ctx->buffer_size != sizeof(ctx->parser_buffer));
+ }
if (ctx->buffer_pos < ctx->buffer_size)
{
@@ -224,8 +231,10 @@ skip_bom(parse_context_t *ctx)
* of the BOM characters into the parse_context_t buffer. This can
* safely be assumed as long as we only try to use skip_bom() at the
* start of the stream and the buffer is longer than 3 characters. */
- SVN_ERR_ASSERT(ctx->buffer_size > ctx->buffer_pos + 1);
- if (buf[ctx->buffer_pos] == 0xBB && buf[ctx->buffer_pos + 1] == 0xBF)
+ SVN_ERR_ASSERT(ctx->buffer_size > ctx->buffer_pos + 1 ||
+ ctx->hit_stream_eof);
+ if (ctx->buffer_size > ctx->buffer_pos + 1 &&
+ buf[ctx->buffer_pos] == 0xBB && buf[ctx->buffer_pos + 1] == 0xBF)
ctx->buffer_pos += 2;
else
SVN_ERR(parser_ungetc(ctx, ch));
@@ -579,6 +588,7 @@ svn_config__parse_stream(svn_config_t *c
ctx->value = svn_stringbuf_create_empty(scratch_pool);
ctx->buffer_pos = 0;
ctx->buffer_size = 0;
+ ctx->hit_stream_eof = FALSE;
SVN_ERR(skip_bom(ctx));
Modified: subversion/trunk/subversion/tests/libsvn_subr/config-test.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/libsvn_subr/config-test.c?rev=1715777&r1=1715776&r2=1715777&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/libsvn_subr/config-test.c (original)
+++ subversion/trunk/subversion/tests/libsvn_subr/config-test.c Mon Nov 23 12:10:23 2015
@@ -382,6 +382,27 @@ test_expand(const svn_test_opts_t *opts,
return SVN_NO_ERROR;
}
+static svn_error_t *
+test_invalid_bom(apr_pool_t *pool)
+{
+ svn_config_t *cfg;
+ svn_error_t *err;
+ svn_string_t *cfg_string;
+ svn_stream_t *stream;
+
+ cfg_string = svn_string_create("\xEF", pool);
+ stream = svn_stream_from_string(cfg_string, pool);
+ err = svn_config_parse(&cfg, stream, TRUE, TRUE, pool);
+ SVN_TEST_ASSERT_ERROR(err, SVN_ERR_MALFORMED_FILE);
+
+ cfg_string = svn_string_create("\xEF\xBB", pool);
+ stream = svn_stream_from_string(cfg_string, pool);
+ err = svn_config_parse(&cfg, stream, TRUE, TRUE, pool);
+ SVN_TEST_ASSERT_ERROR(err, SVN_ERR_MALFORMED_FILE);
+
+ return SVN_NO_ERROR;
+}
+
/*
====================================================================
If you add a new test to this file, update this array.
@@ -414,6 +435,8 @@ static struct svn_test_descriptor_t test
"test r/o mode"),
SVN_TEST_OPTS_PASS(test_expand,
"test variable expansion"),
+ SVN_TEST_PASS2(test_invalid_bom,
+ "test parsing config file with invalid BOM"),
SVN_TEST_NULL
};