diff options
Diffstat (limited to 'subversion/libsvn_delta/text_delta.c')
-rw-r--r-- | subversion/libsvn_delta/text_delta.c | 33 |
1 files changed, 19 insertions, 14 deletions
diff --git a/subversion/libsvn_delta/text_delta.c b/subversion/libsvn_delta/text_delta.c index 04eca8afb8c10..4f834988bf385 100644 --- a/subversion/libsvn_delta/text_delta.c +++ b/subversion/libsvn_delta/text_delta.c @@ -102,7 +102,7 @@ struct apply_baton { char *tbuf; /* Target buffer */ apr_size_t tbuf_size; /* Allocated target buffer space */ - apr_md5_ctx_t md5_context; /* Leads to result_digest below. */ + svn_checksum_ctx_t *md5_context; /* Leads to result_digest below. */ unsigned char *result_digest; /* MD5 digest of resultant fulltext; must point to at least APR_MD5_DIGESTSIZE bytes of storage. */ @@ -180,8 +180,7 @@ svn_txdelta_window_dup(const svn_txdelta_window_t *window, build_baton.num_ops = window->num_ops; build_baton.src_ops = window->src_ops; build_baton.ops_size = window->num_ops; - build_baton.ops = apr_palloc(pool, ops_size); - memcpy(build_baton.ops, window->ops, ops_size); + build_baton.ops = apr_pmemdup(pool, window->ops, ops_size); build_baton.new_data = svn_stringbuf_create_from_string(window->new_data, pool); @@ -721,15 +720,23 @@ apply_window(svn_txdelta_window_t *window, void *baton) { struct apply_baton *ab = (struct apply_baton *) baton; apr_size_t len; - svn_error_t *err; if (window == NULL) { + svn_error_t *err = SVN_NO_ERROR; + /* We're done; just clean up. */ if (ab->result_digest) - apr_md5_final(ab->result_digest, &(ab->md5_context)); + { + svn_checksum_t *md5_checksum; + + err = svn_checksum_final(&md5_checksum, ab->md5_context, ab->pool); + if (!err) + memcpy(ab->result_digest, md5_checksum->digest, + svn_checksum_size(md5_checksum)); + } - err = svn_stream_close(ab->target); + err = svn_error_compose_create(err, svn_stream_close(ab->target)); svn_pool_destroy(ab->pool); return err; @@ -773,12 +780,10 @@ apply_window(svn_txdelta_window_t *window, void *baton) if (ab->sbuf_len < window->sview_len) { len = window->sview_len - ab->sbuf_len; - err = svn_stream_read_full(ab->source, ab->sbuf + ab->sbuf_len, &len); - if (err == SVN_NO_ERROR && len != window->sview_len - ab->sbuf_len) - err = svn_error_create(SVN_ERR_INCOMPLETE_DATA, NULL, - "Delta source ended unexpectedly"); - if (err != SVN_NO_ERROR) - return err; + SVN_ERR(svn_stream_read_full(ab->source, ab->sbuf + ab->sbuf_len, &len)); + if (len != window->sview_len - ab->sbuf_len) + return svn_error_create(SVN_ERR_INCOMPLETE_DATA, NULL, + "Delta source ended unexpectedly"); ab->sbuf_len = window->sview_len; } @@ -792,7 +797,7 @@ apply_window(svn_txdelta_window_t *window, void *baton) /* Just update the context here. */ if (ab->result_digest) - apr_md5_update(&(ab->md5_context), ab->tbuf, len); + SVN_ERR(svn_checksum_update(ab->md5_context, ab->tbuf, len)); return svn_stream_write(ab->target, ab->tbuf, &len); } @@ -823,7 +828,7 @@ svn_txdelta_apply(svn_stream_t *source, ab->result_digest = result_digest; if (result_digest) - apr_md5_init(&(ab->md5_context)); + ab->md5_context = svn_checksum_ctx_create(svn_checksum_md5, subpool); if (error_info) ab->error_info = apr_pstrdup(subpool, error_info); |