summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Fedoryshchenko <denys.f@collabora.com>2026-01-26 00:06:13 +0200
committerDenys Fedoryshchenko <denys.f@collabora.com>2026-02-06 17:34:54 +0200
commit7ad4f3974448ddd890664e95b2a17feff3b4f7d3 (patch)
tree6a536697d88cf46a7a70dad0072ba4e89cbbd6a9
parent7cf817907283cf3a6495c6c5a028f5f6651e4f4b (diff)
downloadaccel-ppp-7ad4f3974448ddd890664e95b2a17feff3b4f7d3.tar.gz
accel-ppp-7ad4f3974448ddd890664e95b2a17feff3b4f7d3.zip
ppp: Defend from possible ppp init failure
ppp init might fail due malloc failure, missing or invalid runtime state, failure to setup resources (sockers, timers, handler registration), etc. This is quite unlikely now, but some floating(hard to catch) bugs says better to be safe than sorry. Signed-off-by: Denys Fedoryshchenko <denys.f@collabora.com>
-rw-r--r--accel-pppd/ppp/ppp.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/accel-pppd/ppp/ppp.c b/accel-pppd/ppp/ppp.c
index 571908bb..55d08bb7 100644
--- a/accel-pppd/ppp/ppp.c
+++ b/accel-pppd/ppp/ppp.c
@@ -57,7 +57,7 @@ static mempool_t uc_pool;
static int ppp_chan_read(struct triton_md_handler_t*);
static int ppp_unit_read(struct triton_md_handler_t*);
-static void init_layers(struct ppp_t *);
+static int init_layers(struct ppp_t *);
static void _free_layers(struct ppp_t *);
static void start_first_layer(struct ppp_t *);
static int setup_ppp_mru(struct ppp_t *ppp);
@@ -101,7 +101,8 @@ int __export establish_ppp(struct ppp_t *ppp)
goto exit_close_chan;
}
- init_layers(ppp);
+ if (init_layers(ppp))
+ goto exit_close_chan;
if (list_empty(&ppp->layers)) {
log_ppp_error("no layers to start\n");
goto exit_close_chan;
@@ -670,7 +671,7 @@ void __export ppp_unregister_layer(struct ppp_layer_t *layer)
list_del(&layer->entry);
}
-static void init_layers(struct ppp_t *ppp)
+static int init_layers(struct ppp_t *ppp)
{
struct layer_node_t *n, *n1;
struct ppp_layer_t *l;
@@ -683,12 +684,18 @@ static void init_layers(struct ppp_t *ppp)
list_add_tail(&n1->entry, &ppp->layers);
list_for_each_entry(l, &n->items, entry) {
d = l->init(ppp);
+ if (!d) {
+ log_ppp_error("ppp layer init failed\n");
+ _free_layers(ppp);
+ return -1;
+ }
d->layer = l;
d->started = 0;
d->node = n1;
list_add_tail(&d->entry, &n1->items);
}
}
+ return 0;
}
static void _free_layers(struct ppp_t *ppp)