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);