Author: kotkov
Date: Thu Mar 4 13:25:08 2021
New Revision: 1887174
URL: http://svn.apache.org/viewvc?rev=1887174&view=rev
Log:
In svn_subst_stream_translated(), return the original stream in cases where
the translation is going to be no-op.
This avoids the additional work caused by the translation stream handler if
the caller didn't explicitly check if the translation is necessary or didn't
do a thorough check — e.g., did not account for an empty keyword set.
* subversion/libsvn_subr/subst.c
(svn_subst_translation_required): Return the original stream if the
translation is going to be no-op, because we have no EOL_STR and
no KEYWORDS.
Modified:
subversion/trunk/subversion/libsvn_subr/subst.c
Modified: subversion/trunk/subversion/libsvn_subr/subst.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_subr/subst.c?rev=1887174&r1=1887173&r2=1887174&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_subr/subst.c (original)
+++ subversion/trunk/subversion/libsvn_subr/subst.c Thu Mar 4 13:25:08 2021
@@ -1484,10 +1484,6 @@ stream_translated(svn_stream_t *stream,
svn_boolean_t expand,
apr_pool_t *result_pool)
{
- struct translated_stream_baton *baton
- = apr_palloc(result_pool, sizeof(*baton));
- svn_stream_t *s = svn_stream_create(baton, result_pool);
-
/* Make sure EOL_STR and KEYWORDS are allocated in RESULT_POOL
so they have the same lifetime as the stream. */
if (eol_str)
@@ -1520,32 +1516,44 @@ stream_translated(svn_stream_t *stream,
}
}
- /* Setup the baton fields */
- baton->stream = stream;
- baton->in_baton
- = create_translation_baton(eol_str, translated_eol, repair, keywords,
- expand, result_pool);
- baton->out_baton
- = create_translation_baton(eol_str, translated_eol, repair, keywords,
- expand, result_pool);
- baton->written = FALSE;
- baton->readbuf = svn_stringbuf_create_empty(result_pool);
- baton->readbuf_off = 0;
- baton->iterpool = svn_pool_create(result_pool);
- baton->buf = apr_palloc(result_pool, SVN__TRANSLATION_BUF_SIZE);
-
- /* Setup the stream methods */
- svn_stream_set_read2(s, NULL /* only full read support */,
- translated_stream_read);
- svn_stream_set_write(s, translated_stream_write);
- svn_stream_set_close(s, translated_stream_close);
- if (svn_stream_supports_mark(stream))
+ if (eol_str || keywords)
{
- svn_stream_set_mark(s, translated_stream_mark);
- svn_stream_set_seek(s, translated_stream_seek);
- }
+ struct translated_stream_baton *baton
+ = apr_palloc(result_pool, sizeof(*baton));
+ svn_stream_t *s = svn_stream_create(baton, result_pool);
+
+ /* Setup the baton fields */
+ baton->stream = stream;
+ baton->in_baton
+ = create_translation_baton(eol_str, translated_eol, repair, keywords,
+ expand, result_pool);
+ baton->out_baton
+ = create_translation_baton(eol_str, translated_eol, repair, keywords,
+ expand, result_pool);
+ baton->written = FALSE;
+ baton->readbuf = svn_stringbuf_create_empty(result_pool);
+ baton->readbuf_off = 0;
+ baton->iterpool = svn_pool_create(result_pool);
+ baton->buf = apr_palloc(result_pool, SVN__TRANSLATION_BUF_SIZE);
+
+ /* Setup the stream methods */
+ svn_stream_set_read2(s, NULL /* only full read support */,
+ translated_stream_read);
+ svn_stream_set_write(s, translated_stream_write);
+ svn_stream_set_close(s, translated_stream_close);
+ if (svn_stream_supports_mark(stream))
+ {
+ svn_stream_set_mark(s, translated_stream_mark);
+ svn_stream_set_seek(s, translated_stream_seek);
+ }
- return s;
+ return s;
+ }
+ else
+ {
+ /* No translation is necessary, return the original stream. */
+ return stream;
+ }
}
svn_stream_t *