[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 **) \
&param_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 *) &param, 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 **) &param_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 *) &param, \
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