[prev in list] [next in list] [prev in thread] [next in thread]
List: pecl-cvs
Subject: [PECL-CVS] com =?UTF-8?Q?pecl/search=5Fengine/solr=3A=20Fix=20Bug=20=23=36=38=32=36?= =?UTF-8?Q?=36=
From: omars () php ! net
Date: 2014-10-26 1:41:34
Message-ID: php-mail-d3dccedf73da6c38407016f146763c1c2007432002 () git ! php ! net
[Download RAW message or body]
Commit: d088c081e83b2a43d035278765df2b950eebd00e
Author: Omar Shaban <omars@php.net> Sun, 26 Oct 2014 03:41:34 +0200
Parents: 60cff757b66c686c287ee05bb5891ee0b6708e60
Branches: dismax
Link: http://git.php.net/?p=pecl/search_engine/solr.git;a=commitdiff;h=d088c081e83b2a43d035278765df2b950eebd00e
Log:
Fix Bug #68266 SegFault in SolrDisMaxQuery::addQueryField
Extended arg_list structure and functionality.
Fixed other issues with arg_list parameter type
Allowed zero-length argument value
Allowed zero-length argument-to-argument-value separator
Bugs:
https://bugs.php.net/68266
Changed paths:
M php_solr.h
M php_solr_dismax_query.c
M solr_functions_params.c
M solr_types.h
A tests/110.solrdismaxquery.phpt
["diff_d088c081e83b2a43d035278765df2b950eebd00e.txt" (text/plain)]
diff --git a/php_solr.h b/php_solr.h
index fb44881..79b475a 100644
--- a/php_solr.h
+++ b/php_solr.h
@@ -583,7 +583,7 @@ PHP_SOLR_API int solr_add_or_set_normal_param(zval *objptr, \
solr_char_t *pname, PHP_SOLR_API int solr_add_simple_list_param(zval *objptr, \
solr_char_t *pname, int pname_length, solr_char_t *pvalue, int pvalue_length \
TSRMLS_DC); PHP_SOLR_API int solr_add_arg_list_param(zval *objptr, solr_char_t \
*pname, int pname_length, solr_char_t *pvalue, int pvalue_length, solr_char_t \
*avalue, int avalue_length, solr_char_t delimiter, solr_char_t arg_separator \
TSRMLS_DC); PHP_SOLR_API int solr_add_arg_list_param_ex(zval *objptr, solr_char_t \
*pname, int pname_length, solr_char_t *pvalue, int pvalue_length, solr_char_t \
*avalue, int avalue_length, solr_char_t delimiter, solr_char_t arg_separator, \
solr_char_t delimiter_override TSRMLS_DC);
-PHP_SOLR_API solr_param_value_t* create_parameter_value_arg_list(solr_char_t \
*pvalue, int pvalue_length, solr_char_t *avalue, int avalue_length, solr_char_t \
*delimiter_override TSRMLS_DC); +PHP_SOLR_API solr_param_value_t* \
create_parameter_value_arg_list(solr_char_t *pvalue, int pvalue_length, solr_char_t \
*avalue, int avalue_length, solr_char_t *delimiter_override, solr_bool \
delimiter_overriden TSRMLS_DC);
#define solr_set_normal_param(objptr, pname, pname_length, pvalue, pvalue_length) \
solr_add_or_set_normal_param((objptr), (pname), (pname_length), (pvalue), \
(pvalue_length), 0 TSRMLS_CC) #define solr_add_normal_param(objptr, pname, \
pname_length, pvalue, pvalue_length) solr_add_or_set_normal_param((objptr), (pname), \
(pname_length), (pvalue), (pvalue_length), 1 TSRMLS_CC)
diff --git a/php_solr_dismax_query.c b/php_solr_dismax_query.c
index 41e3f2e..5b08b29 100644
--- a/php_solr_dismax_query.c
+++ b/php_solr_dismax_query.c
@@ -135,7 +135,11 @@ PHP_METHOD(SolrDisMaxQuery, addQueryField) {
solr_char_t *field_name = NULL;
int field_name_len = 0;
int add_result = 0;
+ solr_char_t *delimiter = " ";
+ solr_char_t *separator = "^";
+ solr_char_t *separator_override="";
zval * boost = NULL;
+ int boost_len = 0;
if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|z", &field_name, \
&field_name_len, &boost) == FAILURE) {
@@ -147,9 +151,19 @@ PHP_METHOD(SolrDisMaxQuery, addQueryField) {
{
convert_to_string(boost);
boost_str = Z_STRVAL_P(boost);
+ boost_len = Z_STRLEN_P(boost);
+ add_result = solr_add_arg_list_param(
+ getThis(), pname, pname_len, field_name, field_name_len,
+ boost_str, boost_len, *delimiter, *separator TSRMLS_CC
+ );
+ }else{
+ boost_str = "";
+ add_result = solr_add_arg_list_param_ex(
+ getThis(), pname, pname_len, field_name, field_name_len,
+ boost_str, boost_len, *delimiter, *separator, \
*separator_override TSRMLS_CC + );
}
- add_result = solr_add_arg_list_param(getThis(), pname, pname_len, field_name, \
field_name_len, boost_str, Z_STRLEN_P(boost),' ','^' TSRMLS_CC); if(add_result == \
FAILURE) {
RETURN_NULL();
@@ -194,7 +208,6 @@ PHP_METHOD(SolrDisMaxQuery, addPhraseField)
int add_result = 0;
char * separator = "^";
solr_char_t * delimiter_override = "";
- solr_char_t *boost_slop_chr = NULL;
solr_string_t boost_slop_buffer;
if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sz|z", &field_name, \
&field_name_len, &boost, &slop) == FAILURE) @@ -223,8 +236,8 @@ \
PHP_METHOD(SolrDisMaxQuery, addPhraseField)
solr_string_appends(&boost_slop_buffer, boost_str , Z_STRLEN_P(boost));
add_result = solr_add_arg_list_param_ex(
getThis(), pname, pname_len, field_name, field_name_len,
- boost_slop_buffer.str, boost_slop_buffer.len,' ',*separator, \
*delimiter_override
- TSRMLS_CC
+ boost_slop_buffer.str, boost_slop_buffer.len, ' ', *separator,
+ *delimiter_override TSRMLS_CC
);
solr_string_free(&boost_slop_buffer);
@@ -235,7 +248,7 @@ PHP_METHOD(SolrDisMaxQuery, addPhraseField)
TSRMLS_CC
);
}
-//
+
if(add_result == FAILURE)
{
RETURN_NULL();
diff --git a/solr_functions_params.c b/solr_functions_params.c
index 97b07b7..d82696d 100644
--- a/solr_functions_params.c
+++ b/solr_functions_params.c
@@ -367,12 +367,12 @@ PHP_SOLR_API int solr_add_arg_list_param(zval *objptr, \
solr_char_t *pname, int p return FAILURE;
}
- if (!avalue_length)
- {
- solr_throw_exception_ex(solr_ce_SolrIllegalArgumentException, SOLR_ERROR_4000 \
TSRMLS_CC, SOLR_FILE_LINE_FUNC, "Invalid argument value");
-
- return FAILURE;
- }
+// if (!avalue_length)
+// {
+// solr_throw_exception_ex(solr_ce_SolrIllegalArgumentException, SOLR_ERROR_4000 \
TSRMLS_CC, SOLR_FILE_LINE_FUNC, "Invalid argument value"); +//
+// return FAILURE;
+// }
if (solr_fetch_params_entry(objptr, &solr_params TSRMLS_CC) == FAILURE) {
@@ -385,7 +385,7 @@ PHP_SOLR_API int solr_add_arg_list_param(zval *objptr, \
solr_char_t *pname, int p /* if parameter exists add the new value \
argument(param_value) */ if (zend_hash_find(params, pname, pname_length, (void **) \
¶m_ptr) == SUCCESS) {
- parameter_value = create_parameter_value_arg_list(pvalue, pvalue_length, \
avalue, avalue_length, "" TSRMLS_CC); + parameter_value = \
create_parameter_value_arg_list(pvalue, pvalue_length, avalue, avalue_length, "", 0 \
TSRMLS_CC);
solr_params_insert_param_value((*param_ptr), parameter_value);
@@ -393,7 +393,7 @@ PHP_SOLR_API int solr_add_arg_list_param(zval *objptr, \
solr_char_t *pname, int p }
param = solr_create_new_param(pname, pname_length, param_type, allow_multiple, \
solr_arg_list_param_value_equal, (solr_param_fetch_func_t) \
solr_arg_list_param_value_fetch, solr_arg_list_param_value_free, delimiter, \
arg_separator TSRMLS_CC);
- parameter_value = create_parameter_value_arg_list(pvalue, pvalue_length, avalue, \
avalue_length, (solr_char_t*)"" TSRMLS_CC); + parameter_value = \
create_parameter_value_arg_list(pvalue, pvalue_length, avalue, avalue_length, \
(solr_char_t*)"", 0 TSRMLS_CC); solr_params_insert_param_value(param, \
parameter_value);
if (zend_hash_add(params, pname, pname_length, (void *) ¶m, sizeof(solr_param_t \
*), (void **) NULL) == FAILURE) { @@ -407,7 +407,7 @@ PHP_SOLR_API int \
solr_add_arg_list_param(zval *objptr, solr_char_t *pname, int p }
/* }}} */
-PHP_SOLR_API solr_param_value_t* create_parameter_value_arg_list(solr_char_t \
*pvalue, int pvalue_length, solr_char_t *avalue, int avalue_length, solr_char_t \
*delimiter_override TSRMLS_DC) +PHP_SOLR_API solr_param_value_t* \
create_parameter_value_arg_list(solr_char_t *pvalue, int pvalue_length, solr_char_t \
*avalue, int avalue_length, solr_char_t *delimiter_override, solr_bool \
delimiter_overriden TSRMLS_DC) {
solr_param_value_t *parameter_value = NULL;
@@ -418,8 +418,9 @@ PHP_SOLR_API solr_param_value_t* \
create_parameter_value_arg_list(solr_char_t *pv
solr_string_appends(&(parameter_value->contents.arg_list.arg), avalue, \
avalue_length);
- if(strlen(delimiter_override) > 0){
+ if(delimiter_overriden){
parameter_value->contents.arg_list.delimiter_override = \
solr_strndup(delimiter_override, sizeof(delimiter_override)); + \
parameter_value->contents.arg_list.delimiter_overriden = delimiter_overriden; }
return parameter_value;
@@ -449,12 +450,12 @@ PHP_SOLR_API int solr_add_arg_list_param_ex(zval *objptr, \
solr_char_t *pname, in return FAILURE;
}
- if (!avalue_length)
- {
- solr_throw_exception_ex(solr_ce_SolrIllegalArgumentException, \
SOLR_ERROR_4000 TSRMLS_CC, SOLR_FILE_LINE_FUNC, "Invalid argument \
value");
-
- return FAILURE;
- }
+// if (!avalue_length)
+// {
+// solr_throw_exception_ex(solr_ce_SolrIllegalArgumentException, \
SOLR_ERROR_4000 TSRMLS_CC, SOLR_FILE_LINE_FUNC, "Invalid argument value"); +//
+// return FAILURE;
+// }
if (solr_fetch_params_entry(objptr, &solr_params TSRMLS_CC) == FAILURE) {
@@ -467,7 +468,7 @@ PHP_SOLR_API int solr_add_arg_list_param_ex(zval *objptr, \
solr_char_t *pname, in /* if parameter exists add the new value \
argument(param_value) */
if (zend_hash_find(params, pname, pname_length, (void **) ¶m_ptr) == \
SUCCESS) {
- parameter_value = create_parameter_value_arg_list(pvalue, pvalue_length, \
avalue, avalue_length, &delimiter_override TSRMLS_CC); + parameter_value = \
create_parameter_value_arg_list(pvalue, pvalue_length, avalue, avalue_length, \
&delimiter_override, 1 TSRMLS_CC);
solr_params_insert_param_value((*param_ptr), parameter_value);
@@ -475,7 +476,7 @@ PHP_SOLR_API int solr_add_arg_list_param_ex(zval *objptr, \
solr_char_t *pname, in }
param = solr_create_new_param(pname, pname_length, param_type, allow_multiple, \
solr_arg_list_param_value_equal, (solr_param_fetch_func_t) \
solr_arg_list_param_value_fetch, solr_arg_list_param_value_free, delimiter, \
arg_separator TSRMLS_CC);
- parameter_value = create_parameter_value_arg_list(pvalue, pvalue_length, avalue, \
avalue_length, &delimiter_override TSRMLS_CC); + parameter_value = \
create_parameter_value_arg_list(pvalue, pvalue_length, avalue, avalue_length, \
&delimiter_override, 1 TSRMLS_CC); solr_params_insert_param_value(param, \
parameter_value);
if (zend_hash_add(params, pname, pname_length, (void *) ¶m, \
sizeof(solr_param_t *), (void **) NULL) == FAILURE) { @@ -948,9 +949,12 @@ \
PHP_SOLR_API void solr_arg_list_param_value_tostring(solr_param_t *solr_param, s {
solr_string_append_solr_string(&tmp_buffer, \
&(current_ptr->contents.arg_list.value));
- if(current_ptr->contents.arg_list.delimiter_override != NULL && \
strlen(current_ptr->contents.arg_list.delimiter_override) > 0) \
+ if(current_ptr->contents.arg_list.delimiter_overriden) {
- solr_string_appendc(&tmp_buffer, \
(*current_ptr->contents.arg_list.delimiter_override)); + \
if(strlen(current_ptr->contents.arg_list.delimiter_override) > 0) + {
+ solr_string_appendc(&tmp_buffer, \
(*current_ptr->contents.arg_list.delimiter_override)); + }
}else{
solr_string_appendc(&tmp_buffer, separator);
}
@@ -966,12 +970,16 @@ PHP_SOLR_API void \
solr_arg_list_param_value_tostring(solr_param_t *solr_param, s /* process last \
parameter value */ solr_string_append_solr_string(&tmp_buffer, \
&(current_ptr->contents.arg_list.value)); /* check for separator override */
- if(current_ptr->contents.arg_list.delimiter_override != NULL && \
strlen(current_ptr->contents.arg_list.delimiter_override) > 0) \
+ if(current_ptr->contents.arg_list.delimiter_overriden) {
- solr_string_appendc(&tmp_buffer, \
(*current_ptr->contents.arg_list.delimiter_override)); + \
if(strlen(current_ptr->contents.arg_list.delimiter_override) > 0) + {
+ solr_string_appendc(&tmp_buffer, \
(*current_ptr->contents.arg_list.delimiter_override)); + }
}else{
solr_string_appendc(&tmp_buffer, separator);
}
+
solr_string_append_solr_string(&tmp_buffer, &(current_ptr->contents.arg_list.arg));
if (url_encode)
diff --git a/solr_types.h b/solr_types.h
index 2a69a5d..67e81b3 100644
--- a/solr_types.h
+++ b/solr_types.h
@@ -309,6 +309,8 @@ typedef struct
solr_char_t *delimiter_override; /* overrides the arg_list delimiter for this \
particular argument */
+ solr_bool delimiter_overriden; /* is delimiter overriden */
+
} solr_arg_list_value_t;
typedef union
diff --git a/tests/110.solrdismaxquery.phpt b/tests/110.solrdismaxquery.phpt
new file mode 100644
index 0000000..ff06e98
--- /dev/null
+++ b/tests/110.solrdismaxquery.phpt
@@ -0,0 +1,44 @@
+--TEST--
+SolrDisMaxQuery - Methods
+--FILE--
+<?php
+
+$dismaxQuery = new SolrDisMaxQuery("lucene");
+$dismaxQuery
+->addPhraseField('source', 55)
+->addPhraseField('cat', 3, 1)
+->addPhraseField('third', 4, 1)
+->removePhraseField('third')
+->addPhraseField('fourth', 0.5)
+->addPhraseField('fifth',5.2, 7.8)
+->setQueryAlt('*:*')
+->addQueryField("price")
+->addQueryField("location", 4)
+->setPhraseSlop(2)
+->setQueryPhraseSlop(3)
+->setTieBreaker(0.5)
+->setMinimumMatch(2)
+;
+echo $dismaxQuery.PHP_EOL;
+$dismaxQuery = new SolrDisMaxQuery("lucene");
+$dismaxQuery
+->addQueryField("location", 4)
+->addQueryField("price")
+->addQueryField("sku")
+->addQueryField("title",3.4)
+->addPhraseField('cat', 3, 1)
+->addPhraseField('third', 4, 1)
+->addPhraseField('source', 55)
+;
+echo $dismaxQuery;
+
+$dismaxQuery = new SolrDisMaxQuery("lucene");
+$dismaxQuery
+->addPhraseField('cat', 3, 1)
+->addPhraseField('manufacturer', 4, 1)
+->addPhraseField('source', 55);
+echo $dismaxQuery;
+?>
+--EXPECTF--
+q=lucene&defType=dismax&pf=source^55 cat~1^3 fourth^0.5 \
fifth~7.8^5.2&q.alt=*:*&qf=price location^4&ps=2&qs=3&tie=0.5&mm=2 \
+q=lucene&defType=dismax&qf=location^4 price sku title^3.4&pf=cat~1^3 third~1^4 \
source^55 \ No newline at end of file
--
PECL CVS Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic