Commit aad1aaf4 authored by Johannes Stezenbach's avatar Johannes Stezenbach Committed by Linus Torvalds

[PATCH] fix dvb-net Oops

emard<at>softhome!net discovered an embarrasing bug in dvb_net.c where
the NET_REMOVE_IF ioctl will cause an Oops when called with an invalid
interface number. 
Signed-off-by: default avatarJohannes Stezenbach <js@linuxtv.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent f0d63d81
...@@ -1201,13 +1201,14 @@ static int dvb_net_add_if(struct dvb_net *dvbnet, u16 pid, u8 feedtype) ...@@ -1201,13 +1201,14 @@ static int dvb_net_add_if(struct dvb_net *dvbnet, u16 pid, u8 feedtype)
} }
static int dvb_net_remove_if(struct dvb_net *dvbnet, int num) static int dvb_net_remove_if(struct dvb_net *dvbnet, unsigned int num)
{ {
struct net_device *net = dvbnet->device[num]; struct net_device *net = dvbnet->device[num];
struct dvb_net_priv *priv = net->priv; struct dvb_net_priv *priv;
if (!dvbnet->state[num]) if (!dvbnet->state[num])
return -EINVAL; return -EINVAL;
priv = net->priv;
if (priv->in_use) if (priv->in_use)
return -EBUSY; return -EBUSY;
...@@ -1268,10 +1269,18 @@ static int dvb_net_do_ioctl(struct inode *inode, struct file *file, ...@@ -1268,10 +1269,18 @@ static int dvb_net_do_ioctl(struct inode *inode, struct file *file,
break; break;
} }
case NET_REMOVE_IF: case NET_REMOVE_IF:
{
int ret;
if (!capable(CAP_SYS_ADMIN)) if (!capable(CAP_SYS_ADMIN))
return -EPERM; return -EPERM;
if ((unsigned int) parg >= DVB_NET_DEVICES_MAX)
return -EINVAL;
ret = dvb_net_remove_if(dvbnet, (unsigned int) parg);
if (!ret)
module_put(dvbdev->adapter->module); module_put(dvbdev->adapter->module);
return dvb_net_remove_if(dvbnet, (int) (long) parg); return ret;
}
/* binary compatiblity cruft */ /* binary compatiblity cruft */
case __NET_ADD_IF_OLD: case __NET_ADD_IF_OLD:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment