0

LDD3の例では、カーネル モジュールのメソッドの先頭access_ok()に配置され、ioctlユーザー空間から渡されたポインターが有効かどうかをチェックします。ユーザー空間アプリケーションがioctl()システムコールを呼び出して、変数のアドレスを渡す場合は正しいです。ただし、場合によっては、カーネル モジュールioctl()の第 3 引数、最後に第 2 引数としてポインターではなく値を使用してシステム コールが呼び出されます。access_ok()

access_ok()の 2 番目の引数として整数を渡そうとしましたが、正常に動作します。エラーは報告されませんでした。しかし、この使用法が正しいかどうかはよくわかりません。

たとえばioctl()、ユーザー空間で 3 番目の引数を '3' にして呼び出すとします。次に、 のioctl()メソッドでstruct file_operations、2 番目の引数としてaccess_ok()受け取ります。はポインターを想定している3ため、ユーザー空間ポインターに変換されます。逆に間違ってる…access_ok()3

4

2 に答える 2

0

ユーザー空間プログラムは任意のランダム値をポインターとして提供できるため、任意のランダム値access_ok()を処理できる必要があります。access_ok()したがって、ポインター以外の値で呼び出すことは間違いなく問題ありません。

ただし、実際にそのメモリ ロケーションにアクセスしようとしない限り、呼び出しaccess_ok()はまったく無意味です。(その点については、可能であればaccess_ok()、実際のユーザー空間アクセス (get_user()など) をチェックしてエラーを回避する必要があります。)

于 2015-06-16T07:38:18.740 に答える
0

実は、access_okさんのチェックは大雑把。関数の説明 (ソース ファイル内) は次のようになります。

アーキテクチャによっては、この関数はおそらくポインターがユーザー空間の範囲内にあるかどうかをチェックするだけであることに注意してください。この関数を呼び出した後でも、メモリ アクセス関数は -EFAULT を返す場合があります。

たとえば、source によるとarch/x86/include/asm/uaccess.h、x86 では、指定されたアドレスが下位access_ok領域を指していることを確認するだけです (カーネルが上位領域にあるため)。したがって、 に等しいアドレスに対して返されます。true3

ユーザー メモリのアクセシビリティに関する最終的な判断を下すのはcopy_from_user/です。copy_to_user

于 2015-06-16T09:31:24.313 に答える