>>>>> "richard" == richard  <[EMAIL PROTECTED]> writes:

richard> OK so no-ones wants to answer request for info on how to build the non
richard> standard parts of the mdk kernel.


hi
        will be in 2.4.18-4mdk (3mdk is already in stress-testing).

Later, Juan.

richard> OK rephase and alter the question to:-  who is willing to add a patch to
richard> the current kernel so it dosnt need to be recompiled for use by people
richard> using the ham radio sections.A small patch that dos'nt effect anything
richard> apart from netrom on the ham radio part of the kernel, which in its
richard> current state stops a clean shutdown with an "unregistered netdevice
richard> "error
richard> perhaps this is why the majority of radio hams that are using linux use
richard> SuSE, Debian, Redhat or slackware.
richard> BTW there are a lot of radio hams., a few million !

richard> TIA just in case
richard> -- 
richard> Best regards
richard> Richard Bown


richard> diff -ruN -X dontdiff linux-2.4.18-rc2/net/netrom/af_netrom.c 
linux/net/netrom/af_netrom.c
richard> --- linux-2.4.18-rc2/net/netrom/af_netrom.c    Tue Feb 19 16:06:42 2002
richard> +++ linux/net/netrom/af_netrom.c       Tue Feb 19 16:14:39 2002
richard> @@ -31,7 +31,9 @@
richard> *      NET/ROM 007     Jonathan(G4KLX) New timer architecture.
richard> *                                      Impmented Idle timer.
richard> *                      Arnaldo C. Melo s/suser/capable/, micro cleanups
richard> - *                    Jeroen (PE1RXQ) Use sock_orphan() on release.
richard> + *                    Jeroen(PE1RXQ)  Use sock_orphan() on release.
richard> + *                    Tomi(OH2BNS)    Better frame type checking.
richard> + *                                    Device refcnt fixes.
richard> */
 
richard> #include <linux/config.h>
richard> @@ -128,6 +130,7 @@
 
richard> if ((s = nr_list) == sk) {
richard> nr_list = s->next;
richard> +              dev_put(sk->protinfo.nr->device);
richard> restore_flags(flags);
richard> return;
richard> }
richard> @@ -135,6 +138,7 @@
richard> while (s != NULL && s->next != NULL) {
richard> if (s->next == sk) {
s-> next = sk->next;
richard> +                      dev_put(sk->protinfo.nr->device);
richard> restore_flags(flags);
richard> return;
richard> }
richard> @@ -616,16 +620,20 @@
richard> * Only the super user can set an arbitrary user callsign.
richard> */
richard> if (addr->fsa_ax25.sax25_ndigis == 1) {
richard> -              if (!capable(CAP_NET_BIND_SERVICE))
richard> +              if (!capable(CAP_NET_BIND_SERVICE)) {
richard> +                      dev_put(dev);
richard> return -EACCES;
richard> +              }
sk-> protinfo.nr->user_addr   = addr->fsa_digipeater[0];
sk-> protinfo.nr->source_addr = addr->fsa_ax25.sax25_call;
richard> } else {
richard> source = &addr->fsa_ax25.sax25_call;
 
richard> if ((user = ax25_findbyuid(current->euid)) == NULL) {
richard> -                      if (ax25_uid_policy && !capable(CAP_NET_BIND_SERVICE))
richard> +                      if (ax25_uid_policy && !capable(CAP_NET_BIND_SERVICE)) 
{
richard> +                              dev_put(dev);
richard> return -EPERM;
richard> +                      }
richard> user = source;
richard> }
 
richard> @@ -680,8 +688,10 @@
richard> source = (ax25_address *)dev->dev_addr;
 
richard> if ((user = ax25_findbyuid(current->euid)) == NULL) {
richard> -                      if (ax25_uid_policy && !capable(CAP_NET_ADMIN))
richard> +                      if (ax25_uid_policy && !capable(CAP_NET_ADMIN)) {
richard> +                              dev_put(dev);
richard> return -EPERM;
richard> +                      }
richard> user = source;
richard> }
 
richard> @@ -976,6 +986,8 @@
sk-> ack_backlog++;
make-> pair = sk;
 
richard> +      dev_hold(make->protinfo.nr->device);
richard> +
richard> nr_insert_socket(make);
 
richard> skb_queue_head(&sk->receive_queue, skb);
richard> @@ -1364,7 +1376,6 @@
richard> dev_nr[i].priv = NULL;
richard> unregister_netdev(&dev_nr[i]);
richard> }
richard> -              kfree(dev_nr[i].name);
richard> }
 
