2011-01-08 14 views
0

私はデバイスドライバを開発しており、IOCTLを使用する必要があります。残念ながら、私はユーザー空間から構造体をコピーすることはできません。ioctlコマンドでユーザー空間から構造体をコピーできないのはなぜですか?

void createSecvault(int secvaultId) 
{ 
    struct secvault_createoptions creationOptions; 
    /* fill with data */ 
    sendIoctlCommand(SECVAULT_IOCTL_CREATE, &creationOptions); 
} 

void sendIoctlCommand(int command, void *arg) 
{ 
    FILE *stream; 
    int fd, err; 

    stream = fopen(SECVAULT_DEV_CONTROL, "r"); 
    fd = fileno(stream); 
    ioctl(fd, command, arg); 
    fclose(stream); 
} 

カーネルモジュール

int control_device_ioctl(struct inode *node, struct file *filp, unsigned int cmd, unsigned long arg) 
{ 
    struct secvault_createoptions creationOptions; 
    int returnCode; 

    switch (cmd) 
    { 
     case SECVAULT_IOCTL_CREATE: 
      if (copy_from_user(&creationOptions, (void*)arg, sizeof(struct secvault_createoptions)) != sizeof(struct secvault_createoptions)) 
      { 
       /* Always this branch gets executed */ 
       printk(KERN_ALERT "Copying secure vault creation options from user space failed.\n"); 
       returnCode = -EFAULT; 
       break; 
      } 
      printk(KERN_ALERT "2 IOCTL create request on control device received: secvaultId = %d, dataSize = %ld.\n", 
       creationOptions.secvaultId, creationOptions.dataSize); 

      returnCode = createDataDevice(&creationOptions); 
      break; 
    } 
    return returnCode; 
} 

構造

struct secvault_createoptions { 
    int secvaultId; 
    long dataSize; 
    char key[SECVAULT_KEYSIZE]; 
}; 

アプリケーション:(ここでは簡略化、エラー処理が取り外さ)コードであります

よろしくお願いします。
Oliver Hanappi

答えて

4

copy_from_userコールが間違っています。コピーされたバイト数は戻されませんが、コピーされなかったバイト数は戻されます。何が欲しいのは

if (copy_from_user(...) != 0) 
     return -EFAULT; 

(あなたはあなたのスニペットでretへの割り当てをスキップすることができます。)

+0

通常のイディオムはif(copy_from_user(...))が返されます。-EFAULT; – mpe

+1

あなたのポイントは?それはまったく同じです。 – user562374

2

copy_from_user()をコピーすることができませんでしたバイト数を返します。だからsizeof(struct secvault_createoptions)ではなく、成功のために0が必要です。

0

copy_from_userが常に正常に完了した後に0を返すのであなたは

if (copy_from_user(&creationOptions, (void*)arg, sizeof(struct secvault_createoptions)) != 0) 
      { 
       /* Always this branch gets executed */ 
       printk(KERN_ALERT "Copying secure vault creation options from user space failed.\n"); 
       returnCode = -EFAULT; 
       break; 
      } 

、などのステートメントを変更する必要があります。

詳細については、to thisを参照してください。

関連する問題