Deleting a container could lead to an attempt NULL-pointer dereference
crashing procd and triggering a reboot of the system.
Properly handle service deletion to avoid that.
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
-static void _service_stopped(struct service *s, bool container);
-
static void
service_delete(struct service *s, bool container)
{
static void
service_delete(struct service *s, bool container)
{
free(s->data);
vlist_flush_all(&s->instances);
s->deleted = true;
free(s->data);
vlist_flush_all(&s->instances);
s->deleted = true;
- _service_stopped(s, container);
if (!s)
return UBUS_STATUS_UNKNOWN_ERROR;
if (!s)
return UBUS_STATUS_UNKNOWN_ERROR;
+ s->container = container;
+
ret = service_update(s, tb, add);
if (ret)
return ret;
ret = service_update(s, tb, add);
if (ret)
return ret;
}
void service_stopped(struct service *s)
}
void service_stopped(struct service *s)
-{
- _service_stopped(s, false);
-}
-
-static void _service_stopped(struct service *s, bool container)
{
if (s->deleted && avl_is_empty(&s->instances.avl)) {
{
if (s->deleted && avl_is_empty(&s->instances.avl)) {
service_event("container.stop", s->name, NULL);
avl_delete(&containers, &s->avl);
} else {
service_event("container.stop", s->name, NULL);
avl_delete(&containers, &s->avl);
} else {
const char *name;
bool deleted;
bool autostart;
const char *name;
bool deleted;
bool autostart;
struct blob_attr *trigger;
struct vlist_tree instances;
struct blob_attr *trigger;
struct vlist_tree instances;