richard> kfree(dev_nr);
richard> diff -ruN -X dontdiff linux-2.4.18-rc2/net/netrom/nr_loopback.c 
linux/net/netrom/nr_loopback.c
richard> --- linux-2.4.18-rc2/net/netrom/nr_loopback.c  Thu Jun 28 03:10:55 2001
richard> +++ linux/net/netrom/nr_loopback.c     Tue Feb 19 16:12:35 2002
richard> @@ -85,6 +85,9 @@
richard> if (dev == NULL || nr_rx_frame(skb, dev) == 0)
richard> kfree_skb(skb);
 
richard> +              if (dev != NULL)
richard> +                      dev_put(dev);
richard> +
richard> if (!skb_queue_empty(&loopback_queue) && !nr_loopback_running())
richard> nr_set_loopback_timer();
richard> }
richard> diff -ruN -X dontdiff linux-2.4.18-rc2/net/netrom/nr_route.c 
linux/net/netrom/nr_route.c
richard> --- linux-2.4.18-rc2/net/netrom/nr_route.c     Sat Dec 30 00:44:46 2000
richard> +++ linux/net/netrom/nr_route.c        Tue Feb 19 16:12:35 2002
richard> @@ -19,6 +19,7 @@
richard> *                      Alan Cox(GW4PTS) Added the firewall hooks.
richard> *      NET/ROM 006     Jonathan(G4KLX) Added the setting of digipeated 
neighbours.
richard> *                      Tomi(OH2BNS)    Routing quality and link failure 
changes.
richard> + *                                    Device refcnt fixes.
richard> */
 
richard> #include <linux/errno.h>
richard> @@ -66,11 +67,15 @@
richard> struct nr_node  *nr_node;
richard> struct nr_neigh *nr_neigh;
richard> struct nr_route nr_route;
richard> +      struct net_device *tdev;
richard> unsigned long flags;
richard> int i, found;
 
richard> -      if (nr_dev_get(nr) != NULL)     /* Can't add routes to ourself */
richard> +      /* Can't add routes to ourself */
richard> +      if ((tdev = nr_dev_get(nr)) != NULL) {
richard> +              dev_put(tdev);
richard> return -EINVAL;
richard> +      }
 
richard> for (nr_node = nr_node_list; nr_node != NULL; nr_node = nr_node->next)
richard> if (ax25cmp(nr, &nr_node->callsign) == 0)
richard> @@ -124,6 +129,8 @@
richard> memcpy(nr_neigh->digipeat, ax25_digi, sizeof(ax25_digi));
richard> }
 
richard> +              dev_hold(nr_neigh->dev);
richard> +
richard> save_flags(flags);
richard> cli();
 
richard> @@ -294,6 +301,7 @@
richard> if ((s = nr_neigh_list) == nr_neigh) {
richard> nr_neigh_list = nr_neigh->next;
richard> restore_flags(flags);
richard> +              dev_put(nr_neigh->dev);
richard> if (nr_neigh->digipeat != NULL)
richard> kfree(nr_neigh->digipeat);
richard> kfree(nr_neigh);
richard> @@ -304,6 +312,7 @@
richard> if (s->next == nr_neigh) {
s-> next = nr_neigh->next;
richard> restore_flags(flags);
richard> +                      dev_put(nr_neigh->dev);
richard> if (nr_neigh->digipeat != NULL)
richard> kfree(nr_neigh->digipeat);
richard> kfree(nr_neigh);
richard> @@ -404,6 +413,8 @@
richard> memcpy(nr_neigh->digipeat, ax25_digi, sizeof(ax25_digi));
richard> }
 
richard> +      dev_hold(nr_neigh->dev);
richard> +
richard> save_flags(flags);
richard> cli();
 
richard> @@ -570,6 +581,10 @@
richard> if (first == NULL || strncmp(dev->name, first->name, 3) < 0)
richard> first = dev;
richard> }
richard> +
richard> +      if (first != NULL)
richard> +              dev_hold(first);
richard> +
richard> read_unlock(&dev_base_lock);
 
