簡體   English   中英

Linux內核:strncpy_from_user()復制了太多字節

[英]Linux Kernel: strncpy_from_user() copying too many bytes

我正在嘗試編寫字符設備,並使用strncpy_from_user從用戶復制到內核空間。 但是,它幾乎總是復制太多數據。 我這樣做的方式是:

//len is buffer length.
tmp = (struct msg_list *)kmalloc(sizeof(struct msg_list),GFP_ATOMIC);
tmp->msg = (char*)kmalloc(len,GFP_ATOMIC);

strncpy_from_user(tmp->msg,buff,len);

緩沖區長度通常輸出看到的1+個字符,我認為這是因為它在末尾NUL中計數。

例如,以下緩沖區長度為4:

echo 123 > /dev/my_chardev

但是, strcnpy_from_user可能會復制4個字節以上。 根據文檔,最后一個參數是“要復制的最大字節數”。 但這似乎並不正確。

我嘗試手動設置(temp->msg)[len-1] = 0 ,但這似乎會引起問題(無限循環和段錯誤)。 將字符串從用戶安全復制到內核空間的最佳方法是什么?

編輯:

正如Matteo在評論中提到的那樣, echo默認情況下會寫一個\\n ,他還指出,尾隨的NUL確實並不意味着read/write系統調用。 這是為我工作的解決方案:

tmp = (struct msg_list *)kmalloc(sizeof(struct msg_list),GFP_ATOMIC);
tmp->msg = (char*)kmalloc(len+1,GFP_ATOMIC);

strncpy_from_user(tmp->msg,buff,len);

(tmp->msg)[len]=0;

與常規strncpy ,如果字符串與指定的最大長度一樣長(或更長),則所使用的函數不會終止緩沖區。 如果len計算寫入設備的實際字符數,並且想要將它們放入C字符串中,則必須記住在分配大小中加1,並將最后一個字節設置為0,否則將得到一個非字符。 -終止的字符串。

但是, ,如果您仍在使用C字符串基礎知識,並且NULL終止vs計數的字符串遠離內核模式,那么如果您想使用虛擬文件系統,請使用FUSE。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM