[C] strstr

  • 157
  • 0
  • C
  • 2023-01-18

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
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
apple 1
0x5c9e500x5c9e510x5c9e520x5c9e530x5c9e540x5c9e550x5c9e56
  • 會發生 Process crash 的原因是因為:
  1. 輸入 cmd: sip_config SIP_GetOnlineCallLog  沒有後面的參數
  2. tmp = strstr(buf, " "); // 這邊會是找不到的情況, 也就是會是 NULL
  3. 對 NULL point 做事情就會發生 crash 的情況了
  • 修改: 當 tmp 是 NULL 的情況下, 表示後面沒有其他參數, 那麼就不需要做後續的動作了!!
    • strchr(char *str, int ch): 從前面開始找 ch
    • strrchr(char *str, int ch): 從後面開始找 ch