richard> return first;
richard> @@ -620,6 +635,7 @@
richard> {
richard> struct nr_route_struct nr_route;
richard> struct net_device *dev;
richard> +      int ret;
 
richard> switch (cmd) {
 
richard> @@ -628,23 +644,30 @@
richard> return -EFAULT;
richard> if ((dev = nr_ax25_dev_get(nr_route.device)) == NULL)
richard> return -EINVAL;
richard> -                      if (nr_route.ndigis < 0 || nr_route.ndigis > 
AX25_MAX_DIGIS)
richard> +                      if (nr_route.ndigis < 0 || nr_route.ndigis > 
AX25_MAX_DIGIS) {
richard> +                              dev_put(dev);
richard> return -EINVAL;
richard> +                      }
richard> switch (nr_route.type) {
richard> case NETROM_NODE:
richard> -                                      return nr_add_node(&nr_route.callsign,
richard> +                                      ret = nr_add_node(&nr_route.callsign,
richard> nr_route.mnemonic,
richard> &nr_route.neighbour,
richard> nr_call_to_digi(nr_route.ndigis, nr_route.digipeaters),
richard> dev, nr_route.quality,
richard> nr_route.obs_count);
richard> +                                      break;
richard> case NETROM_NEIGH:
richard> -                                      return nr_add_neigh(&nr_route.callsign,
richard> +                                      ret = nr_add_neigh(&nr_route.callsign,
richard> nr_call_to_digi(nr_route.ndigis, nr_route.digipeaters),
richard> dev, nr_route.quality);
richard> +                                      break;
richard> default:
richard> -                                      return -EINVAL;
richard> +                                      ret = -EINVAL;
richard> +                                      break;
richard> }
richard> +                      dev_put(dev);
richard> +                      return ret;
 
richard> case SIOCDELRT:
richard> if (copy_from_user(&nr_route, arg, sizeof(struct nr_route_struct)))
richard> @@ -653,14 +676,19 @@
richard> return -EINVAL;
richard> switch (nr_route.type) {
richard> case NETROM_NODE:
richard> -                                      return nr_del_node(&nr_route.callsign,
richard> +                                      ret = nr_del_node(&nr_route.callsign,
richard> &nr_route.neighbour, dev);
richard> +                                      break;
richard> case NETROM_NEIGH:
richard> -                                      return nr_del_neigh(&nr_route.callsign,
richard> +                                      ret = nr_del_neigh(&nr_route.callsign,
richard> dev, nr_route.quality);
richard> +                                      break;
richard> default:
richard> -                                      return -EINVAL;
richard> +                                      ret = -EINVAL;
richard> +                                      break;
richard> }
richard> +                      dev_put(dev);
richard> +                      return ret;
 
richard> case SIOCNRDECOBS:
richard> return nr_dec_obs();
richard> @@ -717,10 +745,15 @@
ax25-> ax25_dev->dev, 0, sysctl_netrom_obsolescence_count_initialiser);
 
richard> if ((dev = nr_dev_get(nr_dest)) != NULL) {     /* Its for me */
richard> +              int ret;
richard> +
richard> if (ax25 == NULL)                      /* Its from me */
richard> -                      return nr_loopback_queue(skb);
richard> +                      ret = nr_loopback_queue(skb);
richard> else
richard> -                      return nr_rx_frame(skb, dev);
richard> +                      ret = nr_rx_frame(skb, dev);
richard> +
richard> +              dev_put(dev);
richard> +              return ret;
richard> }
 
richard> if (!sysctl_netrom_routing_control && ax25 != NULL)
richard> @@ -747,6 +780,8 @@
 
nr_neigh-> ax25 = ax25_send_frame(skb, 256, (ax25_address *)dev->dev_addr, 
&nr_neigh->callsign, nr_neigh->digipeat, nr_neigh->dev);
 
richard> +      dev_put(dev);
richard> +
richard> return (nr_neigh->ax25 != NULL);
richard> }
 

-- 
In theory, practice and theory are the same, but in practice they 
are different -- Larry McVoy

Reply via email to