Author: philip
Date: Fri Nov 27 20:41:21 2009
New Revision: 884995

URL: http://svn.apache.org/viewvc?rev=884995&view=rev
Log:
Fix uninitialised memory reads in diff.  Found by valgrind.

* subversion/libsvn_wc/diff.c
  (apply_textdelta, close_file): Don't rely on any metadata values
    for the SVN_ERR_WC_PATH_NOT_FOUND cases.

* subversion/libsvn_client/diff.c
  (display_prop_diffs): Initialise diff options.

Modified:
    subversion/trunk/subversion/libsvn_client/diff.c
    subversion/trunk/subversion/libsvn_wc/diff.c

Modified: subversion/trunk/subversion/libsvn_client/diff.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/diff.c?rev=884995&r1=884994&r2=884995&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/diff.c (original)
+++ subversion/trunk/subversion/libsvn_client/diff.c Fri Nov 27 20:41:21 2009
@@ -269,7 +269,7 @@
       {
         svn_stream_t *os = svn_stream_from_aprfile2(file, TRUE, pool);
         svn_diff_t *diff;
-        svn_diff_file_options_t options;
+        svn_diff_file_options_t options = { 0 };
         const svn_string_t *tmp;
         const svn_string_t *orig;
         const svn_string_t *val;

Modified: subversion/trunk/subversion/libsvn_wc/diff.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/diff.c?rev=884995&r1=884994&r2=884995&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/diff.c (original)
+++ subversion/trunk/subversion/libsvn_wc/diff.c Fri Nov 27 20:41:21 2009
@@ -1462,17 +1462,24 @@
   svn_stream_t *source;
   svn_stream_t *temp_stream;
   svn_error_t *err;
+  svn_boolean_t found;
 
   err = svn_wc__db_read_info(&status, NULL, NULL, NULL, NULL, NULL, NULL,
                              NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
                              NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
                              NULL, eb->db, fb->local_abspath, pool, pool);
   if (err && err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND)
-    svn_error_clear(err);
+    {
+      svn_error_clear(err);
+      found = FALSE;
+    }
   else
-    SVN_ERR(err);
+    {
+      SVN_ERR(err);
+      found = TRUE;
+    }
 
-  if (status == svn_wc__db_status_added)
+  if (found && status == svn_wc__db_status_added)
     SVN_ERR(svn_wc__db_scan_addition(&status, NULL, NULL, NULL, NULL, NULL,
                                      NULL, NULL, NULL, eb->db,
                                      fb->local_abspath, pool, pool));
@@ -1481,8 +1488,8 @@
 
   /* If the node is added-with-history, then this is not actually
      an add, but a modification. */
-  if (status == svn_wc__db_status_copied ||
-      status == svn_wc__db_status_moved_here)
+  if (found && (status == svn_wc__db_status_copied ||
+                status == svn_wc__db_status_moved_here))
     fb->added = FALSE;
 
   if (fb->added)
@@ -1554,10 +1561,9 @@
                              NULL, eb->db, fb->local_abspath, pool, pool);
   if (err && err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND)
     svn_error_clear(err);
-  else
-    SVN_ERR(err);
-
-  if (status == svn_wc__db_status_added)
+  else if (err)
+    return err;
+  else if (status == svn_wc__db_status_added)
     SVN_ERR(svn_wc__db_scan_addition(&status, NULL, NULL, NULL, NULL, NULL,
                                      NULL, NULL, NULL, eb->db,
                                      fb->local_abspath, pool, pool));


Reply via email to