@@ -3938,8 +3938,8 @@ redis_geoadd_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
39383938 char * mode = NULL ;
39393939 int argc , i ;
39403940
3941- // We at least need a key and one value
3942- if ((argc = ZEND_NUM_ARGS ()) < 5 || argc % 3 != 2 ) {
3941+ // We at least need a key and three values
3942+ if ((argc = ZEND_NUM_ARGS ()) < 4 || ( argc % 3 != 1 && argc % 3 != 2 ) ) {
39433943 zend_wrong_param_count ();
39443944 return FAILURE ;
39453945 }
@@ -3951,13 +3951,14 @@ redis_geoadd_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
39513951 return FAILURE ;
39523952 }
39533953
3954- if (Z_TYPE (z_args [1 ]) != IS_NULL ) {
3955- if (Z_TYPE (z_args [1 ]) != IS_ARRAY ) {
3954+ if (argc % 3 == 2 ) {
3955+ argc -- ;
3956+ if (Z_TYPE (z_args [argc ]) != IS_ARRAY ) {
39563957 php_error_docref (NULL , E_WARNING , "Invalid options value" );
39573958 efree (z_args );
39583959 return FAILURE ;
39593960 }
3960- ZEND_HASH_FOREACH_VAL (Z_ARRVAL (z_args [1 ]), z_ele ) {
3961+ ZEND_HASH_FOREACH_VAL (Z_ARRVAL (z_args [argc ]), z_ele ) {
39613962 ZVAL_DEREF (z_ele );
39623963 if (Z_TYPE_P (z_ele ) == IS_STRING ) {
39633964 if (zend_string_equals_literal_ci (Z_STR_P (z_ele ), "NX" ) ||
@@ -3972,7 +3973,7 @@ redis_geoadd_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
39723973 }
39733974
39743975 /* Initialize our command */
3975- REDIS_CMD_INIT_SSTR_STATIC (& cmdstr , argc - 1 + (mode != NULL ) + ch , "GEOADD" );
3976+ REDIS_CMD_INIT_SSTR_STATIC (& cmdstr , argc + (mode != NULL ) + ch , "GEOADD" );
39763977
39773978 /* Append key */
39783979 zstr = zval_get_string (& z_args [0 ]);
@@ -3986,7 +3987,7 @@ redis_geoadd_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
39863987 REDIS_CMD_APPEND_SSTR_OPT_STATIC (& cmdstr , ch , "CH" );
39873988
39883989 /* Append members */
3989- for (i = 2 ; i < argc ; ++ i ) {
3990+ for (i = 1 ; i < argc ; ++ i ) {
39903991 redis_cmd_append_sstr_zval (& cmdstr , & z_args [i ], redis_sock );
39913992 }
39923993
0 commit comments