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