Patch fix-segault-caused-by-svn_utf_cstring_to_utf8 for svn Bug #63824
Patch version 2012-12-21 06:00 UTC
Return to Bug #63824 |
Download this patch
Patch Revisions:
Developer: mountkin@gmail.com
Index: config.m4
===================================================================
--- config.m4 (revision 328740)
+++ config.m4 (working copy)
@@ -74,6 +74,10 @@
PHP_SVN_INCLUDES="$PHP_SVN_INCLUDES $APR_INCLUDES"
PHP_SVN_LDFLAGS="$PHP_SVN_LDFLAGS $APR_LDFLAGS"
+ if test "x$PHP_SVN" != "x" && test -d "$PHP_SVN/lib" ; then
+ PHP_SVN_LDFLAGS=" -L$PHP_SVN/lib $PHP_SVN_LDFLAGS"
+ fi
+
echo libsvn includes: \"$PHP_SVN_INCLUDES\"
echo libsvn ldflags: \"$PHP_SVN_LDFLAGS\"
Index: svn.c
===================================================================
--- svn.c (revision 328740)
+++ svn.c (working copy)
@@ -45,6 +45,7 @@
#include "svn_props.h"
#include "svn_version.h"
+
ZEND_DECLARE_MODULE_GLOBALS(svn)
/* custom property for ignoring SSL cert verification errors */
@@ -54,6 +55,21 @@
RETURN_FALSE;\
}
+/*
+ * TODO: automatically detect the source character encoding and
+ * call svn_utf_cstring_to_utf8_ex2 instead.
+ * */
+#define PHP_SVN_CONVERT_STR_TO_UTF8(dest, src, pool) \
+ do { \
+ svn_error_t *_err; \
+ _err = svn_utf_cstring_to_utf8 ((dest), (src), (pool)); \
+ if (_err) { \
+ php_svn_handle_error(_err TSRMLS_CC); \
+ svn_pool_destroy((pool)); \
+ RETURN_FALSE; \
+ } \
+ } while (0)
+
static void php_svn_get_version(char *buf, int buflen);
/* True global resources - no need for thread safety here */
@@ -202,6 +218,7 @@
};
/* }}} */
+
/* {{{ svn_module_entry */
zend_module_entry svn_module_entry = {
#if ZEND_MODULE_API_NO >= 20010901
@@ -452,7 +469,7 @@
}
if (config_path) {
- svn_utf_cstring_to_utf8 (&utf8_path, config_path, subpool);
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_path, config_path, subpool);
config_path = svn_path_canonicalize(utf8_path, subpool);
}
@@ -493,7 +510,7 @@
RETURN_FALSE;
}
- svn_utf_cstring_to_utf8 (&utf8_path, path, subpool);
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_path, path, subpool);
path = svn_path_canonicalize(utf8_path, subpool);
err = svn_client_import(&commit_info_p, path, url, nonrecursive,
@@ -727,18 +744,8 @@
RETURN_FALSE;
}
- err = svn_utf_cstring_to_utf8 (&utf8_repos_url, repos_url, subpool);
- if (err) {
- php_svn_handle_error(err TSRMLS_CC);
- RETVAL_FALSE;
- goto cleanup;
- }
- err = svn_utf_cstring_to_utf8 (&utf8_target_path, target_path, subpool);
- if (err) {
- php_svn_handle_error(err TSRMLS_CC);
- RETVAL_FALSE;
- goto cleanup;
- }
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_repos_url, repos_url, subpool);
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_target_path, target_path, subpool);
can_repos_url= svn_path_canonicalize(utf8_repos_url, subpool);
can_target_path = svn_path_canonicalize(utf8_target_path, subpool);
@@ -818,11 +825,7 @@
goto cleanup;
}
- err = svn_utf_cstring_to_utf8 (&utf8_url, url, subpool);
- if (err) {
- php_svn_handle_error(err TSRMLS_CC);
- goto cleanup;
- }
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_url, url, subpool);
url = svn_path_canonicalize(utf8_url, subpool);
@@ -886,14 +889,8 @@
RETURN_FALSE;
}
- err = svn_utf_cstring_to_utf8 (&utf8_repos_url, repos_url, subpool);
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_repos_url, repos_url, subpool);
- if (err) {
- php_svn_handle_error(err TSRMLS_CC);
- RETVAL_FALSE;
- goto cleanup;
- }
-
repos_url = svn_path_canonicalize(utf8_repos_url, subpool);
revision.kind = php_svn_get_revision_kind(revision);
@@ -957,7 +954,7 @@
timestr[0] = '\0';
/* we need it in UTF-8. */
- svn_utf_cstring_to_utf8 (&utf8_timestr, timestr, subpool);
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_timestr, timestr, subpool);
MAKE_STD_ZVAL(row);
array_init(row);
@@ -1090,12 +1087,7 @@
}
RETVAL_FALSE;
- err = svn_utf_cstring_to_utf8 (&utf8_url, url, subpool);
- if (err) {
- php_svn_handle_error(err TSRMLS_CC);
- svn_pool_destroy(subpool);
- return;
- }
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_url, url, subpool);
if ((ZEND_NUM_ARGS() > 2) && (end_revision.value.number == svn_opt_revision_unspecified)) {
end_revision.value.number = SVN_REVISION_INITIAL;
@@ -1348,7 +1340,7 @@
RETURN_FALSE;
}
- svn_utf_cstring_to_utf8 (&utf8_workingdir, workingdir, subpool);
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_workingdir, workingdir, subpool);
workingdir = svn_path_canonicalize(utf8_workingdir, subpool);
err = svn_client_cleanup(workingdir, SVN_G(ctx), subpool);
@@ -1386,7 +1378,7 @@
}
RETVAL_FALSE;
- svn_utf_cstring_to_utf8 (&utf8_path, path, subpool);
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_path, path, subpool);
targets = apr_array_make (subpool, 1, sizeof(char *));
@@ -1430,7 +1422,7 @@
}
RETVAL_FALSE;
- svn_utf_cstring_to_utf8 (&utf8_path, path, subpool);
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_path, path, subpool);
path = svn_path_canonicalize(utf8_path, subpool);
@@ -1648,7 +1640,7 @@
RETURN_FALSE;
}
- svn_utf_cstring_to_utf8 (&utf8_path, path, subpool);
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_path, path, subpool);
path = svn_path_canonicalize(utf8_path, subpool);
err = svn_fs_file_contents(&svnstm, fsroot->root, path, SVN_G(pool));
@@ -1690,7 +1682,7 @@
RETURN_FALSE;
}
- svn_utf_cstring_to_utf8 (&utf8_path, path, subpool);
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_path, path, subpool);
path = svn_path_canonicalize(utf8_path, subpool);
err = svn_fs_file_length(&len, fsroot->root, path, subpool);
@@ -1732,7 +1724,7 @@
RETURN_FALSE;
}
- svn_utf_cstring_to_utf8 (&utf8_path, path, subpool);
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_path, path, subpool);
path = svn_path_canonicalize(utf8_path, subpool);
err = svn_fs_node_prop(&val, fsroot->root, path, propname, subpool);
@@ -1777,7 +1769,7 @@
RETURN_FALSE;
}
- svn_utf_cstring_to_utf8 (&utf8_path, path, subpool);
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_path, path, subpool);
path = svn_path_canonicalize(utf8_path, subpool);
err = svn_fs_node_created_rev(&rev, fsroot->root, path, subpool);
@@ -1822,7 +1814,7 @@
RETURN_FALSE;
}
- svn_utf_cstring_to_utf8 (&utf8_path, path, subpool);
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_path, path, subpool);
path = svn_path_canonicalize(utf8_path, subpool);
err = svn_fs_dir_entries(&hash, fsroot->root, path, subpool);
@@ -1867,7 +1859,7 @@
RETURN_FALSE;
}
- svn_utf_cstring_to_utf8 (&utf8_path, path, subpool);
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_path, path, subpool);
path = svn_path_canonicalize(utf8_path, subpool);
err = svn_fs_check_path(&kind, fsroot->root, path, subpool);
@@ -1930,7 +1922,7 @@
RETURN_FALSE;
}
- svn_utf_cstring_to_utf8 (&utf8_path, path, subpool);
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_path, path, subpool);
path = svn_path_canonicalize(utf8_path, subpool);
err = svn_repos_open(&repos, path, subpool);
@@ -2018,13 +2010,7 @@
RETURN_FALSE;
}
- err = svn_utf_cstring_to_utf8 (&utf8_path, path, subpool);
- if (err) {
- php_svn_handle_error(err TSRMLS_CC);
- RETVAL_FALSE;
- goto cleanup;
- }
-
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_path, path, subpool);
path = svn_path_canonicalize(utf8_path, subpool);
revision.value.number = revnum;
@@ -2084,20 +2070,9 @@
RETURN_FALSE;
}
- err = svn_utf_cstring_to_utf8 (&utf8_from_path, from, subpool);
- if (err) {
- php_svn_handle_error(err TSRMLS_CC);
- RETVAL_FALSE;
- goto cleanup;
- }
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_from_path, from, subpool);
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_to_path, to, subpool);
- err = svn_utf_cstring_to_utf8 (&utf8_to_path, to, subpool);
- if (err) {
- php_svn_handle_error(err TSRMLS_CC);
- RETVAL_FALSE;
- goto cleanup;
- }
-
from = svn_path_canonicalize(utf8_from_path, subpool);
to = svn_path_canonicalize(utf8_to_path, subpool);
@@ -2148,8 +2123,8 @@
RETURN_FALSE;
}
- svn_utf_cstring_to_utf8 (&utf8_path, path, subpool);
- svn_utf_cstring_to_utf8 (&utf8_url, url, subpool);
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_path, path, subpool);
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_url, url, subpool);
path = svn_path_canonicalize(utf8_path, subpool);
url = svn_path_canonicalize(utf8_url, subpool);
@@ -2201,8 +2176,8 @@
RETURN_FALSE;
}
- svn_utf_cstring_to_utf8 (&utf8_src_path, src_path, subpool);
- svn_utf_cstring_to_utf8 (&utf8_dst_path, dst_path, subpool);
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_src_path, src_path, subpool);
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_dst_path, dst_path, subpool);
src_path = svn_path_canonicalize(utf8_src_path, subpool);
dst_path = svn_path_canonicalize(utf8_dst_path, subpool);
@@ -2310,13 +2285,7 @@
RETURN_FALSE;
}
- err = svn_utf_cstring_to_utf8 (&utf8_repos_url, repos_url, subpool);
- if (err) {
- php_svn_handle_error(err TSRMLS_CC);
- RETVAL_FALSE;
- goto cleanup;
- }
-
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_repos_url, repos_url, subpool);
repos_url = svn_path_canonicalize(utf8_repos_url, subpool);
start_revision.kind = svn_opt_revision_number;
@@ -2382,7 +2351,7 @@
RETURN_FALSE;
}
- svn_utf_cstring_to_utf8 (&utf8_path, path, subpool);
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_path, path, subpool);
targets = apr_array_make (subpool, 1, sizeof(char *));
APR_ARRAY_PUSH(targets, const char *) = svn_path_canonicalize(utf8_path, subpool);
@@ -2442,14 +2411,8 @@
RETURN_FALSE;
}
- err = svn_utf_cstring_to_utf8 (&utf8_path, path, subpool);
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_path, path, subpool);
- if (err) {
- php_svn_handle_error(err TSRMLS_CC);
- svn_pool_destroy(subpool);
- RETURN_FALSE;
- }
-
SVN_G(ctx)->log_msg_baton = NULL;
if (loglen) {
@@ -2524,8 +2487,8 @@
RETURN_FALSE;
}
- svn_utf_cstring_to_utf8 (&utf8_src_path, src_path, subpool);
- svn_utf_cstring_to_utf8 (&utf8_dst_path, dst_path, subpool);
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_src_path, src_path, subpool);
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_dst_path, dst_path, subpool);
src_path = svn_path_canonicalize(utf8_src_path, subpool);
dst_path = svn_path_canonicalize(utf8_dst_path, subpool);
@@ -2583,12 +2546,7 @@
RETURN_FALSE;
}
- err = svn_utf_cstring_to_utf8 (&utf8_path, path, subpool);
- if (err) {
- php_svn_handle_error(err TSRMLS_CC);
- RETVAL_FALSE;
- goto cleanup;
- }
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_path, path, subpool);
path = svn_path_canonicalize(utf8_path, subpool);
@@ -2665,13 +2623,7 @@
RETURN_FALSE;
}
- err = svn_utf_cstring_to_utf8 (&utf8_path, path, subpool);
- if (err) {
- php_svn_handle_error(err TSRMLS_CC);
- RETVAL_FALSE;
- goto cleanup;
- }
-
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_path, path, subpool);
path = svn_path_canonicalize(utf8_path, subpool);
revision.kind = php_svn_get_revision_kind(revision);
@@ -2741,14 +2693,7 @@
RETURN_FALSE;
}
- err = svn_utf_cstring_to_utf8 (&utf8_path, path, subpool);
- if (err)
- {
- php_svn_handle_error(err TSRMLS_CC);
- svn_pool_destroy(subpool);
- RETURN_FALSE;
- }
-
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_path, path, subpool);
path = svn_path_canonicalize(utf8_path, subpool);
config_hash = replicate_zend_hash_to_apr_hash(config, subpool TSRMLS_CC);
@@ -2793,7 +2738,7 @@
RETURN_FALSE;
}
- svn_utf_cstring_to_utf8 (&utf8_path, path, subpool);
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_path, path, subpool);
path = svn_path_canonicalize(utf8_path, subpool);
err = svn_repos_recover2(path, 0, NULL, NULL, subpool);
@@ -2831,8 +2776,8 @@
RETURN_FALSE;
}
- svn_utf_cstring_to_utf8 (&utf8_src_path, src_path, subpool);
- svn_utf_cstring_to_utf8 (&utf8_dst_path, dst_path, subpool);
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_src_path, src_path, subpool);
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_dst_path, dst_path, subpool);
src_path = svn_path_canonicalize(utf8_src_path, subpool);
dst_path = svn_path_canonicalize(utf8_dst_path, subpool);
@@ -2909,12 +2854,7 @@
SVN_G(ctx)->log_msg_baton = log;
if (path) {
- err = svn_utf_cstring_to_utf8 (&utf8_path, path, subpool);
- if (err) {
- php_svn_handle_error(err TSRMLS_CC);
- RETVAL_FALSE;
- goto cleanup;
- }
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_path, path, subpool);
path = svn_path_canonicalize(utf8_path, subpool);
targets_array = apr_array_make (subpool, 1, sizeof(char *));
@@ -2983,7 +2923,7 @@
}
if (path) {
- svn_utf_cstring_to_utf8 (&utf8_path, path, subpool);
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_path, path, subpool);
path = svn_path_canonicalize(utf8_path, subpool);
targets_array = apr_array_make (subpool, 1, sizeof(char *));
@@ -3034,7 +2974,7 @@
}
if (path) {
- svn_utf_cstring_to_utf8 (&utf8_path, path, subpool);
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_path, path, subpool);
path = svn_path_canonicalize(utf8_path, subpool);
targets_array = apr_array_make (subpool, 1, sizeof(char *));
@@ -3079,13 +3019,7 @@
RETURN_FALSE;
}
- err = svn_utf_cstring_to_utf8 (&utf8_path, path, subpool);
- if (err) {
- php_svn_handle_error(err TSRMLS_CC);
- RETVAL_FALSE;
- goto cleanup;
- }
-
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_path, path, subpool);
path = svn_path_canonicalize(utf8_path, subpool);
err = svn_client_add2((const char*)path, recurse, force, SVN_G(ctx), subpool);
@@ -3186,12 +3120,7 @@
RETURN_FALSE;
}
- err = svn_utf_cstring_to_utf8 (&utf8_path, path, subpool);
- if (err) {
- php_svn_handle_error(err TSRMLS_CC);
- RETVAL_FALSE;
- goto cleanup;
- }
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_path, path, subpool);
path = svn_path_canonicalize(utf8_path, subpool);
array_init(return_value);
@@ -3248,14 +3177,7 @@
RETURN_FALSE;
}
- err = svn_utf_cstring_to_utf8 (&utf8_path, path, subpool);
- if (err)
- {
- php_svn_handle_error(err TSRMLS_CC);
- RETVAL_FALSE;
- goto cleanup;
- }
-
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_path, path, subpool);
path = svn_path_canonicalize(utf8_path, subpool);
rev.value.number = revno;
@@ -3435,7 +3357,7 @@
RETURN_FALSE;
}
- svn_utf_cstring_to_utf8 (&utf8_path, path, subpool);
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_path, path, subpool);
path = svn_path_canonicalize(utf8_path, subpool);
ZEND_FETCH_RESOURCE(root, struct php_svn_fs_root *, &zroot, -1, "svn-fs-root", le_svn_fs_root);
@@ -3473,7 +3395,7 @@
RETURN_FALSE;
}
- svn_utf_cstring_to_utf8 (&utf8_path, path, subpool);
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_path, path, subpool);
path = svn_path_canonicalize(utf8_path, subpool);
ZEND_FETCH_RESOURCE(root, struct php_svn_fs_root *, &zroot, -1, "svn-fs-root", le_svn_fs_root);
@@ -3514,7 +3436,7 @@
RETURN_FALSE;
}
- svn_utf_cstring_to_utf8 (&utf8_path, path, subpool);
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_path, path, subpool);
path = svn_path_canonicalize(utf8_path, subpool);
ZEND_FETCH_RESOURCE(root, struct php_svn_fs_root *, &zroot, -1, "svn-fs-root", le_svn_fs_root);
@@ -3560,8 +3482,8 @@
RETURN_FALSE;
}
- svn_utf_cstring_to_utf8 (&utf8_from_path, from_path, subpool);
- svn_utf_cstring_to_utf8 (&utf8_to_path, to_path, subpool);
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_from_path, from_path, subpool);
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_to_path, to_path, subpool);
from_path = svn_path_canonicalize(utf8_from_path, subpool);
to_path = svn_path_canonicalize(utf8_to_path, subpool);
@@ -3602,7 +3524,7 @@
RETURN_FALSE;
}
- svn_utf_cstring_to_utf8 (&utf8_path, path, subpool);
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_path, path, subpool);
path = svn_path_canonicalize(utf8_path, subpool);
ZEND_FETCH_RESOURCE(root, struct php_svn_fs_root *, &zroot, -1, "svn-fs-root", le_svn_fs_root);
@@ -3679,7 +3601,7 @@
RETURN_FALSE;
}
- svn_utf_cstring_to_utf8 (&utf8_path, path, subpool);
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_path, path, subpool);
path = svn_path_canonicalize(utf8_path, subpool);
ZEND_FETCH_RESOURCE(root, struct php_svn_fs_root *, &zroot, -1, "svn-fs-root", le_svn_fs_root);
@@ -3718,7 +3640,7 @@
RETURN_FALSE;
}
- svn_utf_cstring_to_utf8 (&utf8_path, path, subpool);
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_path, path, subpool);
path = svn_path_canonicalize(utf8_path, subpool);
ZEND_FETCH_RESOURCE(root, struct php_svn_fs_root *, &zroot, -1, "svn-fs-root", le_svn_fs_root);
@@ -3758,7 +3680,7 @@
RETURN_FALSE;
}
- svn_utf_cstring_to_utf8 (&utf8_path, path, subpool);
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_path, path, subpool);
path = svn_path_canonicalize(utf8_path, subpool);
ZEND_FETCH_RESOURCE(root, struct php_svn_fs_root *, &zroot, -1, "svn-fs-root", le_svn_fs_root);
@@ -3807,8 +3729,8 @@
RETURN_FALSE;
}
- svn_utf_cstring_to_utf8 (&utf8_path1, path1, subpool);
- svn_utf_cstring_to_utf8 (&utf8_path2, path2, subpool);
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_path1, path1, subpool);
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_path2, path2, subpool);
path1 = svn_path_canonicalize(utf8_path1, subpool);
path2 = svn_path_canonicalize(utf8_path2, subpool);
@@ -3855,8 +3777,8 @@
RETURN_FALSE;
}
- svn_utf_cstring_to_utf8 (&utf8_path1, path1, subpool);
- svn_utf_cstring_to_utf8 (&utf8_path2, path2, subpool);
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_path1, path1, subpool);
+ PHP_SVN_CONVERT_STR_TO_UTF8(&utf8_path2, path2, subpool);
path1 = svn_path_canonicalize(utf8_path1, subpool);
path2 = svn_path_canonicalize(utf8_path2, subpool);
|