contrast-agent 5.0.0 → 5.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (120) hide show
  1. checksums.yaml +4 -4
  2. data/.simplecov +1 -2
  3. data/ext/cs__assess_kernel/cs__assess_kernel.c +7 -4
  4. data/ext/cs__assess_module/cs__assess_module.c +48 -38
  5. data/ext/cs__common/cs__common.c +4 -0
  6. data/ext/cs__common/cs__common.h +1 -0
  7. data/ext/cs__contrast_patch/cs__contrast_patch.c +52 -27
  8. data/ext/cs__contrast_patch/cs__contrast_patch.h +2 -0
  9. data/ext/cs__scope/cs__scope.c +747 -0
  10. data/ext/cs__scope/cs__scope.h +88 -0
  11. data/ext/cs__scope/extconf.rb +5 -0
  12. data/lib/contrast/agent/assess/contrast_event.rb +20 -13
  13. data/lib/contrast/agent/assess/contrast_object.rb +4 -1
  14. data/lib/contrast/agent/assess/policy/propagation_node.rb +2 -5
  15. data/lib/contrast/agent/assess/policy/propagator/match_data.rb +6 -0
  16. data/lib/contrast/agent/assess/policy/trigger_method.rb +4 -1
  17. data/lib/contrast/agent/assess/rule/response/auto_complete_rule.rb +69 -0
  18. data/lib/contrast/agent/assess/rule/response/base_rule.rb +25 -12
  19. data/lib/contrast/agent/assess/rule/response/body_rule.rb +109 -0
  20. data/lib/contrast/agent/assess/rule/response/cache_control_header_rule.rb +157 -0
  21. data/lib/contrast/agent/assess/rule/response/click_jacking_header_rule.rb +26 -0
  22. data/lib/contrast/agent/assess/rule/response/csp_header_insecure_rule.rb +100 -0
  23. data/lib/contrast/agent/assess/rule/response/csp_header_missing_rule.rb +26 -0
  24. data/lib/contrast/agent/assess/rule/response/framework/rails_support.rb +29 -0
  25. data/lib/contrast/agent/assess/rule/response/header_rule.rb +70 -0
  26. data/lib/contrast/agent/assess/rule/response/hsts_header_rule.rb +36 -0
  27. data/lib/contrast/agent/assess/rule/response/parameters_pollution_rule.rb +61 -0
  28. data/lib/contrast/agent/assess/rule/response/x_content_type_header_rule.rb +26 -0
  29. data/lib/contrast/agent/assess/rule/response/x_xss_protection_header_rule.rb +35 -0
  30. data/lib/contrast/agent/middleware.rb +1 -0
  31. data/lib/contrast/agent/patching/policy/after_load_patcher.rb +1 -3
  32. data/lib/contrast/agent/patching/policy/patch.rb +2 -6
  33. data/lib/contrast/agent/patching/policy/patcher.rb +1 -1
  34. data/lib/contrast/agent/protect/input_analyzer/input_analyzer.rb +94 -0
  35. data/lib/contrast/agent/protect/rule/base.rb +28 -1
  36. data/lib/contrast/agent/protect/rule/base_service.rb +10 -1
  37. data/lib/contrast/agent/protect/rule/cmd_injection.rb +2 -0
  38. data/lib/contrast/agent/protect/rule/deserialization.rb +6 -0
  39. data/lib/contrast/agent/protect/rule/http_method_tampering.rb +5 -1
  40. data/lib/contrast/agent/protect/rule/no_sqli.rb +1 -0
  41. data/lib/contrast/agent/protect/rule/path_traversal.rb +1 -0
  42. data/lib/contrast/agent/protect/rule/sqli/sqli_input_classification.rb +124 -0
  43. data/lib/contrast/agent/protect/rule/sqli/sqli_worth_watching.rb +121 -0
  44. data/lib/contrast/agent/protect/rule/sqli.rb +33 -0
  45. data/lib/contrast/agent/protect/rule/xxe.rb +4 -0
  46. data/lib/contrast/agent/reporting/input_analysis/input_analysis.rb +44 -0
  47. data/lib/contrast/agent/reporting/input_analysis/input_analysis_result.rb +115 -0
  48. data/lib/contrast/agent/reporting/input_analysis/input_type.rb +44 -0
  49. data/lib/contrast/agent/reporting/input_analysis/score_level.rb +21 -0
  50. data/lib/contrast/agent/reporting/report.rb +1 -0
  51. data/lib/contrast/agent/reporting/reporter.rb +8 -1
  52. data/lib/contrast/agent/reporting/reporting_events/finding.rb +77 -34
  53. data/lib/contrast/agent/reporting/reporting_events/finding_event.rb +88 -59
  54. data/lib/contrast/agent/reporting/reporting_events/{finding_object.rb → finding_event_object.rb} +24 -20
  55. data/lib/contrast/agent/reporting/reporting_events/finding_event_parent_object.rb +39 -0
  56. data/lib/contrast/agent/reporting/reporting_events/finding_event_property.rb +40 -0
  57. data/lib/contrast/agent/reporting/reporting_events/{finding_signature.rb → finding_event_signature.rb} +29 -24
  58. data/lib/contrast/agent/reporting/reporting_events/finding_event_source.rb +12 -8
  59. data/lib/contrast/agent/reporting/reporting_events/{finding_stack.rb → finding_event_stack.rb} +23 -19
  60. data/lib/contrast/agent/reporting/reporting_events/{finding_taint_range.rb → finding_event_taint_range.rb} +17 -15
  61. data/lib/contrast/agent/reporting/reporting_events/finding_request.rb +26 -53
  62. data/lib/contrast/agent/reporting/reporting_events/poll.rb +29 -0
  63. data/lib/contrast/agent/reporting/reporting_events/reporting_event.rb +5 -4
  64. data/lib/contrast/agent/reporting/reporting_events/route_discovery.rb +1 -0
  65. data/lib/contrast/agent/reporting/reporting_events/server_activity.rb +1 -1
  66. data/lib/contrast/agent/reporting/reporting_utilities/audit.rb +10 -3
  67. data/lib/contrast/agent/reporting/reporting_utilities/endpoints.rb +0 -1
  68. data/lib/contrast/agent/reporting/reporting_utilities/reporter_client.rb +1 -0
  69. data/lib/contrast/agent/reporting/reporting_utilities/reporter_client_utils.rb +28 -20
  70. data/lib/contrast/agent/reporting/reporting_utilities/response_handler.rb +1 -1
  71. data/lib/contrast/agent/reporting/reporting_utilities/response_handler_utils.rb +13 -1
  72. data/lib/contrast/agent/request_context.rb +6 -1
  73. data/lib/contrast/agent/request_context_extend.rb +87 -10
  74. data/lib/contrast/agent/scope.rb +102 -107
  75. data/lib/contrast/agent/service_heartbeat.rb +45 -2
  76. data/lib/contrast/agent/version.rb +1 -1
  77. data/lib/contrast/api/decorators/bot_blocker.rb +37 -0
  78. data/lib/contrast/api/decorators/ip_denylist.rb +37 -0
  79. data/lib/contrast/api/decorators/rasp_rule_sample.rb +29 -0
  80. data/lib/contrast/api/decorators/user_input.rb +11 -1
  81. data/lib/contrast/api/decorators/virtual_patch.rb +34 -0
  82. data/lib/contrast/components/logger.rb +5 -0
  83. data/lib/contrast/components/protect.rb +4 -2
  84. data/lib/contrast/components/scope.rb +98 -91
  85. data/lib/contrast/config/agent_configuration.rb +58 -12
  86. data/lib/contrast/config/api_configuration.rb +100 -12
  87. data/lib/contrast/config/api_proxy_configuration.rb +55 -3
  88. data/lib/contrast/config/application_configuration.rb +114 -15
  89. data/lib/contrast/config/assess_configuration.rb +106 -12
  90. data/lib/contrast/config/assess_rules_configuration.rb +44 -3
  91. data/lib/contrast/config/base_configuration.rb +1 -0
  92. data/lib/contrast/config/certification_configuration.rb +74 -3
  93. data/lib/contrast/config/exception_configuration.rb +61 -3
  94. data/lib/contrast/config/heap_dump_configuration.rb +101 -17
  95. data/lib/contrast/config/inventory_configuration.rb +64 -3
  96. data/lib/contrast/config/logger_configuration.rb +46 -3
  97. data/lib/contrast/config/protect_rule_configuration.rb +36 -9
  98. data/lib/contrast/config/protect_rules_configuration.rb +120 -17
  99. data/lib/contrast/config/request_audit_configuration.rb +68 -3
  100. data/lib/contrast/config/ruby_configuration.rb +96 -22
  101. data/lib/contrast/config/sampling_configuration.rb +76 -10
  102. data/lib/contrast/config/server_configuration.rb +56 -11
  103. data/lib/contrast/config/service_configuration.rb +66 -11
  104. data/lib/contrast/configuration.rb +6 -3
  105. data/lib/contrast/extension/assess/erb.rb +17 -0
  106. data/lib/contrast/logger/cef_log.rb +151 -0
  107. data/lib/contrast/utils/hash_digest.rb +14 -6
  108. data/lib/contrast/utils/log_utils.rb +114 -0
  109. data/lib/contrast/utils/middleware_utils.rb +6 -7
  110. data/lib/contrast/utils/net_http_base.rb +12 -9
  111. data/lib/contrast/utils/patching/policy/patch_utils.rb +0 -4
  112. data/lib/contrast.rb +4 -3
  113. data/resources/assess/policy.json +10 -0
  114. data/ruby-agent.gemspec +2 -2
  115. data/service_executables/VERSION +1 -1
  116. data/service_executables/linux/contrast-service +0 -0
  117. data/service_executables/mac/contrast-service +0 -0
  118. metadata +47 -19
  119. data/lib/contrast/agent/assess/rule/response/autocomplete_rule.rb +0 -130
  120. data/lib/contrast/extension/kernel.rb +0 -54
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4976ba07d49361d91d44561f93031bfbe6b0aaff32921c62c8a6841e1e9581ad
4
- data.tar.gz: 510081d49ac928d43cd2f97ab310b6f6dcd122c1227e52d35c40f6ff5f423723
3
+ metadata.gz: bfca6df4def9f2366f7a92651aa9cd2fc40f3ced6784228844d8025cee5a4850
4
+ data.tar.gz: b66b10e1d892adee985f070963e08945fd9dd4faf641f4f06a8372683129facd
5
5
  SHA512:
