Description: | StringTokenizer.nextToken() is invoked without prior check of hasMoreTokens(). This usage may be safe from context, since the tokenized value is an RBG color value which has a known number of tokens. However, the usage is unsafe against invalid values and we, therefore, consider it a misuse. |
Code with Misuse: |
class WebColors { /** * Gives you a BaseColor based on a name. * * @param name * a name such as black, violet, cornflowerblue or #RGB or #RRGGBB * or RGB or RRGGBB or rgb(R,G,B) * @return the corresponding BaseColor object. Never returns null. * @throws IllegalArgumentException * if the String isn't a know representation of a color. */ public static BaseColor getRGBColor(String name) throws IllegalArgumentException { int[] c = { 0, 0, 0, 255 }; name = name.toLowerCase(); boolean colorStrWithoutHash = missingHashColorFormat(name); if (name.startsWith("#") || colorStrWithoutHash) { if (!colorStrWithoutHash) { name = name.substring(1); // lop off the # to unify hex parsing. } if (name.length() == 3) { String s = name.substring(0, 1); c[0] = Integer.parseInt(s+s, 16); String s2 = name.substring(1, 2); c[1] = Integer.parseInt(s2+s2, 16); String s3 = name.substring(2); c[2] = Integer.parseInt(s3+s3, 16); return new BaseColor(c[0], c[1], c[2], c[3]); } if (name.length() == 6) { c[0] = Integer.parseInt(name.substring(0, 2), 16); c[1] = Integer.parseInt(name.substring(2, 4), 16); c[2] = Integer.parseInt(name.substring(4), 16); return new BaseColor(c[0], c[1], c[2], c[3]); } throw new IllegalArgumentException(MessageLocalization.getComposedMessage("unknown.color.format.must.be.rgb.or.rrggbb")); } else if (name.startsWith("rgb(")) { StringTokenizer tok = new StringTokenizer(name, "rgb(), \t\r\n\f"); for (int k = 0; k < 3; ++k) { String v = tok.nextToken(); if (v.endsWith("%")) c[k] = Integer.parseInt(v.substring(0, v.length() - 1)) * 255 / 100; else c[k] = Integer.parseInt(v); if (c[k] < 0) c[k] = 0; else if (c[k] > 255) c[k] = 255; } return new BaseColor(c[0], c[1], c[2], c[3]); }
if (!NAMES.containsKey(name)) // TODO localize this error message. throw new IllegalArgumentException("Color '" + name + "' not found."); c = NAMES.get(name); return new BaseColor(c[0], c[1], c[2], c[3]); }
}
|