return text;
}
+/* free_result(s_var**, number)
+ *
+ * Clean-up the 'result' variable from rrdcgiReadVariables() properly.
+ * We can safely call free() on result[i]->{name,value} because they are
+ * memset() to 0 after their allocation.
+ */
+static void free_result(s_var **result, int number)
+{
+ int i;
+
+ for(i = 0; i < number; i++) {
+ if (result && result[i]) {
+ free(result[i]->name);
+ free(result[i]->value);
+ free(result[i]);
+ }
+ }
+ free(result);
+}
+
/* rrdcgiReadVariables()
*
* Read from stdin if no string is provided via CGI. Variables that
length = atoi(ip);
if ((line = (char *) malloc(length + 2)) == NULL)
return NULL;
- if (fgets(line, length + 1, stdin) == NULL)
+ if (fgets(line, length + 1, stdin) == NULL) {
+ free(line);
return NULL;
+ }
} else
return NULL;
} else if (cp && !strcmp(cp, "GET")) {
return NULL;
strncat(line, tmp, tmplen);
} else {
+ /* clean-up the storage allocated in previous iteration */
+ if (line)
+ free(line);
+
if ((line = strdup(tmp)) == NULL)
return NULL;
}
(size_t) (esp - cp))); k++);
if (k == i) { /* No such variable yet */
- if ((result[i] = (s_var *) malloc(sizeof(s_var))) == NULL)
+ if ((result[i] = (s_var *) malloc(sizeof(s_var))) == NULL) {
+ free_result(result, i);
+ free(line);
return NULL;
+ }
if ((result[i]->name =
- (char *) malloc((esp - cp + 1) * sizeof(char))) == NULL)
+ (char *) malloc((esp - cp + 1) * sizeof(char))) == NULL) {
+ free_result(result, i);
+ free(line);
return NULL;
+ }
memset(result[i]->name, 0, esp - cp + 1);
strncpy(result[i]->name, cp, esp - cp);
cp = ++esp;
if ((result[i]->value =
- (char *) malloc((ip - esp + 1) * sizeof(char))) == NULL)
+ (char *) malloc((ip - esp + 1) * sizeof(char))) == NULL) {
+ free_result(result, i);
+ free(line);
return NULL;
+ }
memset(result[i]->value, 0, ip - esp + 1);
strncpy(result[i]->value, cp, ip - esp);
result[i]->value = rrdcgiDecodeString(result[i]->value);
} else { /* There is already such a name, suppose a multiple field */
cp = ++esp;
len = strlen(result[k]->value) + (ip - esp) + 2;
- if ((sptr = (char *) calloc(len, sizeof(char))) == NULL)
+ if ((sptr = (char *) calloc(len, sizeof(char))) == NULL) {
+ free_result(result, i);
+ free(line);
return NULL;
+ }
snprintf(sptr, len, "%s\n%s", result[k]->value, cp);
free(result[k]->value);
result[k]->value = rrdcgiDecodeString(sptr);