2013-10-04 102 views
0

首先,我已經用C修改指針值

unsigned char * text ="Test program"; 
int _size = strlen(text); 
unsigned char * str = malloc(sizeof(text)); 
memcpy(str, text, _size); 
printf("Before(%d): %s\n", _size, str); 
for(i=0;i < _size; i++) { 
    str[i] -= 13; //rot13 
} 
printf("After: (%d): %s\n", strlen(str), str); 

創建一個簡單的程序,它運行正常。然而,當我提出這個代碼的Linux內核,它似乎無法工作

unsigned char * str; 
len = min(count, log->size - read->off); 

/* Allocate the memory for storing plain text */ 
str = kmalloc(len, GFP_KERNEL); 
if(str == NULL) { 
    printk(KERN_ERR "logger: failed to allocate buffer\n"); 
    return -ENOMEM; 
} 
memcpy(str, log->buf + read->off, len); 
/* Start: Add a simple rot13 encryption here */ 
for(i=0;i < strlen(str); i++) 
    str[i] -= 13; //rot13 
/* End: Add a simple rot13 encryption here */ 

if (copy_to_user(buf, str, len)) 
    return -EFAULT; 

if(str != NULL) { 
    kfree(str); 
} 

的問題來自於因爲如果它刪除,程序運行的情況下,原來下面的代碼

for(i=0;i < strlen(str); i++) 
    str[i] -= 13; //rot13 

。我在這裏錯過了什麼嗎?

+0

當你說,它不工作 - 你是什麼意思?它是否會崩潰內核?或給一些意想不到的文字或其他東西? – joe

回答

1

您還沒有終止str與,所以你很可能只是運行在緩衝區的末尾和跺腳內存。

變化:

str = kmalloc(len, GFP_KERNEL); 

到:

str = kmalloc(len + 1, GFP_KERNEL); // allocate additional char for terminator 

和變化:

memcpy(str, log->buf + read->off, len); 

到:

memcpy(str, log->buf + read->off, len); 
str[len] = '\0';     // put terminator at end of string 
+0

我試着作爲你的評論,但它似乎也失敗了。問題來自上面的代碼'str [i] - = 13; // rot13「,但我還沒弄明白。 – stela

+0

您是否使*我上面推薦的更改都變爲*了? –

+0

噢,是的,但是任何新東西:( – stela

2

的問題:sizeof(text)返回指針的大小,而不是字符串的長度text指向。還要記住,所有的字符串都有一個額外的字符來終止字符串。這一切都意味着你寫入和讀取超出了你分配的內存,這是未定義的行爲,這意味着任何事情都可能發生。

此外,文字字​​符串實際上是不變的(const char *)。

最後,您可能想要了解ROT13,因爲您正在做的是而不是 ROT13加密。

+2

它是否定義了行爲來說「ROT13加密」?它就像是一個「牛肉專用素材」 –

+0

我認爲它仍然是ROT13,整個字節旋轉13位而不僅僅是字母表中的字母 – tangrs

+0

任何建議只在字母上做? – stela

0

如果您正在處理字符串,請嘗試使用strncpy()而不是memcpy。 'coz會自動結束一個NULL字符,並且您可以安全地從緩衝區運行。但在這種情況下,我不太確定問題到底是什麼,除非您提供有關此問題的更多詳細信息。

對於任何內核編程錯誤,關鍵是要添加調試/打印和收集與發生的事情相同的數據。如果那不能幫助你調試自己,那將有助於他人更好地幫助你。

+0

這是android logcat的一部分,我只是在將內容複製回用戶空間之前,向內核日誌驅動程序(驅動程序/ staging/android/logger.c)添加簡單加密,以便用戶無法輕鬆讀取它 – stela

+0

ok我明白那個部分。但你再一次沒有說出你面臨的問題究竟是什麼。這是一個崩潰?或者是其他東西。你在嘗試添加printks和打印i和str [i]的值之前是否嘗試過?這將確認您是否訪問出界或任何此類事物。 – joe

+0

如果我只執行'memcpy(str,log-> buf + read-> off,len); '然後(copy_to_user(buf,str,len))其中str用作臨時值,它工作正常。但是如果我試圖'str [i] - = 13; //(rot_ )then(copy_to_user(buf,str,len)); Android的啓動,執行_adb logcat_然後我得到了來自下面的代碼(系統/核心/ logcat/logcat.cpp)的錯誤 'else if(entry-> entry.len!= ret - sizeof(struct logger_entry)) {stderr,「read:unexpected length。Expected%d,got%d \ n」,entry-> entry.len,ret - sizeof(struct logger_entry)); exit(EXIT_FAILURE); }' – stela