> Bernard Pidoux <[email protected]> hat am 14. Dezember 2018 um 12:29 geschrieben:
> 
> 
> Hi Ralf,
> 
> While running packet radio network switch ROSE node a kernel panic 
> occurs systematically when opening a Chromium session.
> Hardware is Raspberry Pi and distro is Debian Stretch with 4.14.79-v7+ 
> kernel.
> 
> Kernel panic is related to ax25cmp() when called with a null pointer 
> argument.
> 
> The function from which ax25cmp() gets a NULL pointer is rose_route_frame().
> rose_route_frame() is called by rose_xmit() in the following code 
> sequence :
> 
>          if (!rose_route_frame(skb, NULL)) {
>                  dev_kfree_skb(skb);
>                  stats->tx_errors++;
>                  return NETDEV_TX_OK;
>          }
> 
> The same code structure is present in Net/Rom when nr_xmit() is calling 
> nr_route_frame(skb, NULL)
> However, in this function NULL argument is carefully looked at while 
> this is not the case in rose_route_frame()
> 
> if ((dev = nr_dev_get(nr_dest)) != NULL) {    /* Its for me */
>          if (ax25 == NULL)            /* Its from me */
>              ret = nr_loopback_queue(skb);
>          else
>              ret = nr_rx_frame(skb, dev);
>          dev_put(dev);
>          return ret;
>      }
> 
> Thus I applied the following patch to rose module :
> 
> diff --git a/net/rose/rose_route.c b/net/rose/rose_route.c
> index 452bbb38d943..5474ab3f7093 100644
> --- a/net/rose/rose_route.c
> +++ b/net/rose/rose_route.c
> @@ -865,6 +866,13 @@ int rose_route_frame(struct sk_buff *skb, ax25_cb 
> *ax25)
> 
>          if (skb->len < ROSE_MIN_LEN)
>                  return res;
> +
> +       if (ax25 == NULL) {
> +               res = rose_loopback_queue(skb, NULL);
> +               printk(KERN_WARNING "ROSE: rose_route_frame() NULL 
> ax25_cb indicates an internally generated frame\n");
> +               return res;
> +       }
> +
>          frametype = skb->data[2];
>          lci = ((skb->data[0] << 8) & 0xF00) + ((skb->data[1] << 0) & 
> 0x0FF);
>          if (frametype == ROSE_CALL_REQUEST &&
> 
> After loading new rose.module and reboot, as soon as starting Chromium 
> browser, dmesg dumps :
> 
>     20.623664] NET: Registered protocol family 11
> [   21.159231] mkiss: ax0: Trying crc-smack
> [   23.744977] mkiss: ax0: Trying crc-flexnet
> [   99.788904] ROSE: rose_route_frame() NULL ax25_cb indicates an 
> internally generated frame
> [   99.812015] ROSE: rose_route_frame() NULL ax25_cb indicates an 
> internally generated frame
> [  100.102042] ROSE: rose_route_frame() NULL ax25_cb indicates an 
> internally generated frame
> [  100.672616] ROSE: rose_route_frame() NULL ax25_cb indicates an 
> internally generated frame
> [  100.681703] ROSE: rose_route_frame() NULL ax25_cb indicates an 
> internally generated frame
> [  100.790324] ROSE: rose_route_frame() NULL ax25_cb indicates an 
> internally generated frame
> 
> However at this time, no more kernel panic occurs.
> 
> We thus commit the following patch :
> 
> diff --git a/net/rose/rose_route.c b/net/rose/rose_route.c
> index 452bbb38d943..0d4aa75cf783 100644
> --- a/net/rose/rose_route.c
> +++ b/net/rose/rose_route.c
> @@ -848,6 +847,7 @@ void rose_link_device_down(struct net_device *dev)
> 
>   /*
>    *     Route a frame to an appropriate AX.25 connection.
> + *     a NULL ax25_cb indicates an internally generated frame.
>    */
>   int rose_route_frame(struct sk_buff *skb, ax25_cb *ax25)
>   {
> @@ -865,6 +865,12 @@ int rose_route_frame(struct sk_buff *skb, ax25_cb 
> *ax25)
> 
>          if (skb->len < ROSE_MIN_LEN)
>                  return res;
> +
> +       if (!ax25) {
> +               res = rose_loopback_queue(skb, NULL);
> +               return res;
> +       }
> +


nitpicking:
there is no need to store the result in res.

      if (!ax25)
            return rose_loopback_queue(skb, NULL);


>          frametype = skb->data[2];
>          lci = ((skb->data[0] << 8) & 0xF00) + ((skb->data[1] << 0) & 
> 0x0FF);
>          if (frametype == ROSE_CALL_REQUEST &&
> 
> 
> Signed-off-by: Bernard Pidoux, f6bvp <[email protected]>
> 

Reply via email to