@@ -28,100 +28,99 @@ import semmle.code.cpp.dataflow.new.DataFlow
2828 * - EVP_MD_CTX
2929 * - EVP_PKEY_CTX
3030 */
31- private class CTXType extends Type {
32- CTXType ( ) { this .getUnspecifiedType ( ) .stripType ( ) .getName ( ) .matches ( "evp_%ctx_%st" ) }
31+ private class CtxType extends Type {
32+ CtxType ( ) { this .getUnspecifiedType ( ) .stripType ( ) .getName ( ) .matches ( "evp_%ctx_%st" ) }
3333}
3434
3535/**
36- * A pointer to a CTXType
36+ * A pointer to a CtxType
3737 */
38- private class CTXPointerExpr extends Expr {
39- CTXPointerExpr ( ) {
40- this .getType ( ) instanceof CTXType and
38+ private class CtxPointerExpr extends Expr {
39+ CtxPointerExpr ( ) {
40+ this .getType ( ) instanceof CtxType and
4141 this .getType ( ) instanceof PointerType
4242 }
4343}
4444
4545/**
46- * A call argument of type CTXPointerExpr .
46+ * A call argument of type CtxPointerExpr .
4747 */
48- private class CTXPointerArgument extends CTXPointerExpr {
49- CTXPointerArgument ( ) { exists ( Call c | c .getAnArgument ( ) = this ) }
48+ private class CtxPointerArgument extends CtxPointerExpr {
49+ CtxPointerArgument ( ) { exists ( Call c | c .getAnArgument ( ) = this ) }
5050
5151 Call getCall ( ) { result .getAnArgument ( ) = this }
5252}
5353
5454/**
5555 * A call whose target contains 'free' or 'reset' and has an argument of type
56- * CTXPointerArgument .
56+ * CtxPointerArgument .
5757 */
58- private class CTXClearCall extends Call {
59- CTXClearCall ( ) {
58+ private class CtxClearCall extends Call {
59+ CtxClearCall ( ) {
6060 this .getTarget ( ) .getName ( ) .toLowerCase ( ) .matches ( [ "%free%" , "%reset%" ] ) and
61- this .getAnArgument ( ) instanceof CTXPointerArgument
61+ this .getAnArgument ( ) instanceof CtxPointerArgument
6262 }
6363}
6464
6565/**
6666 * A call whose target contains 'copy' and has an argument of type
67- * CTXPointerArgument .
67+ * CtxPointerArgument .
6868 */
69- private class CTXCopyOutArgCall extends Call {
70- CTXCopyOutArgCall ( ) {
69+ private class CtxCopyOutArgCall extends Call {
70+ CtxCopyOutArgCall ( ) {
7171 this .getTarget ( ) .getName ( ) .toLowerCase ( ) .matches ( "%copy%" ) and
72- this .getAnArgument ( ) instanceof CTXPointerArgument
72+ this .getAnArgument ( ) instanceof CtxPointerArgument
7373 }
7474}
7575
7676/**
7777 * A call whose target contains 'dup' and has an argument of type
78- * CTXPointerArgument .
78+ * CtxPointerArgument .
7979 */
80- private class CTXCopyReturnCall extends Call {
81- CTXCopyReturnCall ( ) {
80+ private class CtxCopyReturnCall extends Call , CtxPointerExpr {
81+ CtxCopyReturnCall ( ) {
8282 this .getTarget ( ) .getName ( ) .toLowerCase ( ) .matches ( "%dup%" ) and
83- this .getAnArgument ( ) instanceof CTXPointerArgument and
84- this instanceof CTXPointerExpr
83+ this .getAnArgument ( ) instanceof CtxPointerArgument
8584 }
8685}
8786
8887/**
89- * Flow from any CTXPointerArgument to any other CTXPointerArgument
88+ * Flow from any CtxPointerArgument to any other CtxPointerArgument
9089 */
91- module OpenSSLCTXArgumentFlowConfig implements DataFlow:: ConfigSig {
92- predicate isSource ( DataFlow:: Node source ) { source .asExpr ( ) instanceof CTXPointerArgument }
90+ module OpenSSLCtxArgumentFlowConfig implements DataFlow:: ConfigSig {
91+ predicate isSource ( DataFlow:: Node source ) { source .asExpr ( ) instanceof CtxPointerArgument }
9392
94- predicate isSink ( DataFlow:: Node sink ) { sink .asExpr ( ) instanceof CTXPointerArgument }
93+ predicate isSink ( DataFlow:: Node sink ) { sink .asExpr ( ) instanceof CtxPointerArgument }
9594
9695 predicate isBarrier ( DataFlow:: Node node ) {
97- exists ( CTXClearCall c | c .getAnArgument ( ) = node .asExpr ( ) )
96+ exists ( CtxClearCall c | c .getAnArgument ( ) = node .asExpr ( ) )
9897 }
9998
10099 predicate isAdditionalFlowStep ( DataFlow:: Node node1 , DataFlow:: Node node2 ) {
101- exists ( CTXCopyOutArgCall c |
100+ exists ( CtxCopyOutArgCall c |
102101 c .getAnArgument ( ) = node1 .asExpr ( ) and
103102 c .getAnArgument ( ) = node2 .asExpr ( ) and
104103 node1 .asExpr ( ) != node2 .asExpr ( ) and
105- node2 .asExpr ( ) .getType ( ) instanceof CTXType
104+ node2 .asExpr ( ) .getType ( ) instanceof CtxType
106105 )
107106 or
108- exists ( CTXCopyReturnCall c |
107+ exists ( CtxCopyReturnCall c |
109108 c .getAnArgument ( ) = node1 .asExpr ( ) and
110109 c = node2 .asExpr ( ) and
111110 node1 .asExpr ( ) != node2 .asExpr ( ) and
112- node2 .asExpr ( ) .getType ( ) instanceof CTXType
111+ node2 .asExpr ( ) .getType ( ) instanceof CtxType
113112 )
114113 }
115114}
116115
117- module OpenSSLCTXArgumentFlow = DataFlow:: Global< OpenSSLCTXArgumentFlowConfig > ;
116+ module OpenSSLCtxArgumentFlow = DataFlow:: Global< OpenSSLCtxArgumentFlowConfig > ;
118117
119118/**
120119 * Holds if there is a context flow from the source to the sink.
121120 */
122- predicate ctxArgFlowsToCtxArg ( CTXPointerArgument source , CTXPointerArgument sink ) {
121+ predicate ctxArgFlowsToCtxArg ( CtxPointerArgument source , CtxPointerArgument sink ) {
123122 exists ( DataFlow:: Node a , DataFlow:: Node b |
124- OpenSSLCTXArgumentFlow :: flow ( a , b ) and
123+ OpenSSLCtxArgumentFlow :: flow ( a , b ) and
125124 a .asExpr ( ) = source and
126125 b .asExpr ( ) = sink
127126 )
0 commit comments