properly escape names before sending them to backends
Costa Tsaousis (ktsaou) committed
Jul 8, 2017 at 01:18 UTC
c297ed5afbdc928483ab09d9cae5933c48a3c25d
1 file changed
+42
-8
src/backends.c
+42
-8
@@ -31,6 +31,20 @@ int backend_send_names = 1;
31
// ----------------------------------------------------------------------------
32
// helper functions for backends
33
34
+static inline size_t backend_name_copy(char *d, const char *s, size_t usable) {
35
+ size_t n;
36
+
37
+ for(n = 0; *s && n < usable ; d++, s++, n++) {
38
+ char c = *s;
39
+
40
+ if(!isalnum(c)) *d = '_';
41
+ else *d = c;
42
+ }
43
+ *d = '\0';
44
+
45
+ return n;
46
+}
47
+
48
// calculate the SUM or AVERAGE of a dimension, for any timeframe
49
// may return NAN if the database does not have any value in the give timeframe
50
@@ -157,13 +171,18 @@ static inline int format_dimension_collected_graphite_plaintext(
171
(void)before;
172
(void)options;
173
174
+ char chart_name[RRD_ID_LENGTH_MAX + 1];
175
+ char dimension_name[RRD_ID_LENGTH_MAX + 1];
176
+ backend_name_copy(chart_name, (backend_send_names && st->name)?st->name:st->id, RRD_ID_LENGTH_MAX);
177
+ backend_name_copy(dimension_name, (backend_send_names && rd->name)?rd->name:rd->id, RRD_ID_LENGTH_MAX);
178
+
179
buffer_sprintf(
180
b
181
, "%s.%s.%s.%s " COLLECTED_NUMBER_FORMAT " %u\n"
182
, prefix
183
, hostname
165
- , (backend_send_names && st->name)?st->name:st->id
166
- , (backend_send_names && rd->name)?rd->name:rd->id
184
+ , chart_name
185
+ , dimension_name
186
, rd->last_collected_value
187
, (uint32_t)rd->last_collected_time.tv_sec
188
);
@@ -184,6 +203,11 @@ static inline int format_dimension_stored_graphite_plaintext(
203
) {
204
(void)host;
205
206
+ char chart_name[RRD_ID_LENGTH_MAX + 1];
207
+ char dimension_name[RRD_ID_LENGTH_MAX + 1];
208
+ backend_name_copy(chart_name, (backend_send_names && st->name)?st->name:st->id, RRD_ID_LENGTH_MAX);
209
+ backend_name_copy(dimension_name, (backend_send_names && rd->name)?rd->name:rd->id, RRD_ID_LENGTH_MAX);
210
+
211
calculated_number value = backend_calculate_value_from_stored_data(st, rd, after, before, options);
212
213
if(!isnan(value)) {
@@ -193,8 +217,8 @@ static inline int format_dimension_stored_graphite_plaintext(
217
, "%s.%s.%s.%s " CALCULATED_NUMBER_FORMAT " %u\n"
218
, prefix
219
, hostname
196
- , (backend_send_names && st->name)?st->name:st->id
197
- , (backend_send_names && rd->name)?rd->name:rd->id
220
+ , chart_name
221
+ , dimension_name
222
, value
223
, (uint32_t) before
224
);
@@ -228,12 +252,17 @@ static inline int format_dimension_collected_opentsdb_telnet(
252
(void)before;
253
(void)options;
254
255
+ char chart_name[RRD_ID_LENGTH_MAX + 1];
256
+ char dimension_name[RRD_ID_LENGTH_MAX + 1];
257
+ backend_name_copy(chart_name, (backend_send_names && st->name)?st->name:st->id, RRD_ID_LENGTH_MAX);
258
+ backend_name_copy(dimension_name, (backend_send_names && rd->name)?rd->name:rd->id, RRD_ID_LENGTH_MAX);
259
+
260
buffer_sprintf(
261
b
262
, "put %s.%s.%s %u " COLLECTED_NUMBER_FORMAT " host=%s%s%s\n"
263
, prefix
235
- , (backend_send_names && st->name)?st->name:st->id
236
- , (backend_send_names && rd->name)?rd->name:rd->id
264
+ , chart_name
265
+ , dimension_name
266
, (uint32_t)rd->last_collected_time.tv_sec
267
, rd->last_collected_value
268
, hostname
@@ -259,14 +288,19 @@ static inline int format_dimension_stored_opentsdb_telnet(
288
289
calculated_number value = backend_calculate_value_from_stored_data(st, rd, after, before, options);
290
291
+ char chart_name[RRD_ID_LENGTH_MAX + 1];
292
+ char dimension_name[RRD_ID_LENGTH_MAX + 1];
293
+ backend_name_copy(chart_name, (backend_send_names && st->name)?st->name:st->id, RRD_ID_LENGTH_MAX);
294
+ backend_name_copy(dimension_name, (backend_send_names && rd->name)?rd->name:rd->id, RRD_ID_LENGTH_MAX);
295
+
296
if(!isnan(value)) {
297
298
buffer_sprintf(
299
b
300
, "put %s.%s.%s %u " CALCULATED_NUMBER_FORMAT " host=%s%s%s\n"
301
, prefix
268
- , (backend_send_names && st->name)?st->name:st->id
269
- , (backend_send_names && rd->name)?rd->name:rd->id
302
+ , chart_name
303
+ , dimension_name
304
, (uint32_t) before
305
, value
306
, hostname