@@ -133,6 +133,8 @@ static int hash_transformer(void *context, struct cfl_variant *value)
133133
134134 value -> type = CFL_VARIANT_STRING ;
135135 value -> data .as_string = encoded_hash ;
136+ value -> referenced = CFL_FALSE ;
137+
136138 cfl_variant_size_set (value , cfl_sds_len (encoded_hash ));
137139
138140 return FLB_TRUE ;
@@ -164,12 +166,13 @@ int cfl_variant_convert(struct cfl_variant *input_value,
164166 int output_type )
165167{
166168 int ret ;
169+ int errno_backup ;
167170 int64_t as_int ;
168- char buf [64 ];
169171 double as_double ;
170- char * converstion_canary ;
172+ char buf [64 ];
173+ char * str = NULL ;
174+ char * converstion_canary = NULL ;
171175 struct cfl_variant * tmp = NULL ;
172- int errno_backup ;
173176
174177 errno_backup = errno ;
175178
@@ -190,34 +193,78 @@ int cfl_variant_convert(struct cfl_variant *input_value,
190193 else if (output_type == CFL_VARIANT_BOOL ) {
191194 as_int = CFL_FALSE ;
192195
193- if (strcasecmp (input_value -> data .as_string , "true" ) == 0 ) {
196+ if (cfl_variant_size_get (input_value ) == 4 &&
197+ strncasecmp (input_value -> data .as_string , "true" , 4 ) == 0 ) {
194198 as_int = CFL_TRUE ;
195199 }
196- else if (strcasecmp (input_value -> data .as_string , "false" ) == 0 ) {
200+ else if (cfl_variant_size_get (input_value ) == 5 &&
201+ strncasecmp (input_value -> data .as_string , "false" , 5 ) == 0 ) {
197202 as_int = CFL_FALSE ;
198203 }
199204
200205 tmp = cfl_variant_create_from_bool (as_int );
201206 }
202207 else if (output_type == CFL_VARIANT_INT ) {
203208 errno = 0 ;
204- as_int = strtoimax (input_value -> data .as_string , & converstion_canary , 10 );
209+
210+ if (input_value -> referenced ) {
211+ tmp = cfl_variant_create_from_string_s (input_value -> data .as_string ,
212+ cfl_variant_size_get (input_value ),
213+ CFL_FALSE );
214+ if (!tmp ) {
215+ return CFL_FALSE ;
216+ }
217+ str = tmp -> data .as_string ;
218+ }
219+ else {
220+ str = input_value -> data .as_string ;
221+ }
222+
223+ as_int = strtoimax (str , & converstion_canary , 10 );
205224 if (errno == ERANGE || errno == EINVAL ) {
206225 errno = errno_backup ;
226+ if (tmp ) {
227+ cfl_variant_destroy (tmp );
228+ }
207229 return CFL_FALSE ;
208230 }
209231
232+ if (tmp ) {
233+ cfl_variant_destroy (tmp );
234+ }
235+
210236 tmp = cfl_variant_create_from_int64 (as_int );
211237 }
212238 else if (output_type == CFL_VARIANT_DOUBLE ) {
213239 errno = 0 ;
214240 converstion_canary = NULL ;
215- as_double = strtod (input_value -> data .as_string , & converstion_canary );
241+
242+ if (input_value -> referenced ) {
243+ tmp = cfl_variant_create_from_string_s (input_value -> data .as_string ,
244+ cfl_variant_size_get (input_value ),
245+ CFL_FALSE );
246+ if (!tmp ) {
247+ return CFL_FALSE ;
248+ }
249+ str = tmp -> data .as_string ;
250+ }
251+ else {
252+ str = input_value -> data .as_string ;
253+ }
254+
255+ as_double = strtod (str , & converstion_canary );
216256 if (errno == ERANGE ) {
217257 errno = errno_backup ;
258+ if (tmp ) {
259+ cfl_variant_destroy (tmp );
260+ }
218261 return CFL_FALSE ;
219262 }
220263
264+ if (tmp ) {
265+ cfl_variant_destroy (tmp );
266+ }
267+
221268 if (as_double == 0 && converstion_canary == input_value -> data .as_string ) {
222269 errno = errno_backup ;
223270 return CFL_FALSE ;
0 commit comments