Check null transition id and config hash (#15147)
* fix crash when UUID is NULL in SQLite * abstract sqlite3 parsing for uuid and text --------- Co-authored-by: Costa Tsaousis <costa@netdata.cloud>
Stelios Fragkakis committed
Jun 6, 2023 at 11:09 UTC
3f3e9d6ac7be69f2ec5f99ede09fc5e22b9bd38b
1 file changed
+28
-15
database/sqlite/sqlite_aclk_alert.c
+28
-15
@@ -255,6 +255,29 @@ int rrdcalc_status_to_proto_enum(RRDCALC_STATUS status)
255
#endif
256
}
257
258
+static inline char *sqlite3_uuid_unparse_strdupz(sqlite3_stmt *res, int iCol) {
259
+ char uuid_str[UUID_STR_LEN];
260
+
261
+ if(sqlite3_column_type(res, iCol) == SQLITE_NULL)
262
+ uuid_str[0] = '\0';
263
+ else
264
+ uuid_unparse_lower(*((uuid_t *) sqlite3_column_blob(res, iCol)), uuid_str);
265
+
266
+ return strdupz(uuid_str);
267
+}
268
+
269
+static inline char *sqlite3_text_strdupz_empty(sqlite3_stmt *res, int iCol) {
270
+ char *ret;
271
+
272
+ if(sqlite3_column_type(res, iCol) == SQLITE_NULL)
273
+ ret = "";
274
+ else
275
+ ret = (char *)sqlite3_column_text(res, iCol);
276
+
277
+ return strdupz(ret);
278
+}
279
+
280
+
281
void aclk_push_alert_event(struct aclk_sync_host_config *wc)
282
{
283
#ifndef ENABLE_ACLK
@@ -321,7 +344,6 @@ void aclk_push_alert_event(struct aclk_sync_host_config *wc)
344
}
345
}
346
324
- char uuid_str[UUID_STR_LEN];
347
uint64_t first_sequence_id = 0;
348
uint64_t last_sequence_id = 0;
349
static __thread uint64_t log_first_sequence_id = 0;
@@ -343,8 +365,7 @@ void aclk_push_alert_event(struct aclk_sync_host_config *wc)
365
//alarm_log.sequence_id = (uint64_t) sqlite3_column_int64(res, 0);
366
alarm_log.when = (time_t) sqlite3_column_int64(res, 5);
367
346
- uuid_unparse_lower(*((uuid_t *) sqlite3_column_blob(res, 3)), uuid_str);
347
- alarm_log.config_hash = strdupz((char *)uuid_str);
368
+ alarm_log.config_hash = sqlite3_uuid_unparse_strdupz(res, 3);
369
370
alarm_log.utc_offset = wc->host->utc_offset;
371
alarm_log.timezone = strdupz(rrdhost_abbrev_timezone(wc->host));
@@ -387,18 +408,10 @@ void aclk_push_alert_event(struct aclk_sync_host_config *wc)
408
alarm_log.old_value = (NETDATA_DOUBLE) sqlite3_column_double(res, 24);
409
410
alarm_log.updated = (sqlite3_column_int64(res, 8) & HEALTH_ENTRY_FLAG_UPDATED) ? 1 : 0;
390
- alarm_log.rendered_info = sqlite3_column_type(res, 18) == SQLITE_NULL ?
391
- strdupz((char *)"") :
392
- strdupz((char *)sqlite3_column_text(res, 18));
393
-
394
- alarm_log.chart_context = sqlite3_column_type(res, 26) == SQLITE_NULL ?
395
- strdupz((char *)"") :
396
- strdupz((char *)sqlite3_column_text(res, 26));
397
-
398
- uuid_unparse_lower(*((uuid_t *) sqlite3_column_blob(res, 27)), uuid_str);
399
- alarm_log.transition_id = sqlite3_column_type(res, 27) == SQLITE_NULL ?
400
- strdupz((char *)"") :
401
- strdupz((char *)uuid_str);
411
+ alarm_log.rendered_info = sqlite3_text_strdupz_empty(res, 18);
412
+
413
+ alarm_log.chart_context = sqlite3_text_strdupz_empty(res, 26);
414
+ alarm_log.transition_id = sqlite3_uuid_unparse_strdupz(res, 27);
415
416
alarm_log.event_id = (time_t) sqlite3_column_int64(res, 28);
417