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
   };