On Tue, Dec 02, 2025 at 03:52:11PM +0300, Alexander Mukhin wrote:
> >Synopsis:    ldpd dumps core on exit
> >Category:    user
> >Environment:
>       System      : OpenBSD 7.8
>       Details     : OpenBSD 7.8 (GENERIC) #54: Sun Oct 12 12:45:58 MDT 2025
>                        
> [email protected]:/usr/src/sys/arch/amd64/compile/GENERIC
> 
>       Architecture: OpenBSD.amd64
>       Machine     : amd64
> >Description:
>       ldpd dumps core on exit
> >How-To-Repeat:
>       # cat ldpd.conf
>       address-family ipv4 {
>               interface vio1
>       }
>       # ldpd -d -v -f ldpd.conf
>       startup
>       <...>
>       ^C
>       <...>
>       Segmentation fault (core dumped)
> >Fix:
>       In ldpd_shutdown() call kr_shutdown() before closing pipes
>       to children.
> 

How about this diff instead? This should prevent kr_shutdown() from
sending imsgs. Which is the reason of the fault.

-- 
:wq Claudio


Index: kroute.c
===================================================================
RCS file: /cvs/src/usr.sbin/ldpd/kroute.c,v
diff -u -p -r1.71 kroute.c
--- kroute.c    8 Mar 2023 04:43:13 -0000       1.71
+++ kroute.c    2 Dec 2025 13:42:00 -0000
@@ -103,7 +103,7 @@ static void          kroute_clear(void);
 static __inline int     kif_compare(struct kif_node *, struct kif_node *);
 static struct kif_node *kif_find(unsigned short);
 static struct kif_node *kif_insert(unsigned short);
-static int              kif_remove(struct kif_node *);
+static int              kif_remove(struct kif_node *, int);
 static struct kif_node *kif_update(unsigned short, int, struct if_data *,
                            struct sockaddr_dl *, int *);
 static struct kroute_priority  *kroute_match(int, union ldpd_addr *);
@@ -769,7 +769,6 @@ kroute_clear(void)
        while ((kp = RB_MIN(kroute_tree, &krt)) != NULL) {
                while ((kprio = TAILQ_FIRST(&kp->priorities)) != NULL) {
                        while ((kn = TAILQ_FIRST(&kprio->nexthops)) != NULL) {
-                               kr_redist_remove(&kn->r);
                                kroute_uninstall(kn);
                                TAILQ_REMOVE(&kprio->nexthops, kn, entry);
                                free(kn);
@@ -830,7 +829,7 @@ kif_insert(unsigned short ifindex)
 }
 
 static int
-kif_remove(struct kif_node *kif)
+kif_remove(struct kif_node *kif, int notify)
 {
        struct kif_addr *ka;
 
@@ -840,7 +839,9 @@ kif_remove(struct kif_node *kif)
        }
 
        while ((ka = TAILQ_FIRST(&kif->addrs)) != NULL) {
-               main_imsg_compose_ldpe(IMSG_DELADDR, 0, &ka->a, sizeof(ka->a));
+               if (notify)
+                       main_imsg_compose_ldpe(IMSG_DELADDR, 0, &ka->a,
+                           sizeof(ka->a));
                TAILQ_REMOVE(&kif->addrs, ka, entry);
                free(ka);
        }
@@ -854,7 +855,7 @@ kif_clear(void)
        struct kif_node *kif;
 
        while ((kif = RB_MIN(kif_tree, &kit)) != NULL)
-               kif_remove(kif);
+               kif_remove(kif, 0);
 }
 
 static struct kif_node *
@@ -1152,7 +1153,7 @@ if_announce(void *msg)
        case IFAN_DEPARTURE:
                kif = kif_find(ifan->ifan_index);
                if (kif)
-                       kif_remove(kif);
+                       kif_remove(kif, 1);
                break;
        }
 }

Reply via email to