6
- metadata.gz: e1dff81a71f5162d2f217ef061ae060b77d825a85fc0666e667b845e62f5e209b8d409bb2fe554af774f904d3586461a35c264fedb5c63c4f1d9a1130c7ed0c0
7
- data.tar.gz: '013393f427c6539d164f7f647d2b8635ef4c7093e8dbd517631c03ae2ad3a5b7e8529bce82e80cea5f5c3ad630c537abd7114f98042f01b4977059ebb5ad1aaf'
6
+ metadata.gz: '08a6989482a82249d3fb906b2f79788e03d5c5ffa03973beabe591292fa780cd2bd3a6f459e8b7eedf58181a729720da0e95b1afa069e8869511b6ff4338625d'
7
+ data.tar.gz: b460cad0b10b3355bfafa3be8c49ba41d0174e5a5d0524bbab273cf51c3d9fed6348027b9658dd3dadddcace9012f0ce119566f46899ee71f8712aebf56a98bf
data/.simplecov CHANGED
@@ -1,9 +1,8 @@
1
1
  # Copyright (c) 2022 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
2
2
  # frozen_string_literal: true
3
3
 
4
- SimpleCov.minimum_coverage line: 94.75
4
+ SimpleCov.minimum_coverage line: 95
5
5
  SimpleCov.start do
