mirror of
https://github.com/alliedmodders/amxmodx.git
synced 2024-12-25 06:15:37 +03:00
Fix for amb519: geoip_code2 and geoip_code3 will overflow the result buffer on an unsuccessful lookup.
Added two replacement natives for those two: geoip_code2_ex and geoip_code3_ex, could not modify the old natives without breaking backwards compatibility.
This commit is contained in:
parent
8316318c31
commit
4b02ffa920
@ -28,6 +28,39 @@ static cell AMX_NATIVE_CALL amx_geoip_code3(AMX *amx, cell *params)
|
|||||||
const char *ccode = GeoIP_country_code3_by_addr(gi, ip);
|
const char *ccode = GeoIP_country_code3_by_addr(gi, ip);
|
||||||
return MF_SetAmxString(amx, params[2], ccode?ccode:"error", 4);
|
return MF_SetAmxString(amx, params[2], ccode?ccode:"error", 4);
|
||||||
}
|
}
|
||||||
|
static cell AMX_NATIVE_CALL amx_geoip_code2_ex(AMX *amx, cell *params)
|
||||||
|
{
|
||||||
|
int len = 0;
|
||||||
|
char *ip = MF_GetAmxString(amx, params[1], 0, &len);
|
||||||
|
StripPort(ip);
|
||||||
|
const char *ccode = GeoIP_country_code_by_addr(gi, ip);
|
||||||
|
|
||||||
|
if (ccode == NULL)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
MF_SetAmxString(amx, params[2], ccode, 2);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static cell AMX_NATIVE_CALL amx_geoip_code3_ex(AMX *amx, cell *params)
|
||||||
|
{
|
||||||
|
int len = 0;
|
||||||
|
char *ip = MF_GetAmxString(amx, params[1], 0, &len);
|
||||||
|
StripPort(ip);
|
||||||
|
const char *ccode = GeoIP_country_code3_by_addr(gi, ip);
|
||||||
|
|
||||||
|
if (ccode == NULL)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
MF_SetAmxString(amx, params[2], ccode, 3);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL amx_geoip_country(AMX *amx, cell *params)
|
static cell AMX_NATIVE_CALL amx_geoip_country(AMX *amx, cell *params)
|
||||||
{
|
{
|
||||||
@ -60,6 +93,10 @@ void OnAmxxDetach()
|
|||||||
AMX_NATIVE_INFO geoip_natives[] = {
|
AMX_NATIVE_INFO geoip_natives[] = {
|
||||||
{"geoip_code2", amx_geoip_code2},
|
{"geoip_code2", amx_geoip_code2},
|
||||||
{"geoip_code3", amx_geoip_code3},
|
{"geoip_code3", amx_geoip_code3},
|
||||||
|
|
||||||
|
{"geoip_code2_ex", amx_geoip_code2_ex},
|
||||||
|
{"geoip_code3_ex", amx_geoip_code3_ex},
|
||||||
|
|
||||||
{"geoip_country", amx_geoip_country},
|
{"geoip_country", amx_geoip_country},
|
||||||
{NULL, NULL},
|
{NULL, NULL},
|
||||||
};
|
};
|
||||||
|
@ -17,13 +17,58 @@
|
|||||||
#pragma library geoip
|
#pragma library geoip
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//IP address can contain ports, the ports will be stripped out
|
/// IP addresses passed to these natives can contain ports, the ports will be ignored.
|
||||||
|
|
||||||
//get a two character country code (eg US, CA etc)
|
/**
|
||||||
|
* Lookup the two character country code for a given IP address.
|
||||||
|
* e.g: "US", "CA", etc.
|
||||||
|
*
|
||||||
|
* @param ip The IP address to lookup.
|
||||||
|
* @param result The result buffer. If the lookup does not succeed, the buffer is not modified.
|
||||||
|
* @return true on a successful lookup, false on a failed lookup.
|
||||||
|
*/
|
||||||
|
native bool:geoip_code2_ex(const ip[], result[3]);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lookup the three character country code for a given IP address.
|
||||||
|
* e.g: "USA", "cAN", etc.
|
||||||
|
*
|
||||||
|
* @param ip The IP address to lookup.
|
||||||
|
* @param result The result buffer. If the lookup does not succeed, the buffer is not modified.
|
||||||
|
* @return true on a successful lookup, false on a failed lookup.
|
||||||
|
*/
|
||||||
|
native bool:geoip_code3_ex(const ip[], result[4]);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated
|
||||||
|
* Lookup the two character country code for a given IP address.
|
||||||
|
*
|
||||||
|
* @note This native will overflow the buffer by one cell on an unknown ip lookup!
|
||||||
|
* @note Use geoip_code2_ex instead!
|
||||||
|
*
|
||||||
|
* @param ip The IP address to lookup.
|
||||||
|
* @param result The result buffer.
|
||||||
|
*/
|
||||||
native geoip_code2(const ip[], ccode[3]);
|
native geoip_code2(const ip[], ccode[3]);
|
||||||
|
|
||||||
//get a three character country code (eg USA, cAN etc)
|
/**
|
||||||
|
* @deprecated
|
||||||
|
* Lookup the three character country code for a given IP address.
|
||||||
|
*
|
||||||
|
* @note This native will overflow the buffer by one cell on an unknown ip lookup!
|
||||||
|
* @note Use geoip_code3_ex instead!
|
||||||
|
*
|
||||||
|
* @param ip The IP address to lookup.
|
||||||
|
* @param result The result buffer.
|
||||||
|
*/
|
||||||
native geoip_code3(const ip[], result[4]);
|
native geoip_code3(const ip[], result[4]);
|
||||||
|
|
||||||
//get a full country name. max name is 45 chars
|
/**
|
||||||
|
* Lookup the full country name for the given IP address. Sets the buffer to "error" on
|
||||||
|
* an unsuccessful lookup.
|
||||||
|
*
|
||||||
|
* @param ip The IP address to lookup.
|
||||||
|
* @param result The result of the geoip lookup.
|
||||||
|
* @param len The maximum length of the result buffer.
|
||||||
|
*/
|
||||||
native geoip_country(const ip[], result[], len=45);
|
native geoip_country(const ip[], result[], len=45);
|
||||||
|
Loading…
Reference in New Issue
Block a user