私はLinuxカーネルのいくつかのシステムコールに取り組んでいます。 double kfree()
がエラーを発生させるので、それに対して何が良い保護手段となるでしょうか?私が念頭に置いていたカーネルコードでdouble kfreeを防止しますか?
1つの明白なアイデアはkfree()
後NULL
へのポインタを設定し、それが次の可能kfree()
前NULL
だかどうかを確認することでした。これが正しい方法であるかどうかはわかりません。私を案内してください。
私はLinuxカーネルのいくつかのシステムコールに取り組んでいます。 double kfree()
がエラーを発生させるので、それに対して何が良い保護手段となるでしょうか?私が念頭に置いていたカーネルコードでdouble kfreeを防止しますか?
1つの明白なアイデアはkfree()
後NULL
へのポインタを設定し、それが次の可能kfree()
前NULL
だかどうかを確認することでした。これが正しい方法であるかどうかはわかりません。私を案内してください。
通常、その状況を回避するには、デザインです。いくつかの例:あなたのドライバーの.probe
上
kmalloc()
、あなたはあなたのドライバの.remove
にkfree()
。その後、あなたは良いです、probe/remove
コールはカーネルによってバランスがとれています。kmalloc()
、ドライバの.open
、kfree()
、ドライバの.release
です。また、open/release
コールはカーネルによってバランスがとれています。しかし、何らかの理由であなたはそれが割り当てられた場合、オブジェクトの割当てを解除したい特定の例、ポインタを無効化し、kfree()
は完全に罰金です前にチェックの後、あなたのアプローチインチ(私はそれがうまく設計されていないものの痕跡だと言います...しかし、私はそこにいてそれをやりました;)
将来的には、このような質問があり、アプローチが人気がありますので、カーネルソースを閲覧することができます。類似のドライバを探し、どのパターンが使用されているかを確認します。それはあなたに大きな洞察力を与えるでしょう!
非カーネルコードと同じです。誰がポインタを所有しているか知っています。 –
@MooingDuck申し訳ありませんが、私はあなたを取得していません。あなたが意味するものなら、コード内のグローバルポインタを参照していますか? – bawejakunal
'double kfree()はエラーを発生させるので、それに対して何が良いのか?' - カーネルAPIを誤って使用しているため、二重 'kfree'をすべて削除するのが最善の対策です。 **具体的な問題**をデバッグしたい場合は、この具体的な場合に役立つ方法を使用してください。 ** double ** 'kfree'の使用を許可したい場合は、既に解放されているとマークする必要があります。最も簡単な方法は解放されたメモリにフラグを設定することです。 – Tsyvarev