[英]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.