BOOL IsHostNameMatched(LPCSTR HostName, LPCSTR CommonName)\r
{\r
BOOL bResult;\r
- char* pAsterisk;\r
+ const char* pAsterisk;\r
+ size_t BeforeAsterisk;\r
+ const char* pBeginAsterisk;\r
+ const char* pEndAsterisk;\r
+ const char* pDot;\r
bResult = FALSE;\r
if(HostName && CommonName)\r
{\r
if(pAsterisk = strchr(CommonName, '*'))\r
{\r
- if(_strnicmp(HostName, CommonName, ((size_t)pAsterisk - (size_t)CommonName) / sizeof(char)) == 0)\r
+ BeforeAsterisk = ((size_t)pAsterisk - (size_t)CommonName) / sizeof(char);\r
+ pBeginAsterisk = HostName + BeforeAsterisk;\r
+ while(*pAsterisk == '*')\r
{\r
- while(*pAsterisk == '*')\r
+ pAsterisk++;\r
+ }\r
+ pEndAsterisk = HostName + strlen(HostName) - strlen(pAsterisk);\r
+ // "*"より前は大文字小文字を無視して完全一致\r
+ if(_strnicmp(HostName, CommonName, BeforeAsterisk) == 0)\r
+ {\r
+ // "*"より後は大文字小文字を無視して完全一致\r
+ if(_stricmp(pEndAsterisk, pAsterisk) == 0)\r
{\r
- pAsterisk++;\r
+ // "*"と一致する範囲に"."が含まれてはならない\r
+ pDot = strchr(pBeginAsterisk, '.');\r
+ if(!pDot || pDot >= pEndAsterisk)\r
+ bResult = TRUE;\r
}\r
- if(_stricmp(HostName + strlen(HostName) - strlen(pAsterisk), pAsterisk) == 0)\r
- bResult = TRUE;\r
}\r
}\r
else if(_stricmp(HostName, CommonName) == 0)\r