@@ -275,8 +275,8 @@ static int json_interp(struct ulogd_pluginstance *upi)
{
struct json_priv *opi = (struct json_priv *) &upi->private;
unsigned int i;
- char *buf;
- int buflen;
+ char *buf, *tmp;
+ size_t buflen;
json_t *msg;
msg = json_object();
@@ -337,8 +337,6 @@ static int json_interp(struct ulogd_pluginstance *upi)
json_object_set_new(msg, "dvc", json_string(dvc));
}
-
-
for (i = 0; i < upi->input.num_keys; i++) {
struct ulogd_key *key = upi->input.keys[i].u.source;
char *field_name;
@@ -391,7 +389,6 @@ static int json_interp(struct ulogd_pluginstance *upi)
}
}
-
buf = json_dumps(msg, 0);
json_decref(msg);
if (buf == NULL) {
@@ -399,13 +396,15 @@ static int json_interp(struct ulogd_pluginstance *upi)
return ULOGD_IRET_ERR;
}
buflen = strlen(buf);
- buf = realloc(buf, sizeof(char)*(buflen+2));
- if (buf == NULL) {
+ tmp = realloc(buf, buflen + sizeof("\n"));
+ if (tmp == NULL) {
+ free(buf);
ulogd_log(ULOGD_ERROR, "Could not create message\n");
return ULOGD_IRET_ERR;
}
- strncat(buf, "\n", 1);
- buflen++;
+ buf = tmp;
+ buf[buflen++] = '\n';
+ buf[buflen] = '\0';
if (opi->mode == JSON_MODE_FILE)
return json_interp_file(upi, buf);
We have `buflen` available. We can remove `strncat` and assign the characters directly, without traversing the whole buffer. Correct `buflen` type and fix leak if `realloc` fails. Signed-off-by: Jeremy Sowden <jeremy@azazel.net> --- output/ulogd_output_JSON.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-)