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 *


Reply via email to