diff --git a/HTMLKit/CSSCodePoints.h b/HTMLKit/CSSCodePoints.h
index 93ae3ef..0d1a0fc 100644
--- a/HTMLKit/CSSCodePoints.h
+++ b/HTMLKit/CSSCodePoints.h
@@ -113,6 +113,25 @@ NS_INLINE BOOL isValidEscapedCodePoint(UTF32Char codePoint)
codePoint <= 0x10FFFF);
}
+NS_INLINE BOOL isValidIdentifierStart(UTF32Char first, UTF32Char second, UTF32Char third)
+{
+ if (first == HYPHEN_MINUS) {
+ if (isNameStart(second) ||
+ second == HYPHEN_MINUS ||
+ isValidEscape(second, third)) {
+ return YES;
+ } else {
+ return NO;
+ }
+ } else if (isNameStart(first)) {
+ return YES;
+ } else if (first == REVERSE_SOLIDUS) {
+ return isValidEscape(first, second);
+ } else {
+ return NO;
+ }
+}
+
NS_INLINE void AppendCodePoint(CFMutableStringRef string, UTF32Char codePoint)
{
UniChar pair[2];
diff --git a/HTMLKit/CSSInputStream.m b/HTMLKit/CSSInputStream.m
index e9825a7..5a024bd 100644
--- a/HTMLKit/CSSInputStream.m
+++ b/HTMLKit/CSSInputStream.m
@@ -26,6 +26,12 @@
{
CFMutableStringRef value = CFStringCreateMutable(kCFAllocatorDefault, 0);
+ if (!isValidIdentifierStart([self inputCharacterPointAtOffset:0],
+ [self inputCharacterPointAtOffset:1],
+ [self inputCharacterPointAtOffset:2])) {
+ return nil;
+ }
+
while (YES) {
UTF32Char codePoint = [self consumeNextInputCharacter];
if (codePoint == EOF) {