]> git.ipfire.org Git - thirdparty/collectd.git/commitdiff
format_stackdriver: Add proper error handling to `sd_output_reset()`. 4270/head
authorFlorian Forster <octo@collectd.org>
Fri, 2 Feb 2024 09:52:21 +0000 (10:52 +0100)
committerFlorian Forster <octo@collectd.org>
Fri, 2 Feb 2024 09:52:21 +0000 (10:52 +0100)
src/utils/format_stackdriver/format_stackdriver.c
src/utils/format_stackdriver/format_stackdriver.h
src/write_stackdriver.c

index eb0363b587d77216736648a4052fc5730a92ec87..b008ce44b03d7bf2467c69a55157d9963e4f84e5 100644 (file)
@@ -601,15 +601,32 @@ int sd_output_register_metric(sd_output_t *out, metric_t const *m) {
 
 char *sd_output_reset(sd_output_t *out) /* {{{ */
 {
-  sd_output_finalize(out);
+  int err = sd_output_finalize(out);
+  if (err) {
+    goto handle_err;
+  }
 
   unsigned char const *json_buffer = NULL;
-  yajl_gen_get_buf(out->gen, &json_buffer, &(size_t){0});
+  size_t json_buffer_size = 0;
+  err = yajl_gen_get_buf(out->gen, &json_buffer, &json_buffer_size);
+  if (err) {
+    goto handle_err;
+  }
+
   char *ret = strdup((void const *)json_buffer);
+  if (ret == NULL) {
+    err = errno;
+    goto handle_err;
+  }
 
+  /* success */
   reset(out);
-
   return ret;
+
+handle_err:
+  reset(out);
+  errno = err;
+  return NULL;
 } /* }}} char *sd_output_reset */
 
 sd_resource_t *sd_resource_create(char const *type) /* {{{ */
index 1a5979f8b708996002cb55eb9cdb846c84cade3e..557723c436451344db0ba3bf61813c3fe99d8fd4 100644 (file)
@@ -60,7 +60,7 @@ int sd_output_register_metric(sd_output_t *out, metric_t const *m);
 
 /* sd_output_reset resets the output and returns the previous content of the
  * buffer. It is the caller's responsibility to call free() with the returned
- * pointer. */
+ * pointer. On error errno is set and NULL is returned. */
 char *sd_output_reset(sd_output_t *out);
 
 sd_resource_t *sd_resource_create(char const *type);
index 70d69dadf3fe51736566345cd991e8d99f454d03..4d224f61567f670b6914ec7beeeed00f9072ca50 100644 (file)
@@ -342,6 +342,11 @@ static int wg_flush_nolock(cdtime_t timeout, wg_callback_t *cb) /* {{{ */
   }
 
   char *payload = sd_output_reset(cb->formatter);
+  if (payload == NULL) {
+    ERROR("write_stackdriver plugin: sd_output_reset failed: %s", STRERRNO);
+    return errno;
+  }
+
   int status = wg_call_timeseries_write(cb, payload);
   wg_reset_buffer(cb);
   return status;