Skip to content

Commit 76b99fc

Browse files
committed
processor_content_modifier: use copied values for referenced values when converting
Signed-off-by: Eduardo Silva <[email protected]>
1 parent 8bf039b commit 76b99fc

File tree

1 file changed

+54
-7
lines changed

1 file changed

+54
-7
lines changed

plugins/processor_content_modifier/cm_logs.c

Lines changed: 54 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)