1
0
mirror of https://github.com/VCMP-SqMod/SqMod.git synced 2025-02-20 19:57:12 +01:00

Fix incorrect range check when converting skin name to identifier.

This commit is contained in:
Sandu Liviu Catalin 2016-07-28 00:07:57 +03:00
parent 247ea2a357
commit 0559e224ad

View File

@ -77,12 +77,12 @@ Int32 GetSkinID(CCStr name)
// Get the most significant characters used to identify a skin
CharT a = str[0], b = 0, c = 0, d = str[len-1];
// Look for deeper specifiers
if (str.length() >= 3)
if (len >= 3)
{
b = str[1];
c = str[2];
}
else if (str.length() >= 2)
else if (len >= 52)
b = str[1];
// Search for a pattern in the name
switch (a)
@ -109,7 +109,7 @@ Int32 GetSkinID(CCStr name)
// [B]usiness man (#1|A)/(#2|B)/(#3|C)/(#4|D)/(#5|E)/(#6|F)
case 'b':
// [Be]ach [g]uy (#1|A)/(#2|B)/(#3|C)/(#4|D)/(#5|E)/(#6|F)/(#7|G)/(#8|H)
if (b == 'e' && (c == 'g' || (len > 4 && str[5] == 'g')))
if (b == 'e' && (c == 'g' || (len > 5 && str[5] == 'g')))
{
switch (d)
{
@ -132,7 +132,7 @@ Int32 GetSkinID(CCStr name)
}
}
// [Be]ach [l]ady (#1|A)/(#2|B)/(#3|C)/(#4|D)/(#5|E)/(#6|F)/(#7|G)
else if (b == 'e' && (c == 'l' || (len > 4 && str[5] == 'l')))
else if (b == 'e' && (c == 'l' || (len > 5 && str[5] == 'l')))
{
switch (d)
{
@ -160,14 +160,14 @@ Int32 GetSkinID(CCStr name)
else if (b == 'u' && (c && (c == 'm' || c == 'g' || c == 'l')))
{
// [Bum] [g]uy (#1|A)/(#2|B)/(#3|C)
if (c == 'g' || (len > 2 && str[3] == 'g'))
if (c == 'g' || (len > 3 && str[3] == 'g'))
{
if (d == '1' || d == 'a') return SQMOD_SKIN_BUM_GUY_A;
else if (d == '2' || d == 'b') return SQMOD_SKIN_BUM_GUY_B;
else if (d == '3' || d == 'c') return SQMOD_SKIN_BUM_GUY_C;
}
// [Bum] [l]ady (#1|A)/(#2|B)/(#2|C)/(#3|D)/(#4|E)
else if (c == 'l' || (len > 2 && str[3] == 'l'))
else if (c == 'l' || (len > 3 && str[3] == 'l'))
{
if (d == '1' || d == 'a') return SQMOD_SKIN_BUM_LADY_A;
else if (d == '2' || d == 'b') return SQMOD_SKIN_BUM_LADY_B;
@ -177,7 +177,7 @@ Int32 GetSkinID(CCStr name)
}
}
// [Bus]iness [m]an (#1|A)/(#2|B)/(#3|C)/(#4|D)/(#5|E)/(#6|F)
else if (b == 'u' && (c == 's' || (len > 8 && str[9] == 'm')))
else if (b == 'u' && (c == 's' || (len > 9 && str[9] == 'm')))
{
switch (d)
{
@ -220,10 +220,10 @@ Int32 GetSkinID(CCStr name)
// [Che][f]
if (c && (c == 'e' || d == 'f')) return SQMOD_SKIN_CHEF;
// [Chu]rch [g]uy
else if (c && ((c == 'u' && len > 5 && str[6] == 'g') || (c == 'g')))
else if (c && ((c == 'u' && len > 6 && str[6] == 'g') || (c == 'g')))
return SQMOD_SKIN_CHURCH_GUY;
// [Chu]rch [l]ady
else if (c && ((c == 'u' && len > 5 && str[6] == 'l') || (c == 'l')))
else if (c && ((c == 'u' && len > 6 && str[6] == 'l') || (c == 'l')))
return SQMOD_SKIN_CHURCH_LADY;
}
// [Cl]ub [l]ady
@ -235,13 +235,13 @@ Int32 GetSkinID(CCStr name)
else if (b == 'o')
{
// [Col]umbian [g]uy (#1|A)/(#2|B)
if (c && ((c == 'l' && len > 8 && str[9] == 'g') || (c == 'g')))
if (c && ((c == 'l' && len > 9 && str[9] == 'g') || (c == 'g')))
{
if (d == '1' || d == 'a') return SQMOD_SKIN_COLUMBIAN_GUY_A;
else if (d == '2' || d == 'b') return SQMOD_SKIN_COLUMBIAN_GUY_B;
}
// [Con]struction [w]orker (#1|A)/(#2|B)
else if (c && (c == 'n' || (len > 11 && str[12] == 'g')))
else if (c && (c == 'n' || (len > 12 && str[12] == 'g')))
{
if (d == '1' || d == 'a') return SQMOD_SKIN_CONSTRUCTION_WORKER_A;
else if (d == '2' || d == 'b') return SQMOD_SKIN_CONSTRUCTION_WORKER_B;
@ -329,7 +329,7 @@ Int32 GetSkinID(CCStr name)
}
}
// [Go]lf [g]uy (#1|A)/(#2|B)/(#3|C)
else if (b == 'o' && ((c == 'g') || (len > 3 && str[4] == 'g')))
else if (b == 'o' && ((c == 'g') || (len > 4 && str[4] == 'g')))
{
switch (d)
{
@ -342,7 +342,7 @@ Int32 GetSkinID(CCStr name)
}
}
// [Go]lf [l]ady
else if (b == 'o' && ((c == 'l') || (len > 3 && str[4] == 'l')))
else if (b == 'o' && ((c == 'l') || (len > 4 && str[4] == 'l')))
return SQMOD_SKIN_GOLF_LADY;
// [Gr]anny (#1|A)/(#2|B)
else if (b == 'r')
@ -351,10 +351,10 @@ Int32 GetSkinID(CCStr name)
else if (d == '2' || d == 'b') return SQMOD_SKIN_GRANNY_B;
}
// [Gy]m [g]uy
else if (b && (b == 'g' || (b == 'y' && len > 2 && str[3] == 'g')))
else if (b && (b == 'g' || (b == 'y' && len > 3 && str[3] == 'g')))
return SQMOD_SKIN_GYM_GUY;
// [Gy]m [l]ady
else if (b && (b == 'l' || (b == 'y' && len > 2 && str[3] == 'l')))
else if (b && (b == 'l' || (b == 'y' && len > 3 && str[3] == 'l')))
return SQMOD_SKIN_GYM_LADY;
// [H]atian (#1|A)/(#2|B)/(#3|C)/(#4|D)/(#5|E)
// [H]ilary, [H]ilary (Robber), [H]ood lady
@ -391,7 +391,7 @@ Int32 GetSkinID(CCStr name)
// [L]ove Fist (#1|A)/(#2|B)/(#3|C)/(#3|D)
case 'l':
//[Lan]ce ([C]o[p])
if ((b == 'a') && (c == 'n') && ((len > 4 && str[5] == 'c') || d == 'p'))
if ((b == 'a') && (c == 'n') && ((len > 5 && str[5] == 'c') || d == 'p'))
return SQMOD_SKIN_LANCE_COP;
else if (b && (b == 'c' || (b == 'a' && (c == 'n'))))
return SQMOD_SKIN_LANCE_COP;
@ -436,10 +436,10 @@ Int32 GetSkinID(CCStr name)
else if (b == 'h')
{
// [Ph]il ([O]ne ar[m])
if (b == 'o' || (c == 'o') || (len > 3 && str[4] == 'o') || d == 'm')
if (b == 'o' || (c == 'o') || (len > 4 && str[4] == 'o') || d == 'm')
return SQMOD_SKIN_PHIL_ONE_ARM;
// [Ph]il ([R]obbe[r])
else if (c && (c == 'r' || d == 'r' || (len > 3 && str[4] == 'r')))
else if (c && (c == 'r' || d == 'r' || (len > 4 && str[4] == 'r')))
return SQMOD_SKIN_PHIL_ROBBER;
// [Phi]l
else if (c == 'i') return SQMOD_SKIN_PHIL;
@ -532,10 +532,10 @@ Int32 GetSkinID(CCStr name)
}
}
// [Sk]ate [g]uy
else if (b == 'k' && ((c == 'g') || (len > 4 && str[5] == 'g')))
else if (b == 'k' && ((c == 'g') || (len > 5 && str[5] == 'g')))
return SQMOD_SKIN_SKATE_GUY;
// [Sk]ate [l]ady
else if (b == 'k' && ((c == 'l') || (len > 4 && str[5] == 'l')))
else if (b == 'k' && ((c == 'l') || (len > 5 && str[5] == 'l')))
return SQMOD_SKIN_SKATE_LADY;
// [So]nny
// [So]nny guy (#1|A)/(#2|B)/(#3|C)
@ -564,7 +564,7 @@ Int32 GetSkinID(CCStr name)
}
}
// [Sp]andE[x] (#1|A)/(#2|B)
else if (b == 'p' && ((c == 'x') || (len > 5 && str[6] == 'x')))
else if (b == 'p' && ((c == 'x') || (len > 6 && str[6] == 'x')))
{
switch (d)
{
@ -575,10 +575,10 @@ Int32 GetSkinID(CCStr name)
}
}
// [Sp]anish [g]uy
else if (b == 'p' && ((c == 'g') || (len > 6 && str[7] == 'g')))
else if (b == 'p' && ((c == 'g') || (len > 7 && str[7] == 'g')))
return SQMOD_SKIN_SPANISH_GUY;
// [Sp]anish [l]ady (#1|A)/(#2|B)/(#3|C)/(#4|D)
else if (b == 'p' && ((c == 'l') || (len > 6 && str[7] == 'l')))
else if (b == 'p' && ((c == 'l') || (len > 7 && str[7] == 'l')))
{
switch (d)
{