1

この質問には答えられたように感じますが、グーグルで見つけた実装では、必要な保護が提供されていません。

私はLinux3.2.2を使用しています。

変数をユーザースペースからカーネルスペースにできるだけ安全にコピーしたいと思います。これには、構造体ポインタとnullで終了する文字列が含まれます。構造体ポインタが有効であることを確認するにはどうすればよいですか?(access_ok on(void *)-1はそれをキャッチしません)私はそれを基本的にばかげた証拠にしたいです...

nullで終了する文字列の場合、長さがわかりません。これらのnullで終了する文字列をコピーする関数の中には、サイズが必要なものがあります。

4

2 に答える 2

0

ioctlを使用すると、構造をカーネル空間にコピーできるはずです。作成されたダミーのioctlを使用して、変数をカーネルに正常にコピーしました。

于 2012-12-05T10:02:56.630 に答える
0

解決済み:つまり、私が見つけた最善の解決策は、実際には、またはの代わりにandを配置するだけで使用していたコードでした。

まず、ptrがnullかどうかを確認します。それから

access_ok(VERIFY_READ/WRITE,ptr,structsize)

これがusrptrに合格するか、構造体がユーザーアドレス空間内にある場合。最後に使用する

int copy_from_user(void* dest, void* src,size_t len)

そして、destPtrがカーネル内のスペースを指していることを確認してください。そのサイズは明らかに>=structsizeです。今でも、構造内のデータが有用である、または必要なものであるという保証はありません。カーネルパニックを引き起こさないのは生データだけです。これで、構造体の各メンバーで有効なデータを確認できます。これに関するいくつかのより有用な情報があります

https://www.ibm.com/developerworks/linux/library/l-kernel-memory-access/

于 2012-12-07T06:14:41.077 に答える