diff --git a/src/libpcp_web/src/batons.c b/src/libpcp_web/src/batons.c index c2cb3c60f82..6ff3efc8484 100644 --- a/src/libpcp_web/src/batons.c +++ b/src/libpcp_web/src/batons.c @@ -128,13 +128,25 @@ seriesPassBaton(seriesBatonPhase **head, void *arg, const char *caller) seriesBatonPhase *next; seriesBatonMagic *baton = (seriesBatonMagic *)arg; + if (baton == NULL) { + pmNotifyErr(LOG_ERR, "%s: NULL baton from %s\n", __FUNCTION__, caller); + return; + } + if (head == NULL) { + pmNotifyErr(LOG_ERR, "%s: NULL baton from %s\n", __FUNCTION__, caller); + return; + } + if (UNLIKELY(baton->traced || pmDebugOptions.series)) { fprintf(stderr, "Baton [%s/%p] references: %u -> %u (@ %s[%s])\n", magic_str(baton), baton, baton->refcount, baton->refcount - 1, caller, "seriesPassBaton"); } - assert(baton->refcount); + if (baton->refcount == 0) { + pmNotifyErr(LOG_ERR, "%s: refcount is 0 from %s\n", __FUNCTION__, caller); + return; + } if (--baton->refcount > 0) { /* phase still in-progress so no more to do */ diff --git a/src/libpcp_web/src/discover.c b/src/libpcp_web/src/discover.c index 99a04617074..d44e9ef972c 100644 --- a/src/libpcp_web/src/discover.c +++ b/src/libpcp_web/src/discover.c @@ -123,6 +123,13 @@ pmDiscoverLookupAdd(const char *fullpath, pmDiscoverModule *module, void *arg) h->context.name = name; h->metavol = sdsempty(); h->datavol = sdsempty(); + if (h->metavol == NULL || h->datavol == NULL) { + sdsfree(h->metavol); + sdsfree(h->datavol); + sdsfree(name); + free(h); + return NULL; + } h->module = module; h->data = arg; if (p == NULL) @@ -297,6 +304,12 @@ pmDiscoverArchives(const char *dir, pmDiscoverModule *module, void *arg) * if this is a newly discovered archive or directory */ a = pmDiscoverLookupAdd(dir, module, arg); + if (a == NULL) { + if (pmDebugOptions.discovery) + fprintf(stderr, "%s: pmDiscoverLookupAdd failed for %s\n", + __FUNCTION__, dir); + return -ENOMEM; + } a->flags |= DISCOVER_FLAGS_DIRECTORY; if ((dirp = opendir(dir)) == NULL) { @@ -332,6 +345,12 @@ pmDiscoverArchives(const char *dir, pmDiscoverModule *module, void *arg) */ *suffix = '\0'; /* strip suffix from path giving archive name */ a = pmDiscoverLookupAdd(path, module, arg); + if (a == NULL) { + if (pmDebugOptions.discovery) + fprintf(stderr, "%s: pmDiscoverLookupAdd failed for %s\n", + __FUNCTION__, path); + continue; + } /* * note: pmDiscoverLookupAdd sets DISCOVER_FLAGS_NEW diff --git a/src/libpcp_web/src/load.c b/src/libpcp_web/src/load.c index 30ece97f7d9..eac565d43e3 100644 --- a/src/libpcp_web/src/load.c +++ b/src/libpcp_web/src/load.c @@ -1164,6 +1164,10 @@ freeSeriesLoadBaton(seriesLoadBaton *baton) void doneSeriesLoadBaton(seriesLoadBaton *baton, const char *caller) { + if (baton == NULL) { + pmNotifyErr(LOG_ERR, "%s: NULL baton from %s\n", __FUNCTION__, caller); + return; + } seriesPassBaton(&baton->current, baton, caller); } @@ -1310,7 +1314,7 @@ void pmSeriesDiscoverClosed(pmDiscoverEvent *event, void *arg) { pmDiscover *p = (pmDiscover *)event->data; - seriesLoadBaton *baton = p->baton; + seriesLoadBaton *baton = p ? p->baton : NULL; (void)arg;