]> git.ipfire.org Git - thirdparty/collectd.git/commitdiff
format_stackdriver: Add proper error handling to `sd_output_reset()`. 4269/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:57:45 +0000 (10:57 +0100)
src/utils/format_stackdriver/format_stackdriver.c
src/utils/format_stackdriver/format_stackdriver.h
src/write_stackdriver.c

index fcb47856621f44251ac595aa62899c8e1fc50394..d9f7683e456ee22e0596c97f5ad4fdba353f3f7a 100644 (file)
@@ -623,15 +623,32 @@ int sd_output_register_metric(sd_output_t *out, data_set_t const *ds,
 
 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 fee260e329c16ad368a4dc420233eae9a288e3c2..62b9306ae2d21d8967b24c2cfbfdd094db27ba18 100644 (file)
@@ -62,7 +62,7 @@ int sd_output_register_metric(sd_output_t *out, data_set_t const *ds,
 
 /* 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 dfa1d7c0785a9db6ff5207f24aaa1b3728ae0b54..9992189b8a9c9bf88fce5d827c17c64ef1b33cfa 100644 (file)
@@ -341,6 +341,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;