diff options
author | Francois Pichet <pichet2000@gmail.com> | 2010-12-20 01:41:49 +0000 |
---|---|---|
committer | Francois Pichet <pichet2000@gmail.com> | 2010-12-20 01:41:49 +0000 |
commit | d3d3be9bc717b37366324e9711f1ea22dea42caa (patch) | |
tree | e1c9567b0d6e5792bcb8ccddefa1f0d30d0d8d35 /lib/Sema/SemaDeclAttr.cpp | |
parent | 403ba3522d1b1c97ae5fad81c1a2c4b3a754e1c1 (diff) |
Validate Microsoft's uuid attribute string.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@122220 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaDeclAttr.cpp')
-rw-r--r-- | lib/Sema/SemaDeclAttr.cpp | 42 |
1 files changed, 40 insertions, 2 deletions
diff --git a/lib/Sema/SemaDeclAttr.cpp b/lib/Sema/SemaDeclAttr.cpp index b0e022fd33..e77a660ada 100644 --- a/lib/Sema/SemaDeclAttr.cpp +++ b/lib/Sema/SemaDeclAttr.cpp @@ -2533,12 +2533,50 @@ static void HandleUuidAttr(Decl *d, const AttributeList &Attr, Sema &S) { } Expr *Arg = Attr.getArg(0); StringLiteral *Str = dyn_cast<StringLiteral>(Arg); + if (Str == 0 || Str->isWide()) { + S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_string) + << "uuid" << 1; + return; + } + + llvm::StringRef StrRef = Str->getString(); + + bool IsCurly = StrRef.size() > 1 && StrRef.front() == '{' && + StrRef.back() == '}'; + + // Validate GUID length. + if (IsCurly && StrRef.size() != 38) { + S.Diag(Attr.getLoc(), diag::err_attribute_uuid_malformed_guid); + return; + } + if (!IsCurly && StrRef.size() != 36) { + S.Diag(Attr.getLoc(), diag::err_attribute_uuid_malformed_guid); + return; + } + + // GUID format is "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" or + // "{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" + llvm::StringRef::iterator I = StrRef.begin();
+ if (IsCurly) // Skip the optional '{'
+ ++I;
+
+ for (int i = 0; i < 36; ++i) {
+ if (i == 8 || i == 13 || i == 18 || i == 23) { + if (*I != '-') { + S.Diag(Attr.getLoc(), diag::err_attribute_uuid_malformed_guid); + return; + } + } else if (!isxdigit(*I)) { + S.Diag(Attr.getLoc(), diag::err_attribute_uuid_malformed_guid); + return; + } + I++; + } d->addAttr(::new (S.Context) UuidAttr(Attr.getLoc(), S.Context, Str->getString())); - } else { + } else S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << "uuid"; - } } //===----------------------------------------------------------------------===// |