2014-07-15 35 views
-1

如果我們將ioctl中的空指針從用戶空間傳遞到內核空間會發生什麼?如何處理這種情況?如何處理空指針參數到ioctl系統調用

我期待解決方案將使用copy_to_user/copy_from_user對指針進行檢查指針是否有效。我想知道我是否正確。

任何進一步的輸入將會有所幫助。

回答

3

就內核而言,空指針可以是完全有效的虛擬地址(用戶空間)。考慮到地址零處的頁面可以是mmap() ed:

mmap(NULL, sysconf(_SC_PAGE_SIZE), PROT_READ | PROT_WRITE, MAP_FIXED, fd, 0); 

作爲超級用戶。

您應該在用戶應用程序中處理NULL指針,這樣做有意義。在內核中,你應該:

  • 進行檢查NULL 內核指針
  • 使用access_ok檢查提供的指針實際上是在用戶空間,如果不進行copy_to_usercopy_to_user電話access_ok反正)
+0

我不認爲這是真的。在mmap手冊頁中:「如果addr爲NULL,則內核選擇創建映射的地址...」 –

+2

從同一手冊頁:「如果指定了MAP_FIXED標誌,並且addr爲0(NULL) ,那麼映射地址將爲0(NULL)。「 –

+0

我站好了。謝謝。 –

-1

是的,copy_from_user/copy_to_user是處理此問題的正確方法。如果你給出的指針是無效的,將會產生一個非零的返回值(在這一點上,內核代碼應該返回EFAULT [實際上通常是-EFAULT])。

在內核模式或用戶模式下,空值通常不會用作有效指針。但是,正如Michael Foukrakis指出的那樣,可以在地址0創建一個mmap區域,在這種情況下,可以設想NULL指針是有效的。在任何情況下,copy_from_user/copy_to_user仍然是檢測有效地址的正確方法。