6
6
  add_filter '/spec/'
7
- add_filter '/lib/contrast/extension/assess/erb.rb'
8
7
  enable_coverage :branch
9
8
  end
@@ -3,19 +3,22 @@
3
3
 
4
4
  #include "cs__assess_kernel.h"
5
5
  #include "../cs__common/cs__common.h"
6
+ #include "../cs__scope/cs__scope.h"
6
7
  #include <ruby.h>
7
8
 
8
9
  VALUE
9
10
  contrast_patched_kernel_exec(const int argc, const VALUE *argv,
10
11
  const VALUE self) {
11
12
  int nested_scope =
12
- RTEST(rb_funcall(contrast_patcher(), rb_sym_in_scope, 0));
13
+ inst_methods_in_cntr_scope(contrast_patcher(), 0);
13
14
 
14
- if (!nested_scope && argc > 0) {
15
- rb_funcall(contrast_patcher(), rb_sym_enter_scope, 0);
15
+ if (nested_scope == Qfalse && argc > 0) {
16
+ /* enter scope */
17
+ inst_methods_enter_cntr_scope(contrast_patcher(), 0);
16
18
  VALUE data = argv[0];
17
19
  rb_funcall(kernel_propagator, exec_apply_trigger, 1, data);
18
- rb_funcall(contrast_patcher(), rb_sym_exit_scope, 0);
20
+ /* exit scope */
21
+ inst_methods_exit_cntr_scope(contrast_patcher(), 0);
19
22
  }
20
23
 
21
24
  /* maybe this should be rb_funcall2. this works right now because *argv ==
@@ -3,6 +3,7 @@
3
3
 
4
4
  #include "cs__assess_module.h"
5
5
  #include "../cs__common/cs__common.h"
6
+ #include "../cs__scope/cs__scope.h"
6
7
  #include <ruby.h>
7
8
 
8
9
  void contrast_assess_eval_trigger_check(VALUE module, VALUE source, VALUE ret) {
@@ -11,12 +12,11 @@ void contrast_assess_eval_trigger_check(VALUE module, VALUE source, VALUE ret) {
11
12
  return;
12
13
  }
13
14
 
14
- int nested_scope =
15
- RTEST(rb_funcall(contrast_patcher(), rb_sym_in_scope, 0));
15
+ int nested_scope = inst_methods_in_cntr_scope(contrast_patcher(), 0);
16
+ /* enter scope */
17
+ inst_methods_enter_cntr_scope(contrast_patcher(), 0);
16
18
 
17
- rb_funcall(contrast_patcher(), rb_sym_enter_scope, 0);
18
-
19
- if (!nested_scope) {
19
+ if (nested_scope == Qfalse) {
20
20
  VALUE method = rb_funcall(rb_mKernel, rb_sym_method, 0);
21
21
  /* If this method ever throws an exception, the scope-leave
22
22
  * needs to be moved within a rescue call.
@@ -24,8 +24,8 @@ void contrast_assess_eval_trigger_check(VALUE module, VALUE source, VALUE ret) {
24
24
  rb_funcall(module_eval_trigger, trigger_check_method, 4, module, source,
25
25
  ret, method);
26
26
  }
27
-
28
- rb_funcall(contrast_patcher(), rb_sym_exit_scope, 0);
27
+ /* exit scope */
28
+ inst_methods_exit_cntr_scope(contrast_patcher(), 0);
29
29
  }
30
30
 
31
31
  VALUE
@@ -61,39 +61,39 @@ VALUE
61
61
  contrast_assess_module_prepend(const int argc, const VALUE *argv,
62
62
  const VALUE self) {
63
63
 
64
- rb_prepend_module(self, argv[0]);
64
+ // rb_prepend_module(self, argv[0]);
65
65
 
66
66
  VALUE module_at;
67
67
  VALUE rb_incl_in_mod_ary = rb_funcall(self, rb_intern("included_in"), 0);
68
68
 
69
69
  if (RB_TYPE_P(rb_incl_in_mod_ary, T_ARRAY)) {
70
- int i = 0;
71
- int size = rb_funcall(rb_incl_in_mod_ary, rb_intern("length"), 0);
72
- for (i = 0; i < size; ++i) {
73
- module_at = rb_ary_entry(rb_incl_in_mod_ary, i);
74
- if (RB_TYPE_P(module_at, T_MODULE)) {
75
- rb_include_module(module_at, argv[0]);
76
- }
77
- }
70
+ int i = 0;
71
+ int size = rb_funcall(rb_incl_in_mod_ary, rb_intern("length"), 0);
72
+ for (i = 0; i < size; ++i) {
73
+ module_at = rb_ary_entry(rb_incl_in_mod_ary, i);
74
+ if (RB_TYPE_P(module_at, T_MODULE)) {
75
+ rb_include_module(module_at, argv[0]);
76
+ }
77
+ }
78
78
  }
79
79
  return self;
80
80
  }
81
81
 
82
82
  VALUE
83
83
  contrast_assess_module_included(const int argc, const VALUE *argv,
84
- const VALUE self) {
85
- VALUE frozen;
86
- if (RB_TYPE_P(self, T_MODULE)) {
87
- // check if frozen
88
- frozen = rb_funcall(self, rb_intern("cs__frozen?"), 0);
89
- if (frozen == Qfalse) {
90
- VALUE ary = rb_funcall(self, rb_intern("included_in"), 0);
91
- if (RB_TYPE_P(ary, T_ARRAY)) {
92
- rb_ary_push(ary, argv[0]);
93
- }
94
- }
95
- }
96
- return self;
84
+ const VALUE self) {
85
+ VALUE frozen;
86
+ if (RB_TYPE_P(self, T_MODULE)) {
87
+ // check if frozen
88
+ frozen = rb_funcall(self, rb_intern("cs__frozen?"), 0);
89
+ if (frozen == Qfalse) {
90
+ VALUE ary = rb_funcall(self, rb_intern("included_in"), 0);
91
+ if (RB_TYPE_P(ary, T_ARRAY)) {
92
+ rb_ary_push(ary, argv[0]);
93
+ }
94
+ }
95
+ }
96
+ return self;
97
97
  }
98
98
 
99
99
  void Init_cs__assess_module(void) {
@@ -115,13 +115,23 @@ void Init_cs__assess_module(void) {
115
115
 
116
116
  contrast_register_patch("Module", "module_eval",
117
117
  contrast_assess_module_module_eval);
118
- /*
119
- * We patch these for better ancestors handling, and only for older ruby versions.
120
- */
121
- if (rb_ver_below_three()) {
122
- contrast_register_patch("Module", "included",
123
- contrast_assess_module_included);
124
- contrast_register_patch("Module", "prepend",
125
- contrast_assess_module_prepend);
126
- }
118
+ /*
119
+ * We patch these for better ancestors handling, and only for older ruby
120
+ * versions.
121
+ */
122
+ // if (rb_ver_below_three()) {
123
+ /*
124
+ * `included` is a private method. We should make it public, patch it,
125
+ * and make our new method public
126
+ */
127
+ // contrast_register_patch("Module", "included",
128
+ // contrast_assess_module_included);
129
+ /*
130
+ * The `prepend` patch may actually be the issue, if we're not properly
131
+ * passing along the call/context. It could be that my attempt to fix
132
+ * `included` left this section unreachable.
133
+ */
134
+ // contrast_register_patch("Module", "prepend",
135
+ // contrast_assess_module_prepend);
136
+ // }
127
137
  }
@@ -10,6 +10,7 @@
10
10
  VALUE contrast, agent, patching, policy, assess;
11
11
  VALUE core_extensions, core_assess;
12
12
  VALUE assess_policy, assess_propagator;
13
+ VALUE components;
13
14
  VALUE funchook_path;
14
15
 
15
16
  VALUE rb_sym_enter_scope;
@@ -175,6 +176,9 @@ void Init_cs__common(void) {
175
176
  contrast = rb_define_module("Contrast");
176
177
  agent = rb_define_module_under(contrast, "Agent");
177
178
 
179
+ /* components => Contrast::Components */
180
+ components = rb_define_module_under(contrast, "Components");
181
+
178
182
  assess = rb_define_module_under(agent, "Assess");
179
183
 
180
184
  patching = rb_define_module_under(agent, "Patching");
@@ -17,6 +17,7 @@ extern VALUE contrast, agent, patching, policy, assess;
17
17
  extern VALUE core_extensions, core_assess;
18
18
  extern VALUE assess_policy, assess_propagator;
19
19
  extern VALUE funchook_path;
20
+ extern VALUE components;
20
21
 
21
22
  extern VALUE rb_sym_enter_scope;
22
23
  extern VALUE rb_sym_exit_scope;
@@ -3,6 +3,7 @@
3
3
 
4
4
  #include "cs__contrast_patch.h"
5
5
  #include "../cs__common/cs__common.h"
6
+ #include "../cs__scope/cs__scope.h"
6
7
  #include <ruby.h>
7
8
 
8
9
  VALUE build_preshift(const VALUE method_policy, const VALUE object,
@@ -84,15 +85,22 @@ VALUE contrast_call_post_patch(const VALUE method_policy, const VALUE preshift,
84
85
  method_policy, preshift, object, ret, send, block);
85
86
  }
86
87
 
87
- VALUE contrast_patch_call_rescue(const VALUE *args) {
88
- int argc;
89
- VALUE exception, object, preshift, method_policy, method;
90
- VALUE *argv;
91
-
88
+ /* wrap rb_ensure so we can rescue an exception */
89
+ VALUE rescue_func(VALUE arg1) {
90
+ VALUE exception;
92
91
  /* rb_errinfo() gives the value of $!, the exception that
93
92
  * triggered a rescue block.
94
93
  */
95
94
  exception = rb_errinfo();
95
+ rb_exc_raise(exception);
96
+
97
+ return Qnil;
98
+ }
99
+
100
+ VALUE contrast_patch_call_ensure(const VALUE *args) {
101
+ int argc;
102
+ VALUE object, preshift, method_policy, method;
103
+ VALUE *argv;
96
104
 
97
105
  object = args[0];
98
106
  method = args[1];
@@ -103,12 +111,19 @@ VALUE contrast_patch_call_rescue(const VALUE *args) {
103
111
 
104
112
  contrast_call_post_patch(method_policy, preshift, object, Qnil, argc, argv);
105
113
 
106
- /* reraise the exception that got us here */
107
- rb_exc_raise(exception);
108
-
109
114
  return Qnil;
110
115
  }
111
116
 
117
+ VALUE ensure_wrapper(const VALUE *args) {
118
+ VALUE original_method, original_args, ensure_args;
119
+
120
+ original_method = args[0];
121
+ original_args = (VALUE)args[1];
122
+ ensure_args = (VALUE)args[2];
123
+
124
+ return rb_ensure(original_method, original_args, contrast_patch_call_ensure, (VALUE)ensure_args);
125
+ }
126
+
112
127
  VALUE contrast_call_super(const VALUE *args) {
113
128
  int argc;
114
129
  VALUE *argv;
@@ -122,7 +137,8 @@ VALUE contrast_run_patches(const VALUE *wrapped_args) {
122
137
  VALUE impl, method, method_policy, object, original_args, original_ret, preshift, transformed_ret;
123
138
  int argc;
124
139
  VALUE *argv;
125
- VALUE rescue_args[6];
140
+ VALUE ensure_args[6];
141
+ VALUE rescue_wrapper_args[3];
126
142
 
127
143
  impl = wrapped_args[0];
128
144
  original_args = wrapped_args[1];
@@ -132,18 +148,22 @@ VALUE contrast_run_patches(const VALUE *wrapped_args) {
132
148
  argc = NUM2INT(wrapped_args[5]);
133
149
  argv = (VALUE *)wrapped_args[6];
134
150
 
135
- rescue_args[0] = object;
136
- rescue_args[1] = method;
137
- rescue_args[2] = INT2NUM(argc);
138
- rescue_args[3] = (VALUE)argv;
139
- rescue_args[4] = method_policy;
151
+ rescue_wrapper_args[0] = contrast_patch_call_original;
152
+ rescue_wrapper_args[1] = original_args;
153
+ rescue_wrapper_args[2] = ensure_args;
154
+
155
+ ensure_args[0] = object;
156
+ ensure_args[1] = method;
157
+ ensure_args[2] = INT2NUM(argc);
158
+ ensure_args[3] = (VALUE)argv;
159
+ ensure_args[4] = method_policy;
140
160
 
141
161
  /* Tracking, triggering, and propagation here. */
142
162
  contrast_call_pre_patch(method_policy, method, object, argc, argv, Qnil);
143
163
 
144
164
  /* Capture pre-call state */
145
165
  preshift = build_preshift(method_policy, object, argc, argv);
146
- rescue_args[5] = preshift;
166
+ ensure_args[5] = preshift;
147
167
 
148
168
  /* We wrap a call to the original method with a rescue block, and we use
149
169
  * rb_rescue2 to capture all Exception-inheriting exceptions (and if your
@@ -178,15 +198,12 @@ VALUE contrast_run_patches(const VALUE *wrapped_args) {
178
198
  switch (impl) {
179
199
  case IMPL_ALIAS_INSTANCE:
180
200
  case IMPL_ALIAS_SINGLETON:
181
- original_ret = rb_rescue2(contrast_patch_call_original, original_args,
182
- contrast_patch_call_rescue,
183
- (VALUE)rescue_args, rb_eException, 0);
201
+ original_ret = rb_rescue(ensure_wrapper, rescue_wrapper_args, rescue_func, Qnil);
184
202
  break;
185
203
  case IMPL_PREPEND_INSTANCE:
186
204
  case IMPL_PREPEND_SINGLETON:
187
- original_ret = rb_rescue2(contrast_call_super, original_args,
188
- contrast_patch_call_rescue,
189
- (VALUE)rescue_args, rb_eException, 0);
205
+ rescue_wrapper_args[0] = contrast_call_super;
206
+ original_ret = rb_rescue(ensure_wrapper, rescue_wrapper_args, rescue_func, Qnil);
190
207
  break;
191
208
  };
192
209
 
@@ -214,8 +231,10 @@ VALUE contrast_run_patches(const VALUE *wrapped_args) {
214
231
 
215
232
  VALUE contrast_ensure_function(const VALUE method_policy) {
216
233
  /* exit scope */
217
- rb_funcall(contrast_patcher(), rb_sym_exit_method_scope, 1, method_policy);
218
- rb_funcall(contrast_patcher(), rb_sym_exit_scope, 0);
234
+ VALUE scopes = rb_funcall(method_policy, rb_sym_scopes_to_exit, 0);
235
+
236
+ inst_methods_exit_method_scope(contrast_patcher(), scopes);
237
+ inst_methods_exit_cntr_scope(contrast_patcher(), 0);
219
238
 
220
239
  return Qnil;
221
240
  }
@@ -235,10 +254,10 @@ VALUE contrast_patch_dispatch(const int argc, const VALUE *argv,
235
254
  * which is unnecessary, or run Contrast analysis on Contrast code,
236
255
  * which will never terminate.
237
256
  */
238
- nested_scope = RTEST(rb_funcall(contrast_patcher(), rb_sym_in_scope, 0));
257
+ nested_scope = inst_methods_in_cntr_scope(contrast_patcher(), 0);
239
258
 
240
259
  /* enter scope */
241
- rb_funcall(contrast_patcher(), rb_sym_enter_scope, 0);
260
+ inst_methods_enter_cntr_scope(contrast_patcher(), 0);
242
261
 
243
262
  /* Get the name of the calling method */
244
263
  method = rb_funcall(object, rb_sym_method, 0);
@@ -270,7 +289,7 @@ VALUE contrast_patch_dispatch(const int argc, const VALUE *argv,
270
289
  }
271
290
 
272
291
  /* Check conditions for not doing Contrast analysis */
273
- if (nested_scope) {
292
+ if (nested_scope == Qtrue) {
274
293
  /* if we were in scope */
275
294
  do_contrast = 0;
276
295
  } else if (!RTEST(known)) {
@@ -299,7 +318,9 @@ VALUE contrast_patch_dispatch(const int argc, const VALUE *argv,
299
318
  }
300
319
 
301
320
  /* Enter any scopes specific to method policy */
302
- rb_funcall(contrast_patcher(), rb_sym_enter_method_scope, 1, method_policy);
321
+ VALUE scopes = rb_funcall(method_policy, rb_sym_scopes_to_enter, 0);
322
+
323
+ inst_methods_enter_method_scope(contrast_patcher(), scopes);
303
324
 
304
325
  /* If we're not doing Contrast analysis, exit scope and treat as normal. */
305
326
  if (!do_contrast) {
@@ -488,6 +509,9 @@ void Init_cs__contrast_patch(void) {
488
509
 
489
510
  rb_sym_enter_method_scope = rb_intern("enter_method_scope!");
490
511
  rb_sym_exit_method_scope = rb_intern("exit_method_scope!");
512
+ rb_sym_scopes_to_enter = rb_intern("scopes_to_enter");
513
+ rb_sym_scopes_to_exit = rb_intern("scopes_to_exit");
514
+
491
515
 
492
516
  rb_define_module_function(contrast_patcher(), "contrast_define_method",
493
517
  contrast_patch_define_method, 3);
@@ -500,4 +524,5 @@ void Init_cs__contrast_patch(void) {
500
524
 
501
525
  /* preshift_class = Contrast::Agent::Assess::PreShift */
502
526
  preshift_class = rb_define_class_under(assess, "PreShift", rb_cObject);
527
+
503
528
  }
@@ -18,6 +18,8 @@ static VALUE rb_sym_cs_to_s;
18
18
 
19
19
  static VALUE rb_sym_enter_method_scope;
20
20
  static VALUE rb_sym_exit_method_scope;
21
+ static VALUE rb_sym_scopes_to_enter;
22
+ static VALUE rb_sym_scopes_to_exit;
21
23
 
22
24
  static VALUE rb_sym_build_method_name;
23
25
  static VALUE rb_sym_info_for;