Fix crash when accessing invalid argument index
Just return null if a user tries to access an invalid argument that wasn't defined when detouring the function.
This commit is contained in:
		
							parent
							
								
									9bbca712b6
								
							
						
					
					
						commit
						b16d1f9f3f
					
				| @ -129,6 +129,9 @@ int x86MsCdecl::GetArgRegisterSize() | |||||||
| 
 | 
 | ||||||
| void* x86MsCdecl::GetArgumentPtr(int iIndex, CRegisters* pRegisters) | void* x86MsCdecl::GetArgumentPtr(int iIndex, CRegisters* pRegisters) | ||||||
| { | { | ||||||
|  | 	if (iIndex < 0 || iIndex >= m_vecArgTypes.length()) | ||||||
|  | 		return NULL; | ||||||
|  | 
 | ||||||
| 	// Check if this argument was passed in a register.
 | 	// Check if this argument was passed in a register.
 | ||||||
| 	if (m_vecArgTypes[iIndex].custom_register != None) | 	if (m_vecArgTypes[iIndex].custom_register != None) | ||||||
| 	{ | 	{ | ||||||
|  | |||||||
| @ -137,6 +137,9 @@ int x86MsStdcall::GetArgRegisterSize() | |||||||
| 
 | 
 | ||||||
| void* x86MsStdcall::GetArgumentPtr(int iIndex, CRegisters* pRegisters) | void* x86MsStdcall::GetArgumentPtr(int iIndex, CRegisters* pRegisters) | ||||||
| { | { | ||||||
|  | 	if (iIndex < 0 || iIndex >= m_vecArgTypes.length()) | ||||||
|  | 		return NULL; | ||||||
|  | 
 | ||||||
| 	// Check if this argument was passed in a register.
 | 	// Check if this argument was passed in a register.
 | ||||||
| 	if (m_vecArgTypes[iIndex].custom_register != None) | 	if (m_vecArgTypes[iIndex].custom_register != None) | ||||||
| 	{ | 	{ | ||||||
|  | |||||||
| @ -151,10 +151,16 @@ void* x86MsThiscall::GetArgumentPtr(int iIndex, CRegisters* pRegisters) | |||||||
| 		return pRegisters->m_ecx->m_pAddress; | 		return pRegisters->m_ecx->m_pAddress; | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
|  | 	// The this pointer isn't explicitly defined as an argument.
 | ||||||
|  | 	iIndex--; | ||||||
|  | 	 | ||||||
|  | 	if (iIndex < 0 || iIndex >= m_vecArgTypes.length()) | ||||||
|  | 		return NULL; | ||||||
|  | 
 | ||||||
| 	// Check if this argument was passed in a register.
 | 	// Check if this argument was passed in a register.
 | ||||||
| 	if (m_vecArgTypes[iIndex-1].custom_register != None) | 	if (m_vecArgTypes[iIndex].custom_register != None) | ||||||
| 	{ | 	{ | ||||||
| 		CRegister *pRegister = pRegisters->GetRegister(m_vecArgTypes[iIndex-1].custom_register); | 		CRegister *pRegister = pRegisters->GetRegister(m_vecArgTypes[iIndex].custom_register); | ||||||
| 		if (!pRegister) | 		if (!pRegister) | ||||||
| 			return NULL; | 			return NULL; | ||||||
| 
 | 
 | ||||||
| @ -162,7 +168,7 @@ void* x86MsThiscall::GetArgumentPtr(int iIndex, CRegisters* pRegisters) | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	int iOffset = 4; | 	int iOffset = 4; | ||||||
| 	for(int i=0; i < iIndex-1; i++) | 	for(int i=0; i < iIndex; i++) | ||||||
| 	{ | 	{ | ||||||
| 		if (m_vecArgTypes[i].custom_register == None) | 		if (m_vecArgTypes[i].custom_register == None) | ||||||
| 			iOffset += m_vecArgTypes[i].size; | 			iOffset += m_vecArgTypes[i].size; | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user