zfs_arc plugin: Use a buffer with fixed size rather than allocating on the heap.
authorFlorian Forster <octo@collectd.org>
Tue, 4 Jun 2013 06:35:09 +0000 (08:35 +0200)
committerFlorian Forster <octo@collectd.org>
Tue, 4 Jun 2013 06:35:09 +0000 (08:35 +0200)
The key length is very predicable, so buffer length is not a problem.

src/zfs_arc.c

index cd0c841..6bf7dae 100644 (file)
@@ -49,23 +49,19 @@ const char zfs_arcstat[] = "kstat.zfs.misc.arcstats.";
 typedef void kstat_t;
 #endif
 
-static long long get_zfs_value(void * dummy __unused, const char *kstat_value)
+static long long get_zfs_value(kstat_t *dummy __attribute__((unused)),
+               char const *name)
 {
+       char buffer[256];
        long long value;
        size_t valuelen = sizeof(value);
        int rv;
-       char *key;
-
-       key = ssnprintf_alloc("%s%s", zfs_arcstat, kstat_value);
-       if (key != NULL) {
-               if (strlen(key) > 0) {
-                       rv = sysctlbyname(key, (void *)&value, &valuelen, NULL, (size_t)0);
-                       free(key);
-                       if (rv == 0)
-                               return (value);
-               } else
-                       free(key);
-       }
+
+       ssnprintf (buffer, sizeof (buffer), "%s%s", zfs_arcstat, name);
+       rv = sysctlbyname (buffer, (void *) &value, &valuelen,
+                       /* new value = */ NULL, /* new length = */ (size_t) 0);
+       if (rv == 0)
+               return (value);
 
        return (-1);
 }