Issue: 輸入指令會導致Process Crash
指令: sip_config SIP_GetOnlineCallLog 即會發生 Crash
下列是發生問題時, 大概的程式碼:
if ((strstr(buf, "SIP") == buf))
{
char *tmp = NULL;
tmp = strstr(buf, " ");
if (tmp)
{
*tmp = '\0';
}
...
...
if (strICmp(buf, "SIP_GetOnlineCallLog") == 0)
{
char *strptr = NULL;
strptr = tmp + 1;
tmp = strstr(strptr, " ");
if (tmp)
{
*tmp = '\0';
accountIdx = atoi(strptr);
}
...
}
}
- 假設要找的字串是 apple 1, 找尋目標是空白鍵" "
- Blank Space ASCII Code
- 下列簡單示意字串跟記憶體位址的關係, 並且說明 strstr 的用法
- char *strstr(const char *string, const char *sub_string); // 字串中搜尋目標字串
- 標頭檔: include <string.h>
- 回傳值: sub_string 的第一個出現在 string 的位址, 如果沒找到則是回傳 NULL
- ret = strstr{"apple 1", " "); // ret = 0x5c9e55
a | p | p | l | e | 1 | |
0x5c9e50 | 0x5c9e51 | 0x5c9e52 | 0x5c9e53 | 0x5c9e54 | 0x5c9e55 | 0x5c9e56 |
- 會發生 Process crash 的原因是因為:
- 輸入 cmd: sip_config SIP_GetOnlineCallLog 沒有後面的參數
tmp = strstr(buf, " "); // 這邊會是找不到的情況, 也就是會是 NULL
- 對 NULL point 做事情就會發生 crash 的情況了
- 修改: 當 tmp 是 NULL 的情況下, 表示後面沒有其他參數, 那麼就不需要做後續的動作了!!
- strchr(char *str, int ch): 從前面開始找 ch
- strrchr(char *str, int ch): 從後面開始找 ch