2016-09-28 1 views
0

私はLinuxカーネルのいくつかのシステムコールに取り組んでいます。 double kfree()がエラーを発生させるので、それに対して何が良い保護手段となるでしょうか?私が念頭に置いていたカーネルコードでdouble kfreeを防止しますか?

1つの明白なアイデアはkfree()NULLへのポインタを設定し、それが次の可能kfree()NULLだかどうかを確認することでした。これが正しい方法であるかどうかはわかりません。私を案内してください。

+4

非カーネルコードと同じです。誰がポインタを所有しているか知っています。 –

+0

@MooingDuck申し訳ありませんが、私はあなたを取得していません。あなたが意味するものなら、コード内のグローバルポインタを参照していますか? – bawejakunal

+1

'double kfree()はエラーを発生させるので、それに対して何が良いのか?' - カーネルAPIを誤って使用しているため、二重 'kfree'をすべて削除するのが最善の対策です。 **具体的な問題**をデバッグしたい場合は、この具体的な場合に役立つ方法を使用してください。 ** double ** 'kfree'の使用を許可したい場合は、既に解放されているとマークする必要があります。最も簡単な方法は解放されたメモリにフラグを設定することです。 – Tsyvarev

答えて

3

通常、その状況を回避するには、デザインです。いくつかの例:あなたのドライバーの.probe

  • kmalloc()、あなたはあなたのドライバの.removekfree()。その後、あなたは良いです、probe/removeコールはカーネルによってバランスがとれています。
  • kmalloc()、ドライバの.openkfree()、ドライバの.releaseです。また、open/releaseコールはカーネルによってバランスがとれています。

しかし、何らかの理由であなたはそれが割り当てられた場合、オブジェクトの割当てを解除したい特定の例、ポインタを無効化し、kfree()は完全に罰金です前にチェックの後、あなたのアプローチインチ(私はそれがうまく設計されていないものの痕跡だと言います...しかし、私はそこにいてそれをやりました;)

将来的には、このような質問があり、アプローチが人気がありますので、カーネルソースを閲覧することができます。類似のドライバを探し、どのパターンが使用されているかを確認します。それはあなたに大きな洞察力を与えるでしょう!

関連する問題