X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=fs%2Fchar_dev.c;h=38f71222a552e46e58e0b801e91063d714a134fb;hb=8ce9a75a307e142a8871c649627555e0e4a1eefb;hp=262fa10e213d571c4d14e1c6b08a3c5861e55e03;hpb=0552f297951d0ab3a1027f9b06fa40c9be8378ba;p=~andy%2Flinux diff --git a/fs/char_dev.c b/fs/char_dev.c index 262fa10e213..38f71222a55 100644 --- a/fs/char_dev.c +++ b/fs/char_dev.c @@ -120,7 +120,7 @@ __register_chrdev_region(unsigned int major, unsigned int baseminor, cd->major = major; cd->baseminor = baseminor; cd->minorct = minorct; - strncpy(cd->name,name, 64); + strlcpy(cd->name, name, sizeof(cd->name)); i = major_to_index(major); @@ -386,15 +386,22 @@ static int chrdev_open(struct inode *inode, struct file *filp) cdev_put(new); if (ret) return ret; + + ret = -ENXIO; filp->f_op = fops_get(p->ops); - if (!filp->f_op) { - cdev_put(p); - return -ENXIO; - } - if (filp->f_op->open) + if (!filp->f_op) + goto out_cdev_put; + + if (filp->f_op->open) { ret = filp->f_op->open(inode,filp); - if (ret) - cdev_put(p); + if (ret) + goto out_cdev_put; + } + + return 0; + + out_cdev_put: + cdev_put(p); return ret; }