@cryptotaxi247 / netdata-1 / commits / cf3cb72c9

optimization of rrdset_strncpy_name() and avoid truncating the last character when the buffer is full; fixes #424

Costa Tsaousis (ktsaou) committed May 18, 2016 at 22:06 UTC cf3cb72c95d80f8a07e5e2b27efb5b40d6f117a6
2 files changed +14 -11
src/rrd.c
+13 -10
@@ -235,15 +235,18 @@ const char *rrddim_algorithm_name(int chart_type)
235 // ----------------------------------------------------------------------------
236 // chart names
237
238 -char *rrdset_strncpy_name(char *to, const char *from, int length)
238 +char *rrdset_strncpyz_name(char *to, const char *from, size_t length)
239 {
240 - int i;
241 - for(i = 0; i < length && from[i] ;i++) {
242 - if(from[i] == '.' || isalpha(from[i]) || isdigit(from[i])) to[i] = from[i];
243 - else to[i] = '_';
240 + char c, *p = to;
241 +
242 + while (length-- && (c = *from++)) {
243 + if(c != '.' && !isalnum(c))
244 + c = '_';
245 +
246 + *p++ = c;
247 }
245 - if(i < length) to[i] = '\0';
246 - to[length - 1] = '\0';
248 +
249 + *p = '\0';
250
251 return to;
252 }
@@ -258,7 +261,7 @@ void rrdset_set_name(RRDSET *st, const char *name)
261 char n[RRD_ID_LENGTH_MAX + 1];
262
263 snprintfz(n, RRD_ID_LENGTH_MAX, "%s.%s", st->type, name);
261 - rrdset_strncpy_name(b, n, CONFIG_MAX_VALUE);
264 + rrdset_strncpyz_name(b, n, CONFIG_MAX_VALUE);
265 st->name = config_get(st->id, "name", b);
266 st->hash_name = simple_hash(st->name);
267
@@ -277,7 +280,7 @@ char *rrdset_cache_dir(const char *id)
280
281 char b[FILENAME_MAX + 1];
282 char n[FILENAME_MAX + 1];
280 - rrdset_strncpy_name(b, id, FILENAME_MAX);
283 + rrdset_strncpyz_name(b, id, FILENAME_MAX);
284
285 snprintfz(n, FILENAME_MAX, "%s/%s", cache_dir, b);
286 ret = config_get(id, "cache directory", n);
@@ -468,7 +471,7 @@ RRDDIM *rrddim_add(RRDSET *st, const char *id, const char *name, long multiplier
471
472 debug(D_RRD_CALLS, "Adding dimension '%s/%s'.", st->id, id);
473
471 - rrdset_strncpy_name(filename, id, FILENAME_MAX);
474 + rrdset_strncpyz_name(filename, id, FILENAME_MAX);
475 snprintfz(fullfilename, FILENAME_MAX, "%s/%s.db", st->cache_dir, filename);
476 if(rrd_memory_mode != RRD_MEMORY_MODE_RAM) rd = (RRDDIM *)mymmap(fullfilename, size, ((rrd_memory_mode == RRD_MEMORY_MODE_MAP)?MAP_SHARED:MAP_PRIVATE), 1);
477 if(rd) {
src/rrd.h
+1 -1
@@ -257,7 +257,7 @@ extern pthread_rwlock_t rrdset_root_rwlock;
257 // ----------------------------------------------------------------------------
258 // RRD SET functions
259
260 -extern char *rrdset_strncpy_name(char *to, const char *from, int length);
260 +extern char *rrdset_strncpyz_name(char *to, const char *from, size_t length);
261 extern void rrdset_set_name(RRDSET *st, const char *name);
262
263 extern char *rrdset_cache_dir(const char *id);