several returns before unlocking in lmc_ioctl
PATCH 1/1 several returns before unlocking in lmc_ioctl
Several returns before unlocking in lmc_ioctl
---
drivers/net/wan/lmc/lmc_main.c +36 -23
@@ -142,9 +142,10 @@ int lmc_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/* To date internally, just copy this out to the user. */ case LMCIOCGINFO :/*fold01*/ -if (copy_to_user (ifr->ifr_data, &sc->ictl,sizeof (lmc_ctl_t))) -return -EFAULT ; - ret =0 ; +if (copy_to_user (ifr->ifr_data, &sc->ictl,sizeof (lmc_ctl_t))) + ret = -EFAULT ; +else + ret =0 ;break ;case LMCIOCSINFO :/*fold01*/
@@ -159,8 +160,10 @@ int lmc_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/break ; } -if (copy_from_user (&ctl, ifr->ifr_data,sizeof (lmc_ctl_t))) -return -EFAULT ; +if (copy_from_user (&ctl, ifr->ifr_data,sizeof (lmc_ctl_t))) { + ret = -EFAULT ; +break ; + } sc->lmc_media->set_status (sc, &ctl);
@@ -190,8 +193,10 @@ int lmc_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/break ; } -if (copy_from_user (&new_type, ifr->ifr_data,sizeof (u_int16_t))) -return -EFAULT ; +if (copy_from_user (&new_type, ifr->ifr_data,sizeof (u_int16_t))) { + ret = -EFAULT ; +break ; + }if (new_type == old_type)
@@ -229,9 +234,10 @@ int lmc_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/ sc->lmc_xinfo.Magic1 =0xDEADBEEF ;if (copy_to_user (ifr->ifr_data, &sc->lmc_xinfo, -sizeof (struct lmc_xinfo ))) -return -EFAULT ; - ret =0 ; +sizeof (struct lmc_xinfo ))) { + ret = -EFAULT ; + else + ret =0 ;break ;
@@ -262,9 +268,9 @@ int lmc_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/if (copy_to_user (ifr->ifr_data, &sc->stats,sizeof (struct lmc_statistics ))) -return -EFAULT ; - - ret =0 ; + ret = -EFAULT ; +else + ret =0 ;break ;case LMCIOCCLEARLMCSTATS :/*fold01*/
@@ -292,8 +298,10 @@ int lmc_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/break ; } -if (copy_from_user (&ctl, ifr->ifr_data,sizeof (lmc_ctl_t))) -return -EFAULT ; +if (copy_from_user (&ctl, ifr->ifr_data,sizeof (lmc_ctl_t))) { + ret = -EFAULT ; +break ; + } sc->lmc_media->set_circuit_type (sc, ctl.circuit_type); sc->ictl.circuit_type = ctl.circuit_type; ret =0 ;
@@ -318,12 +326,15 @@ int lmc_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/#ifdef DEBUG case LMCIOCDUMPEVENTLOG : -if (copy_to_user (ifr->ifr_data, &lmcEventLogIndex,sizeof (u32))) -return -EFAULT ; +if (copy_to_user (ifr->ifr_data, &lmcEventLogIndex,sizeof (u32))) { + ret = -EFAULT ; +break ; + }if (copy_to_user (ifr->ifr_data +sizeof (u32), lmcEventLogBuf,sizeof (lmcEventLogBuf))) -return -EFAULT ; + ret = -EFAULT ; +else + ret =0 ; - ret =0 ;break ;#endif /* end ifdef _DBG_EVENTLOG */ case LMCIOCT1CONTROL :/*fold01*/
@@ -346,8 +357,10 @@ int lmc_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/*/ netif_stop_queue (dev); -if (copy_from_user (&xc, ifr->ifr_data,sizeof (struct lmc_xilinx_control ))) -return -EFAULT ; +if (copy_from_user (&xc, ifr->ifr_data,sizeof (struct lmc_xilinx_control ))) { + ret = -EFAULT ; +break ; + }switch (xc.command){case lmc_xilinx_reset:/*fold02*/ {
@@ -618,8 +631,8 @@ int lmc_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/ }spin_unlock_irqrestore (&sc->lmc_lock, flags);/*fold01*/ - -lmc_trace (dev,"lmc_ioctl out" ); +if (ret >=0 ) +lmc_trace (dev,"lmc_ioctl out" );return ret; }
I think we should keep the lmc_tracing. Use this patch instead.
--
Several returns before unlocking in lmc_ioctl
---
drivers/net/wan/lmc/lmc_main.c +34 -21
@@ -142,9 +142,10 @@ int lmc_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/* To date internally, just copy this out to the user. */ case LMCIOCGINFO :/*fold01*/ -if (copy_to_user (ifr->ifr_data, &sc->ictl,sizeof (lmc_ctl_t))) -return -EFAULT ; - ret =0 ; +if (copy_to_user (ifr->ifr_data, &sc->ictl,sizeof (lmc_ctl_t))) + ret = -EFAULT ; +else + ret =0 ;break ;case LMCIOCSINFO :/*fold01*/
@@ -159,8 +160,10 @@ int lmc_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/break ; } -if (copy_from_user (&ctl, ifr->ifr_data,sizeof (lmc_ctl_t))) -return -EFAULT ; +if (copy_from_user (&ctl, ifr->ifr_data,sizeof (lmc_ctl_t))) { + ret = -EFAULT ; +break ; + } sc->lmc_media->set_status (sc, &ctl);
@@ -190,8 +193,10 @@ int lmc_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/break ; } -if (copy_from_user (&new_type, ifr->ifr_data,sizeof (u_int16_t))) -return -EFAULT ; +if (copy_from_user (&new_type, ifr->ifr_data,sizeof (u_int16_t))) { + ret = -EFAULT ; +break ; + }if (new_type == old_type)
@@ -229,9 +234,10 @@ int lmc_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/ sc->lmc_xinfo.Magic1 =0xDEADBEEF ;if (copy_to_user (ifr->ifr_data, &sc->lmc_xinfo, -sizeof (struct lmc_xinfo ))) -return -EFAULT ; - ret =0 ; +sizeof (struct lmc_xinfo ))) { + ret = -EFAULT ; + else + ret =0 ;break ;
@@ -262,9 +268,9 @@ int lmc_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/if (copy_to_user (ifr->ifr_data, &sc->stats,sizeof (struct lmc_statistics ))) -return -EFAULT ; - - ret =0 ; + ret = -EFAULT ; +else + ret =0 ;break ;case LMCIOCCLEARLMCSTATS :/*fold01*/
@@ -292,8 +298,10 @@ int lmc_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/break ; } -if (copy_from_user (&ctl, ifr->ifr_data,sizeof (lmc_ctl_t))) -return -EFAULT ; +if (copy_from_user (&ctl, ifr->ifr_data,sizeof (lmc_ctl_t))) { + ret = -EFAULT ; +break ; + } sc->lmc_media->set_circuit_type (sc, ctl.circuit_type); sc->ictl.circuit_type = ctl.circuit_type; ret =0 ;
@@ -318,12 +326,15 @@ int lmc_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/#ifdef DEBUG case LMCIOCDUMPEVENTLOG : -if (copy_to_user (ifr->ifr_data, &lmcEventLogIndex,sizeof (u32))) -return -EFAULT ; +if (copy_to_user (ifr->ifr_data, &lmcEventLogIndex,sizeof (u32))) { + ret = -EFAULT ; +break ; + }if (copy_to_user (ifr->ifr_data +sizeof (u32), lmcEventLogBuf,sizeof (lmcEventLogBuf))) -return -EFAULT ; + ret = -EFAULT ; +else + ret =0 ; - ret =0 ;break ;#endif /* end ifdef _DBG_EVENTLOG */ case LMCIOCT1CONTROL :/*fold01*/
@@ -346,8 +357,10 @@ int lmc_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/*/ netif_stop_queue (dev); -if (copy_from_user (&xc, ifr->ifr_data,sizeof (struct lmc_xilinx_control ))) -return -EFAULT ; +if (copy_from_user (&xc, ifr->ifr_data,sizeof (struct lmc_xilinx_control ))) { + ret = -EFAULT ; +break ; + }switch (xc.command){case lmc_xilinx_reset:/*fold02*/ {
Quoted 9 lines · Roel Kluin
I think we should keep the
lmc_tracing. Use this patch instead.--
Several returns before unlocking inlmc_ioctlSigned-off-by Roel Kluin <[email protected]>---
drivers/net/wan/lmc/lmc_main.c +0
-0
<snip>
drivers/net/wan/lmc/lmc_main.c int lmc_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/ · line 240
Quoted 11 lines
drivers/net/wan/lmc/lmc_main.c +4
-3@@ -229,9 +234,10 @@ int lmc_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/ sc->lmc_xinfo.Magic1 =0xDEADBEEF ;if (copy_to_user (ifr->ifr_data, &sc->lmc_xinfo, -sizeof (struct lmc_xinfo ))) -return -EFAULT ; - ret =0 ; +sizeof (struct lmc_xinfo ))) { + ret = -EFAULT ; + else + ret =0 ;
I think you have an extra curly brace there. It breaks compile on my system.
Kristof
Quoted 14 lines · Kristof Provost
Quoted 9 lines · Roel Kluin
I think we should keep the
lmc_tracing. Use this patch instead.--
Several returns before unlocking inlmc_ioctlSigned-off-by Roel Kluin <[email protected]>---
drivers/net/wan/lmc/lmc_main.c +0
-0<snip>
Quoted 3 lines
drivers/net/wan/lmc/lmc_main.c +0
-0@@ -229,9 +234,10 @@ int lmc_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/ sc->lmc_xinfo.Magic1 =0xDEADBEEF ;
Quoted 10 lines
drivers/net/wan/lmc/lmc_main.c int lmc_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/ · line 240
Quoted 8 lines
drivers/net/wan/lmc/lmc_main.c +4
-3if (copy_to_user (ifr->ifr_data, &sc->lmc_xinfo, -sizeof (struct lmc_xinfo ))) -return -EFAULT ; - ret =0 ; +sizeof (struct lmc_xinfo ))) { + ret = -EFAULT ; + else + ret =0 ;I think you have an extra curly brace there. It breaks compile on my system.
You are right. thanks for notifying me and sorry for the trouble. please revert my patch (b463d40cdc436a12799a60a1d6ff1941a70a5bb6)
and try instead:
--
Several returns before unlocking in lmc_ioctl
---
drivers/net/wan/lmc/lmc_main.c +34 -21
@@ -142,9 +142,10 @@ int lmc_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/* To date internally, just copy this out to the user. */ case LMCIOCGINFO :/*fold01*/ -if (copy_to_user (ifr->ifr_data, &sc->ictl,sizeof (lmc_ctl_t))) -return -EFAULT ; - ret =0 ; +if (copy_to_user (ifr->ifr_data, &sc->ictl,sizeof (lmc_ctl_t))) + ret = -EFAULT ; +else + ret =0 ;break ;case LMCIOCSINFO :/*fold01*/
@@ -159,8 +160,10 @@ int lmc_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/break ; } -if (copy_from_user (&ctl, ifr->ifr_data,sizeof (lmc_ctl_t))) -return -EFAULT ; +if (copy_from_user (&ctl, ifr->ifr_data,sizeof (lmc_ctl_t))) { + ret = -EFAULT ; +break ; + } sc->lmc_media->set_status (sc, &ctl);
@@ -190,8 +193,10 @@ int lmc_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/break ; } -if (copy_from_user (&new_type, ifr->ifr_data,sizeof (u_int16_t))) -return -EFAULT ; +if (copy_from_user (&new_type, ifr->ifr_data,sizeof (u_int16_t))) { + ret = -EFAULT ; +break ; + }if (new_type == old_type)
@@ -229,9 +234,10 @@ int lmc_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/ sc->lmc_xinfo.Magic1 =0xDEADBEEF ;if (copy_to_user (ifr->ifr_data, &sc->lmc_xinfo, -sizeof (struct lmc_xinfo ))) -return -EFAULT ; - ret =0 ; +sizeof (struct lmc_xinfo ))) + ret = -EFAULT ; +else + ret =0 ;break ;
@@ -262,9 +268,9 @@ int lmc_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/if (copy_to_user (ifr->ifr_data, &sc->stats,sizeof (struct lmc_statistics ))) -return -EFAULT ; - - ret =0 ; + ret = -EFAULT ; +else + ret =0 ;break ;case LMCIOCCLEARLMCSTATS :/*fold01*/
@@ -292,8 +298,10 @@ int lmc_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/break ; } -if (copy_from_user (&ctl, ifr->ifr_data,sizeof (lmc_ctl_t))) -return -EFAULT ; +if (copy_from_user (&ctl, ifr->ifr_data,sizeof (lmc_ctl_t))) { + ret = -EFAULT ; +break ; + } sc->lmc_media->set_circuit_type (sc, ctl.circuit_type); sc->ictl.circuit_type = ctl.circuit_type; ret =0 ;
@@ -318,12 +326,15 @@ int lmc_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/#ifdef DEBUG case LMCIOCDUMPEVENTLOG : -if (copy_to_user (ifr->ifr_data, &lmcEventLogIndex,sizeof (u32))) -return -EFAULT ; +if (copy_to_user (ifr->ifr_data, &lmcEventLogIndex,sizeof (u32))) { + ret = -EFAULT ; +break ; + }if (copy_to_user (ifr->ifr_data +sizeof (u32), lmcEventLogBuf,sizeof (lmcEventLogBuf))) -return -EFAULT ; + ret = -EFAULT ; +else + ret =0 ; - ret =0 ;break ;#endif /* end ifdef _DBG_EVENTLOG */ case LMCIOCT1CONTROL :/*fold01*/
@@ -346,8 +357,10 @@ int lmc_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/*/ netif_stop_queue (dev); -if (copy_from_user (&xc, ifr->ifr_data,sizeof (struct lmc_xilinx_control ))) -return -EFAULT ; +if (copy_from_user (&xc, ifr->ifr_data,sizeof (struct lmc_xilinx_control ))) { + ret = -EFAULT ; +break ; + }switch (xc.command){case lmc_xilinx_reset:/*fold02*/ {
Quoted 8 lines · Roel Kluin
Quoted 2 lines · Kristof Provost
I think you have an extra curly brace there. It breaks compile on my system.
You are right. thanks for notifying me and sorry for the trouble. please revert my patch (
b463d40cdc436a12799a60a1d6ff1941a70a5bb6)and try instead:
This seems to compile just fine. I'm afraid I can't test it though. I don't actually have that hardware. I mistakingly left it turned on, so I noticed the compile error.
Kristof