Author: kotkov
Date: Fri Sep  8 22:24:39 2017
New Revision: 1807833

URL: http://svn.apache.org/viewvc?rev=1807833&view=rev
Log:
Avoid a function with a potentially unexpected side effect by introducing
an output parameter instead of changing the value in place.

* subversion/svnrdump/svnrdump.h
  (svn_rdump__normalize_prop): Add output parameter and update the docstring.
  (svn_rdump__normalize_props): Update the docstring.

* subversion/svnrdump/util.c
  (svn_rdump__normalize_prop): Populate the output parameter.  Ensure
   that the resulting value is always copied (even if unchanged) to the
   result pool; that should also allow to sometimes get rid of the double
   copying on the calling site.
  (svn_rdump__normalize_props): Update call to svn_rdump__normalize_prop().

* subversion/svnrdump/load_editor.c
  (set_revision_property, set_node_property): Update these calling sites of
   svn_rdump__normalize_prop().  Don't make unnecessary copies, as
   now the values are always copied to the result pool during the call
   to svn_rdump__normalize_prop().

Modified:
    subversion/trunk/subversion/svnrdump/load_editor.c
    subversion/trunk/subversion/svnrdump/svnrdump.h
    subversion/trunk/subversion/svnrdump/util.c

Modified: subversion/trunk/subversion/svnrdump/load_editor.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/svnrdump/load_editor.c?rev=1807833&r1=1807832&r2=1807833&view=diff
==============================================================================
--- subversion/trunk/subversion/svnrdump/load_editor.c (original)
+++ subversion/trunk/subversion/svnrdump/load_editor.c Fri Sep  8 22:24:39 2017
@@ -713,7 +713,7 @@ set_revision_property(void *baton,
 {
   struct revision_baton *rb = baton;
 
-  SVN_ERR(svn_rdump__normalize_prop(name, &value, rb->pool));
+  SVN_ERR(svn_rdump__normalize_prop(&value, name, value, rb->pool));
 
   SVN_ERR(svn_repos__validate_prop(name, value, rb->pool));
 
@@ -721,8 +721,7 @@ set_revision_property(void *baton,
     {
       if (! svn_hash_gets(rb->pb->skip_revprops, name))
         svn_hash_sets(rb->revprop_table,
-                      apr_pstrdup(rb->pool, name),
-                      svn_string_dup(value, rb->pool));
+                      apr_pstrdup(rb->pool, name), value);
     }
   else if (rb->rev_offset == -1
            && ! svn_hash_gets(rb->pb->skip_revprops, name))
@@ -737,9 +736,9 @@ set_revision_property(void *baton,
   /* Remember any datestamp/ author that passes through (see comment
      in close_revision). */
   if (!strcmp(name, SVN_PROP_REVISION_DATE))
-    rb->datestamp = svn_string_dup(value, rb->pool);
+    rb->datestamp = value;
   if (!strcmp(name, SVN_PROP_REVISION_AUTHOR))
-    rb->author = svn_string_dup(value, rb->pool);
+    rb->author = value;
 
   return SVN_NO_ERROR;
 }
@@ -776,13 +775,13 @@ set_node_property(void *baton,
       value = new_value;
     }
 
-  SVN_ERR(svn_rdump__normalize_prop(name, &value, pool));
+  SVN_ERR(svn_rdump__normalize_prop(&value, name, value, pool));
 
   SVN_ERR(svn_repos__validate_prop(name, value, pool));
 
   prop = apr_palloc(nb->rb->pool, sizeof (*prop));
   prop->name = apr_pstrdup(pool, name);
-  prop->value = svn_string_dup(value, pool);
+  prop->value = value;
   svn_hash_sets(nb->prop_changes, prop->name, prop);
 
   return SVN_NO_ERROR;

Modified: subversion/trunk/subversion/svnrdump/svnrdump.h
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/svnrdump/svnrdump.h?rev=1807833&r1=1807832&r2=1807833&view=diff
==============================================================================
--- subversion/trunk/subversion/svnrdump/svnrdump.h (original)
+++ subversion/trunk/subversion/svnrdump/svnrdump.h Fri Sep  8 22:24:39 2017
@@ -100,9 +100,6 @@ svn_rdump__load_dumpstream(svn_stream_t
  * currently all svn:* props) so that they contain only LF (\n) line endings.
  *
  * Put the normalized props into NORMAL_PROPS, allocated in RESULT_POOL.
- *
- * Note: this function does not do a deep copy; it is expected that PROPS has
- * a longer lifetime than NORMAL_PROPS.
  */
 svn_error_t *
 svn_rdump__normalize_props(apr_hash_t **normal_props,
@@ -116,11 +113,14 @@ svn_rdump__normalize_props(apr_hash_t **
  * "\r\n" sequences are replaced with "\n"
  *
  * NAME is used to check that VALUE should be normalized, and if this is the
- * case, VALUE is then normalized, allocated from RESULT_POOL
+ * case, *RESULT_P is then set to the normalized property value.  If no
+ * normalization is required, VALUE will be copied to RESULT_POOL
+ * unchanged.
  */
 svn_error_t *
-svn_rdump__normalize_prop(const char *name,
-                          const svn_string_t **value,
+svn_rdump__normalize_prop(const svn_string_t **result_p,
+                          const char *name,
+                          const svn_string_t *value,
                           apr_pool_t *result_pool);
 
 #ifdef __cplusplus

Modified: subversion/trunk/subversion/svnrdump/util.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/svnrdump/util.c?rev=1807833&r1=1807832&r2=1807833&view=diff
==============================================================================
--- subversion/trunk/subversion/svnrdump/util.c (original)
+++ subversion/trunk/subversion/svnrdump/util.c Fri Sep  8 22:24:39 2017
@@ -31,21 +31,27 @@
 
 
 svn_error_t *
-svn_rdump__normalize_prop(const char *name,
-                          const svn_string_t **value,
+svn_rdump__normalize_prop(const svn_string_t **result_p,
+                          const char *name,
+                          const svn_string_t *value,
                           apr_pool_t *result_pool)
 {
-  if (svn_prop_needs_translation(name) && *value)
+  if (svn_prop_needs_translation(name) && value)
     {
       const char *cstring;
 
-      SVN_ERR(svn_subst_translate_cstring2((*value)->data, &cstring,
+      SVN_ERR(svn_subst_translate_cstring2(value->data, &cstring,
                                            "\n", TRUE,
                                            NULL, FALSE,
                                            result_pool));
 
-      *value = svn_string_create(cstring, result_pool);
+      *result_p = svn_string_create(cstring, result_pool);
     }
+  else
+    {
+      *result_p = svn_string_dup(value, result_pool);
+    }
+
   return SVN_NO_ERROR;
 }
 
@@ -64,8 +70,7 @@ svn_rdump__normalize_props(apr_hash_t **
       const char *key = apr_hash_this_key(hi);
       const svn_string_t *value = apr_hash_this_val(hi);
 
-      SVN_ERR(svn_rdump__normalize_prop(key, &value,
-                                        result_pool));
+      SVN_ERR(svn_rdump__normalize_prop(&value, key, value, result_pool));
 
       svn_hash_sets(*normal_props, key, value);
     }


Reply via email to