]> err.no Git - linux-2.6/blobdiff - drivers/sbus/char/openprom.c
[PATCH] AT91RM9200 Ethernet #4: Suspend/Resume
[linux-2.6] / drivers / sbus / char / openprom.c
index 5028ac2143262d44418d758682c31c766f6bd21f..239e108b8ed1e16cb45d51fa89591418a5410bac 100644 (file)
@@ -392,13 +392,16 @@ static int openprom_bsd_ioctl(struct inode * inode, struct file * file,
                        return -ENOMEM;
                }
 
-               prom_getproperty(op.op_nodeid, str, tmp, len);
-
-               tmp[len] = '\0';
+               cnt = prom_getproperty(op.op_nodeid, str, tmp, len);
+               if (cnt <= 0) {
+                       error = -EINVAL;
+               } else {
+                       tmp[len] = '\0';
 
-               if (__copy_to_user(argp, &op, sizeof(op)) != 0
-                   || copy_to_user(op.op_buf, tmp, len) != 0)
-                       error = -EFAULT;
+                       if (__copy_to_user(argp, &op, sizeof(op)) != 0 ||
+                           copy_to_user(op.op_buf, tmp, len) != 0)
+                               error = -EFAULT;
+               }
 
                kfree(tmp);
                kfree(str);
@@ -596,6 +599,8 @@ static long openprom_compat_ioctl(struct file *file, unsigned int cmd,
                lock_kernel();
                break;
        }
+
+       return rval;
 }
 
 static int openprom_open(struct inode * inode, struct file * file)
@@ -623,6 +628,7 @@ static struct file_operations openprom_fops = {
        .owner =        THIS_MODULE,
        .llseek =       no_llseek,
        .ioctl =        openprom_ioctl,
+       .compat_ioctl = openprom_compat_ioctl,
        .open =         openprom_open,
        .release =      openprom_release,
 };