diff options
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/StaticAnalyzer/Checkers/CheckSecuritySyntaxOnly.cpp | 22 | 
1 files changed, 22 insertions, 0 deletions
diff --git a/clang/lib/StaticAnalyzer/Checkers/CheckSecuritySyntaxOnly.cpp b/clang/lib/StaticAnalyzer/Checkers/CheckSecuritySyntaxOnly.cpp index 1d69e6b3ff3..20c045fe6b2 100644 --- a/clang/lib/StaticAnalyzer/Checkers/CheckSecuritySyntaxOnly.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/CheckSecuritySyntaxOnly.cpp @@ -70,6 +70,7 @@ public:    void checkCall_strcat(const CallExpr *CE, const FunctionDecl *FD);    void checkCall_rand(const CallExpr *CE, const FunctionDecl *FD);    void checkCall_random(const CallExpr *CE, const FunctionDecl *FD); +  void checkCall_vfork(const CallExpr *CE, const FunctionDecl *FD);    void checkUncheckedReturnValue(CallExpr *CE);  };  } // end anonymous namespace @@ -116,6 +117,7 @@ void WalkAST::VisitCallExpr(CallExpr *CE) {      .Case("rand", &WalkAST::checkCall_rand)      .Case("rand_r", &WalkAST::checkCall_rand)      .Case("random", &WalkAST::checkCall_random) +    .Case("vfork", &WalkAST::checkCall_vfork)      .Default(NULL);    // If the callee isn't defined, it is not of security concern. @@ -519,6 +521,26 @@ void WalkAST::checkCall_random(const CallExpr *CE, const FunctionDecl *FD) {  }  //===----------------------------------------------------------------------===// +// Check: 'vfork' should not be used. +// POS33-C: Do not use vfork(). +//===----------------------------------------------------------------------===// + +void WalkAST::checkCall_vfork(const CallExpr *CE, const FunctionDecl *FD) { +  // All calls to vfork() are insecure, issue a warning. +  SourceRange R = CE->getCallee()->getSourceRange(); +  PathDiagnosticLocation CELoc = +    PathDiagnosticLocation::createBegin(CE, BR.getSourceManager(), AC); +  BR.EmitBasicReport("Potential insecure implementation-specific behavior in " +                     "call 'vfork'", +                     "Security", +                     "Call to function 'vfork' is insecure as it can lead to " +                     "denial of service situations in the parent process. " +                     "Replace calls to vfork with calls to the safer " +                     "'posix_spawn' function", +                     CELoc, &R, 1); +} + +//===----------------------------------------------------------------------===//  // Check: Should check whether privileges are dropped successfully.  // Originally: <rdar://problem/6337132>  //===----------------------------------------------------------------------===//  | 

