0

デバイス ドライバーを開発しており、IOCTL を利用する必要があります。残念ながら、ユーザー空間から構造体をコピーすることはできません。コードは次のとおりです (簡素化され、エラー処理が削除されています)。

構造

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

応用

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;
}

よろしく、
オリバー・ハナッピ

4

3 に答える 3

4

あなたのcopy_from_user電話は間違っています。コピーされたバイト数ではなく、コピーされなかったバイト数を返します。あなたが欲しいのは

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

ret(スニペットでの割り当てをスキップできます。)

于 2011-01-08T17:01:08.467 に答える
3

copy_from_user()コピーできなかったバイト数を返します。0したがって、ではなく、成功を期待する必要がありsizeof(struct secvault_createoptions)ます。

于 2011-01-08T17:01:17.323 に答える
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;
            }

copy_from_user正常終了後は常に 0 を返すためです。

詳しくはこちらをご参照ください。

于 2014-09-02T06:27:37.663 に答える