| OLD | NEW |
| 1 // Copyright 2014 The Crashpad Authors. All rights reserved. | 1 // Copyright 2014 The Crashpad Authors. All rights reserved. |
| 2 // | 2 // |
| 3 // Licensed under the Apache License, Version 2.0 (the "License"); | 3 // Licensed under the Apache License, Version 2.0 (the "License"); |
| 4 // you may not use this file except in compliance with the License. | 4 // you may not use this file except in compliance with the License. |
| 5 // You may obtain a copy of the License at | 5 // You may obtain a copy of the License at |
| 6 // | 6 // |
| 7 // http://www.apache.org/licenses/LICENSE-2.0 | 7 // http://www.apache.org/licenses/LICENSE-2.0 |
| 8 // | 8 // |
| 9 // Unless required by applicable law or agreed to in writing, software | 9 // Unless required by applicable law or agreed to in writing, software |
| 10 // distributed under the License is distributed on an "AS IS" BASIS, | 10 // distributed under the License is distributed on an "AS IS" BASIS, |
| (...skipping 26 matching lines...) Expand all Loading... |
| 37 const mach_port_t kClientRemotePort = 0x01010101; | 37 const mach_port_t kClientRemotePort = 0x01010101; |
| 38 const mach_port_t kServerLocalPort = 0x02020202; | 38 const mach_port_t kServerLocalPort = 0x02020202; |
| 39 const mach_port_t kExceptionThreadPort = 0x03030303; | 39 const mach_port_t kExceptionThreadPort = 0x03030303; |
| 40 const mach_port_t kExceptionTaskPort = 0x04040404; | 40 const mach_port_t kExceptionTaskPort = 0x04040404; |
| 41 | 41 |
| 42 // Other fake exception values. | 42 // Other fake exception values. |
| 43 const exception_type_t kExceptionType = EXC_BAD_ACCESS; | 43 const exception_type_t kExceptionType = EXC_BAD_ACCESS; |
| 44 | 44 |
| 45 // Test using an exception code with the high bit set to ensure that it gets | 45 // Test using an exception code with the high bit set to ensure that it gets |
| 46 // promoted to the wider mach_exception_data_type_t type as a signed quantity. | 46 // promoted to the wider mach_exception_data_type_t type as a signed quantity. |
| 47 const exception_data_type_t kExceptionCodes[] = { | 47 const exception_data_type_t kTestExceptonCodes[] = { |
| 48 KERN_PROTECTION_FAILURE, | 48 KERN_PROTECTION_FAILURE, |
| 49 static_cast<exception_data_type_t>(0xfedcba98), | 49 static_cast<exception_data_type_t>(0xfedcba98), |
| 50 }; | 50 }; |
| 51 | 51 |
| 52 const exception_data_type_t kMachExceptionCodes[] = { | 52 const exception_data_type_t kTestMachExceptionCodes[] = { |
| 53 KERN_PROTECTION_FAILURE, | 53 KERN_PROTECTION_FAILURE, |
| 54 static_cast<exception_data_type_t>(0xfedcba9876543210), | 54 static_cast<exception_data_type_t>(0xfedcba9876543210), |
| 55 }; | 55 }; |
| 56 | 56 |
| 57 const thread_state_flavor_t kThreadStateFlavor = MACHINE_THREAD_STATE; | 57 const thread_state_flavor_t kThreadStateFlavor = MACHINE_THREAD_STATE; |
| 58 const mach_msg_type_number_t kThreadStateFlavorCount = | 58 const mach_msg_type_number_t kThreadStateFlavorCount = |
| 59 MACHINE_THREAD_STATE_COUNT; | 59 MACHINE_THREAD_STATE_COUNT; |
| 60 | 60 |
| 61 void InitializeMachMsgPortDescriptor(mach_msg_port_descriptor_t* descriptor, | 61 void InitializeMachMsgPortDescriptor(mach_msg_port_descriptor_t* descriptor, |
| 62 mach_port_t port) { | 62 mach_port_t port) { |
| (...skipping 27 matching lines...) Expand all Loading... |
| 90 Head.msgh_size = sizeof(*this); | 90 Head.msgh_size = sizeof(*this); |
| 91 Head.msgh_remote_port = kClientRemotePort; | 91 Head.msgh_remote_port = kClientRemotePort; |
| 92 Head.msgh_local_port = kServerLocalPort; | 92 Head.msgh_local_port = kServerLocalPort; |
| 93 Head.msgh_id = 2401; | 93 Head.msgh_id = 2401; |
| 94 msgh_body.msgh_descriptor_count = 2; | 94 msgh_body.msgh_descriptor_count = 2; |
| 95 InitializeMachMsgPortDescriptor(&thread, kExceptionThreadPort); | 95 InitializeMachMsgPortDescriptor(&thread, kExceptionThreadPort); |
| 96 InitializeMachMsgPortDescriptor(&task, kExceptionTaskPort); | 96 InitializeMachMsgPortDescriptor(&task, kExceptionTaskPort); |
| 97 NDR = NDR_record; | 97 NDR = NDR_record; |
| 98 exception = kExceptionType; | 98 exception = kExceptionType; |
| 99 codeCnt = 2; | 99 codeCnt = 2; |
| 100 code[0] = kExceptionCodes[0]; | 100 code[0] = kTestExceptonCodes[0]; |
| 101 code[1] = kExceptionCodes[1]; | 101 code[1] = kTestExceptonCodes[1]; |
| 102 } | 102 } |
| 103 }; | 103 }; |
| 104 | 104 |
| 105 struct __attribute__((packed, aligned(4))) ExceptionRaiseReply { | 105 struct __attribute__((packed, aligned(4))) ExceptionRaiseReply { |
| 106 mach_msg_header_t Head; | 106 mach_msg_header_t Head; |
| 107 NDR_record_t NDR; | 107 NDR_record_t NDR; |
| 108 kern_return_t RetCode; | 108 kern_return_t RetCode; |
| 109 | 109 |
| 110 void InitializeForTesting() { | 110 void InitializeForTesting() { |
| 111 memset(this, 0x5a, sizeof(*this)); | 111 memset(this, 0x5a, sizeof(*this)); |
| 112 RetCode = KERN_FAILURE; | 112 RetCode = KERN_FAILURE; |
| 113 } | 113 } |
| 114 | 114 |
| 115 // Verify accepts a |behavior| parameter because the same message format and | 115 // Verify accepts a |behavior| parameter because the same message format and |
| 116 // verification function is used for ExceptionRaiseReply and | 116 // verification function is used for ExceptionRaiseReply and |
| 117 // MachExceptionRaiseReply. Knowing which behavior is expected allows the | 117 // MachExceptionRaiseReply. Knowing which behavior is expected allows the |
| 118 // message ID to be checked. | 118 // message ID to be checked. |
| 119 void Verify(exception_behavior_t behavior) { | 119 void Verify(exception_behavior_t behavior) { |
| 120 EXPECT_EQ(static_cast<mach_msg_bits_t>( | 120 EXPECT_EQ(static_cast<mach_msg_bits_t>( |
| 121 MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, 0)), | 121 MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, 0)), |
| 122 Head.msgh_bits); | 122 Head.msgh_bits); |
| 123 EXPECT_EQ(sizeof(*this), Head.msgh_size); | 123 EXPECT_EQ(sizeof(*this), Head.msgh_size); |
| 124 EXPECT_EQ(kClientRemotePort, Head.msgh_remote_port); | 124 EXPECT_EQ(kClientRemotePort, Head.msgh_remote_port); |
| 125 EXPECT_EQ(kMachPortNull, Head.msgh_local_port); | 125 EXPECT_EQ(kMachPortNull, Head.msgh_local_port); |
| 126 switch (behavior) { | 126 switch (behavior) { |
| 127 case EXCEPTION_DEFAULT: | 127 case EXCEPTION_DEFAULT: |
| 128 EXPECT_EQ(2501, Head.msgh_id); | 128 EXPECT_EQ(2501, Head.msgh_id); |
| 129 break; | 129 break; |
| 130 case static_cast<exception_behavior_t>(EXCEPTION_DEFAULT | | 130 case EXCEPTION_DEFAULT | kMachExceptionCodes: |
| 131 MACH_EXCEPTION_CODES): | |
| 132 EXPECT_EQ(2505, Head.msgh_id); | 131 EXPECT_EQ(2505, Head.msgh_id); |
| 133 break; | 132 break; |
| 134 default: | 133 default: |
| 135 ADD_FAILURE() << "behavior " << behavior << ", Head.msgh_id " | 134 ADD_FAILURE() << "behavior " << behavior << ", Head.msgh_id " |
| 136 << Head.msgh_id; | 135 << Head.msgh_id; |
| 137 break; | 136 break; |
| 138 } | 137 } |
| 139 EXPECT_EQ(0, memcmp(&NDR, &NDR_record, sizeof(NDR))); | 138 EXPECT_EQ(0, memcmp(&NDR, &NDR_record, sizeof(NDR))); |
| 140 EXPECT_EQ(KERN_SUCCESS, RetCode); | 139 EXPECT_EQ(KERN_SUCCESS, RetCode); |
| 141 } | 140 } |
| (...skipping 13 matching lines...) Expand all Loading... |
| 155 memset(this, 0xa5, sizeof(*this)); | 154 memset(this, 0xa5, sizeof(*this)); |
| 156 Head.msgh_bits = | 155 Head.msgh_bits = |
| 157 MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, MACH_MSG_TYPE_MAKE_SEND_ONCE); | 156 MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, MACH_MSG_TYPE_MAKE_SEND_ONCE); |
| 158 Head.msgh_size = sizeof(*this); | 157 Head.msgh_size = sizeof(*this); |
| 159 Head.msgh_remote_port = kClientRemotePort; | 158 Head.msgh_remote_port = kClientRemotePort; |
| 160 Head.msgh_local_port = kServerLocalPort; | 159 Head.msgh_local_port = kServerLocalPort; |
| 161 Head.msgh_id = 2402; | 160 Head.msgh_id = 2402; |
| 162 NDR = NDR_record; | 161 NDR = NDR_record; |
| 163 exception = kExceptionType; | 162 exception = kExceptionType; |
| 164 codeCnt = 2; | 163 codeCnt = 2; |
| 165 code[0] = kExceptionCodes[0]; | 164 code[0] = kTestExceptonCodes[0]; |
| 166 code[1] = kExceptionCodes[1]; | 165 code[1] = kTestExceptonCodes[1]; |
| 167 flavor = kThreadStateFlavor; | 166 flavor = kThreadStateFlavor; |
| 168 old_stateCnt = kThreadStateFlavorCount; | 167 old_stateCnt = kThreadStateFlavorCount; |
| 169 | 168 |
| 170 // Adjust the message size for the data that it’s actually carrying, which | 169 // Adjust the message size for the data that it’s actually carrying, which |
| 171 // may be smaller than the maximum that it can carry. | 170 // may be smaller than the maximum that it can carry. |
| 172 Head.msgh_size += sizeof(old_state[0]) * old_stateCnt - sizeof(old_state); | 171 Head.msgh_size += sizeof(old_state[0]) * old_stateCnt - sizeof(old_state); |
| 173 } | 172 } |
| 174 }; | 173 }; |
| 175 | 174 |
| 176 struct __attribute__((packed, aligned(4))) ExceptionRaiseStateReply { | 175 struct __attribute__((packed, aligned(4))) ExceptionRaiseStateReply { |
| (...skipping 21 matching lines...) Expand all Loading... |
| 198 EXPECT_EQ(sizeof(*this), Head.msgh_size); | 197 EXPECT_EQ(sizeof(*this), Head.msgh_size); |
| 199 EXPECT_EQ(kClientRemotePort, Head.msgh_remote_port); | 198 EXPECT_EQ(kClientRemotePort, Head.msgh_remote_port); |
| 200 EXPECT_EQ(kMachPortNull, Head.msgh_local_port); | 199 EXPECT_EQ(kMachPortNull, Head.msgh_local_port); |
| 201 switch (behavior) { | 200 switch (behavior) { |
| 202 case EXCEPTION_STATE: | 201 case EXCEPTION_STATE: |
| 203 EXPECT_EQ(2502, Head.msgh_id); | 202 EXPECT_EQ(2502, Head.msgh_id); |
| 204 break; | 203 break; |
| 205 case EXCEPTION_STATE_IDENTITY: | 204 case EXCEPTION_STATE_IDENTITY: |
| 206 EXPECT_EQ(2503, Head.msgh_id); | 205 EXPECT_EQ(2503, Head.msgh_id); |
| 207 break; | 206 break; |
| 208 case static_cast<exception_behavior_t>(EXCEPTION_STATE | | 207 case EXCEPTION_STATE | kMachExceptionCodes: |
| 209 MACH_EXCEPTION_CODES): | |
| 210 EXPECT_EQ(2506, Head.msgh_id); | 208 EXPECT_EQ(2506, Head.msgh_id); |
| 211 break; | 209 break; |
| 212 case static_cast<exception_behavior_t>(EXCEPTION_STATE_IDENTITY | | 210 case EXCEPTION_STATE_IDENTITY | kMachExceptionCodes: |
| 213 MACH_EXCEPTION_CODES): | |
| 214 EXPECT_EQ(2507, Head.msgh_id); | 211 EXPECT_EQ(2507, Head.msgh_id); |
| 215 break; | 212 break; |
| 216 default: | 213 default: |
| 217 ADD_FAILURE() << "behavior " << behavior << ", Head.msgh_id " | 214 ADD_FAILURE() << "behavior " << behavior << ", Head.msgh_id " |
| 218 << Head.msgh_id; | 215 << Head.msgh_id; |
| 219 break; | 216 break; |
| 220 } | 217 } |
| 221 EXPECT_EQ(0, memcmp(&NDR, &NDR_record, sizeof(NDR))); | 218 EXPECT_EQ(0, memcmp(&NDR, &NDR_record, sizeof(NDR))); |
| 222 EXPECT_EQ(KERN_SUCCESS, RetCode); | 219 EXPECT_EQ(KERN_SUCCESS, RetCode); |
| 223 EXPECT_EQ(kThreadStateFlavor, flavor); | 220 EXPECT_EQ(kThreadStateFlavor, flavor); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 246 Head.msgh_size = sizeof(*this); | 243 Head.msgh_size = sizeof(*this); |
| 247 Head.msgh_remote_port = kClientRemotePort; | 244 Head.msgh_remote_port = kClientRemotePort; |
| 248 Head.msgh_local_port = kServerLocalPort; | 245 Head.msgh_local_port = kServerLocalPort; |
| 249 Head.msgh_id = 2403; | 246 Head.msgh_id = 2403; |
| 250 msgh_body.msgh_descriptor_count = 2; | 247 msgh_body.msgh_descriptor_count = 2; |
| 251 InitializeMachMsgPortDescriptor(&thread, kExceptionThreadPort); | 248 InitializeMachMsgPortDescriptor(&thread, kExceptionThreadPort); |
| 252 InitializeMachMsgPortDescriptor(&task, kExceptionTaskPort); | 249 InitializeMachMsgPortDescriptor(&task, kExceptionTaskPort); |
| 253 NDR = NDR_record; | 250 NDR = NDR_record; |
| 254 exception = kExceptionType; | 251 exception = kExceptionType; |
| 255 codeCnt = 2; | 252 codeCnt = 2; |
| 256 code[0] = kExceptionCodes[0]; | 253 code[0] = kTestExceptonCodes[0]; |
| 257 code[1] = kExceptionCodes[1]; | 254 code[1] = kTestExceptonCodes[1]; |
| 258 flavor = kThreadStateFlavor; | 255 flavor = kThreadStateFlavor; |
| 259 old_stateCnt = kThreadStateFlavorCount; | 256 old_stateCnt = kThreadStateFlavorCount; |
| 260 | 257 |
| 261 // Adjust the message size for the data that it’s actually carrying, which | 258 // Adjust the message size for the data that it’s actually carrying, which |
| 262 // may be smaller than the maximum that it can carry. | 259 // may be smaller than the maximum that it can carry. |
| 263 Head.msgh_size += sizeof(old_state[0]) * old_stateCnt - sizeof(old_state); | 260 Head.msgh_size += sizeof(old_state[0]) * old_stateCnt - sizeof(old_state); |
| 264 } | 261 } |
| 265 }; | 262 }; |
| 266 | 263 |
| 267 // The reply messages for exception_raise_state and | 264 // The reply messages for exception_raise_state and |
| (...skipping 18 matching lines...) Expand all Loading... |
| 286 Head.msgh_size = sizeof(*this); | 283 Head.msgh_size = sizeof(*this); |
| 287 Head.msgh_remote_port = kClientRemotePort; | 284 Head.msgh_remote_port = kClientRemotePort; |
| 288 Head.msgh_local_port = kServerLocalPort; | 285 Head.msgh_local_port = kServerLocalPort; |
| 289 Head.msgh_id = 2405; | 286 Head.msgh_id = 2405; |
| 290 msgh_body.msgh_descriptor_count = 2; | 287 msgh_body.msgh_descriptor_count = 2; |
| 291 InitializeMachMsgPortDescriptor(&thread, kExceptionThreadPort); | 288 InitializeMachMsgPortDescriptor(&thread, kExceptionThreadPort); |
| 292 InitializeMachMsgPortDescriptor(&task, kExceptionTaskPort); | 289 InitializeMachMsgPortDescriptor(&task, kExceptionTaskPort); |
| 293 NDR = NDR_record; | 290 NDR = NDR_record; |
| 294 exception = kExceptionType; | 291 exception = kExceptionType; |
| 295 codeCnt = 2; | 292 codeCnt = 2; |
| 296 code[0] = kMachExceptionCodes[0]; | 293 code[0] = kTestMachExceptionCodes[0]; |
| 297 code[1] = kMachExceptionCodes[1]; | 294 code[1] = kTestMachExceptionCodes[1]; |
| 298 } | 295 } |
| 299 }; | 296 }; |
| 300 | 297 |
| 301 // The reply messages for exception_raise and mach_exception_raise are | 298 // The reply messages for exception_raise and mach_exception_raise are |
| 302 // identical. | 299 // identical. |
| 303 typedef ExceptionRaiseReply MachExceptionRaiseReply; | 300 typedef ExceptionRaiseReply MachExceptionRaiseReply; |
| 304 | 301 |
| 305 struct __attribute__((packed, aligned(4))) MachExceptionRaiseStateRequest { | 302 struct __attribute__((packed, aligned(4))) MachExceptionRaiseStateRequest { |
| 306 mach_msg_header_t Head; | 303 mach_msg_header_t Head; |
| 307 NDR_record_t NDR; | 304 NDR_record_t NDR; |
| 308 exception_type_t exception; | 305 exception_type_t exception; |
| 309 mach_msg_type_number_t codeCnt; | 306 mach_msg_type_number_t codeCnt; |
| 310 int64_t code[2]; | 307 int64_t code[2]; |
| 311 int flavor; | 308 int flavor; |
| 312 mach_msg_type_number_t old_stateCnt; | 309 mach_msg_type_number_t old_stateCnt; |
| 313 natural_t old_state[THREAD_STATE_MAX]; | 310 natural_t old_state[THREAD_STATE_MAX]; |
| 314 | 311 |
| 315 void InitializeForTesting() { | 312 void InitializeForTesting() { |
| 316 memset(this, 0xa5, sizeof(*this)); | 313 memset(this, 0xa5, sizeof(*this)); |
| 317 Head.msgh_bits = | 314 Head.msgh_bits = |
| 318 MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, MACH_MSG_TYPE_MAKE_SEND_ONCE); | 315 MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, MACH_MSG_TYPE_MAKE_SEND_ONCE); |
| 319 Head.msgh_size = sizeof(*this); | 316 Head.msgh_size = sizeof(*this); |
| 320 Head.msgh_remote_port = kClientRemotePort; | 317 Head.msgh_remote_port = kClientRemotePort; |
| 321 Head.msgh_local_port = kServerLocalPort; | 318 Head.msgh_local_port = kServerLocalPort; |
| 322 Head.msgh_id = 2406; | 319 Head.msgh_id = 2406; |
| 323 NDR = NDR_record; | 320 NDR = NDR_record; |
| 324 exception = kExceptionType; | 321 exception = kExceptionType; |
| 325 codeCnt = 2; | 322 codeCnt = 2; |
| 326 code[0] = kMachExceptionCodes[0]; | 323 code[0] = kTestMachExceptionCodes[0]; |
| 327 code[1] = kMachExceptionCodes[1]; | 324 code[1] = kTestMachExceptionCodes[1]; |
| 328 flavor = kThreadStateFlavor; | 325 flavor = kThreadStateFlavor; |
| 329 old_stateCnt = kThreadStateFlavorCount; | 326 old_stateCnt = kThreadStateFlavorCount; |
| 330 | 327 |
| 331 // Adjust the message size for the data that it’s actually carrying, which | 328 // Adjust the message size for the data that it’s actually carrying, which |
| 332 // may be smaller than the maximum that it can carry. | 329 // may be smaller than the maximum that it can carry. |
| 333 Head.msgh_size += sizeof(old_state[0]) * old_stateCnt - sizeof(old_state); | 330 Head.msgh_size += sizeof(old_state[0]) * old_stateCnt - sizeof(old_state); |
| 334 } | 331 } |
| 335 }; | 332 }; |
| 336 | 333 |
| 337 // The reply messages for exception_raise_state and mach_exception_raise_state | 334 // The reply messages for exception_raise_state and mach_exception_raise_state |
| (...skipping 22 matching lines...) Expand all Loading... |
| 360 Head.msgh_size = sizeof(*this); | 357 Head.msgh_size = sizeof(*this); |
| 361 Head.msgh_remote_port = kClientRemotePort; | 358 Head.msgh_remote_port = kClientRemotePort; |
| 362 Head.msgh_local_port = kServerLocalPort; | 359 Head.msgh_local_port = kServerLocalPort; |
| 363 Head.msgh_id = 2407; | 360 Head.msgh_id = 2407; |
| 364 msgh_body.msgh_descriptor_count = 2; | 361 msgh_body.msgh_descriptor_count = 2; |
| 365 InitializeMachMsgPortDescriptor(&thread, kExceptionThreadPort); | 362 InitializeMachMsgPortDescriptor(&thread, kExceptionThreadPort); |
| 366 InitializeMachMsgPortDescriptor(&task, kExceptionTaskPort); | 363 InitializeMachMsgPortDescriptor(&task, kExceptionTaskPort); |
| 367 NDR = NDR_record; | 364 NDR = NDR_record; |
| 368 exception = kExceptionType; | 365 exception = kExceptionType; |
| 369 codeCnt = 2; | 366 codeCnt = 2; |
| 370 code[0] = kMachExceptionCodes[0]; | 367 code[0] = kTestMachExceptionCodes[0]; |
| 371 code[1] = kMachExceptionCodes[1]; | 368 code[1] = kTestMachExceptionCodes[1]; |
| 372 flavor = kThreadStateFlavor; | 369 flavor = kThreadStateFlavor; |
| 373 old_stateCnt = kThreadStateFlavorCount; | 370 old_stateCnt = kThreadStateFlavorCount; |
| 374 | 371 |
| 375 // Adjust the message size for the data that it’s actually carrying, which | 372 // Adjust the message size for the data that it’s actually carrying, which |
| 376 // may be smaller than the maximum that it can carry. | 373 // may be smaller than the maximum that it can carry. |
| 377 Head.msgh_size += sizeof(old_state[0]) * old_stateCnt - sizeof(old_state); | 374 Head.msgh_size += sizeof(old_state[0]) * old_stateCnt - sizeof(old_state); |
| 378 } | 375 } |
| 379 }; | 376 }; |
| 380 | 377 |
| 381 // The reply messages for exception_raise_state_identity and | 378 // The reply messages for exception_raise_state_identity and |
| (...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 557 | 554 |
| 558 const exception_behavior_t kExceptionBehavior = EXCEPTION_DEFAULT; | 555 const exception_behavior_t kExceptionBehavior = EXCEPTION_DEFAULT; |
| 559 | 556 |
| 560 EXPECT_CALL(server, | 557 EXPECT_CALL(server, |
| 561 MockCatchMachException( | 558 MockCatchMachException( |
| 562 kExceptionBehavior, | 559 kExceptionBehavior, |
| 563 kServerLocalPort, | 560 kServerLocalPort, |
| 564 kExceptionThreadPort, | 561 kExceptionThreadPort, |
| 565 kExceptionTaskPort, | 562 kExceptionTaskPort, |
| 566 kExceptionType, | 563 kExceptionType, |
| 567 AreExceptionCodes(kExceptionCodes[0], kExceptionCodes[1]), | 564 AreExceptionCodes( |
| 565 kTestExceptonCodes[0], kTestExceptonCodes[1]), |
| 568 Pointee(Eq(THREAD_STATE_NONE)), | 566 Pointee(Eq(THREAD_STATE_NONE)), |
| 569 IsThreadStateCount(0u), | 567 IsThreadStateCount(0u), |
| 570 IsThreadStateCount(0u))) | 568 IsThreadStateCount(0u))) |
| 571 .WillOnce(Return(KERN_SUCCESS)) | 569 .WillOnce(Return(KERN_SUCCESS)) |
| 572 .RetiresOnSaturation(); | 570 .RetiresOnSaturation(); |
| 573 | 571 |
| 574 bool destroy_complex_request = false; | 572 bool destroy_complex_request = false; |
| 575 EXPECT_TRUE(server.MachMessageServerFunction( | 573 EXPECT_TRUE(server.MachMessageServerFunction( |
| 576 reinterpret_cast<mach_msg_header_t*>(&request), | 574 reinterpret_cast<mach_msg_header_t*>(&request), |
| 577 reinterpret_cast<mach_msg_header_t*>(&reply), | 575 reinterpret_cast<mach_msg_header_t*>(&reply), |
| (...skipping 18 matching lines...) Expand all Loading... |
| 596 | 594 |
| 597 const exception_behavior_t kExceptionBehavior = EXCEPTION_STATE; | 595 const exception_behavior_t kExceptionBehavior = EXCEPTION_STATE; |
| 598 | 596 |
| 599 EXPECT_CALL(server, | 597 EXPECT_CALL(server, |
| 600 MockCatchMachException( | 598 MockCatchMachException( |
| 601 kExceptionBehavior, | 599 kExceptionBehavior, |
| 602 kServerLocalPort, | 600 kServerLocalPort, |
| 603 MACH_PORT_NULL, | 601 MACH_PORT_NULL, |
| 604 MACH_PORT_NULL, | 602 MACH_PORT_NULL, |
| 605 kExceptionType, | 603 kExceptionType, |
| 606 AreExceptionCodes(kExceptionCodes[0], kExceptionCodes[1]), | 604 AreExceptionCodes( |
| 605 kTestExceptonCodes[0], kTestExceptonCodes[1]), |
| 607 Pointee(Eq(kThreadStateFlavor)), | 606 Pointee(Eq(kThreadStateFlavor)), |
| 608 IsThreadStateCount(kThreadStateFlavorCount), | 607 IsThreadStateCount(kThreadStateFlavorCount), |
| 609 IsThreadStateCount(arraysize(reply.new_state)))) | 608 IsThreadStateCount(arraysize(reply.new_state)))) |
| 610 .WillOnce(Return(KERN_SUCCESS)) | 609 .WillOnce(Return(KERN_SUCCESS)) |
| 611 .RetiresOnSaturation(); | 610 .RetiresOnSaturation(); |
| 612 | 611 |
| 613 bool destroy_complex_request = false; | 612 bool destroy_complex_request = false; |
| 614 EXPECT_TRUE(server.MachMessageServerFunction( | 613 EXPECT_TRUE(server.MachMessageServerFunction( |
| 615 reinterpret_cast<mach_msg_header_t*>(&request), | 614 reinterpret_cast<mach_msg_header_t*>(&request), |
| 616 reinterpret_cast<mach_msg_header_t*>(&reply), | 615 reinterpret_cast<mach_msg_header_t*>(&reply), |
| (...skipping 21 matching lines...) Expand all Loading... |
| 638 | 637 |
| 639 const exception_behavior_t kExceptionBehavior = EXCEPTION_STATE_IDENTITY; | 638 const exception_behavior_t kExceptionBehavior = EXCEPTION_STATE_IDENTITY; |
| 640 | 639 |
| 641 EXPECT_CALL(server, | 640 EXPECT_CALL(server, |
| 642 MockCatchMachException( | 641 MockCatchMachException( |
| 643 kExceptionBehavior, | 642 kExceptionBehavior, |
| 644 kServerLocalPort, | 643 kServerLocalPort, |
| 645 kExceptionThreadPort, | 644 kExceptionThreadPort, |
| 646 kExceptionTaskPort, | 645 kExceptionTaskPort, |
| 647 kExceptionType, | 646 kExceptionType, |
| 648 AreExceptionCodes(kExceptionCodes[0], kExceptionCodes[1]), | 647 AreExceptionCodes( |
| 648 kTestExceptonCodes[0], kTestExceptonCodes[1]), |
| 649 Pointee(Eq(kThreadStateFlavor)), | 649 Pointee(Eq(kThreadStateFlavor)), |
| 650 IsThreadStateCount(kThreadStateFlavorCount), | 650 IsThreadStateCount(kThreadStateFlavorCount), |
| 651 IsThreadStateCount(arraysize(reply.new_state)))) | 651 IsThreadStateCount(arraysize(reply.new_state)))) |
| 652 .WillOnce(Return(KERN_SUCCESS)) | 652 .WillOnce(Return(KERN_SUCCESS)) |
| 653 .RetiresOnSaturation(); | 653 .RetiresOnSaturation(); |
| 654 | 654 |
| 655 bool destroy_complex_request = false; | 655 bool destroy_complex_request = false; |
| 656 EXPECT_TRUE(server.MachMessageServerFunction( | 656 EXPECT_TRUE(server.MachMessageServerFunction( |
| 657 reinterpret_cast<mach_msg_header_t*>(&request), | 657 reinterpret_cast<mach_msg_header_t*>(&request), |
| 658 reinterpret_cast<mach_msg_header_t*>(&reply), | 658 reinterpret_cast<mach_msg_header_t*>(&reply), |
| (...skipping 20 matching lines...) Expand all Loading... |
| 679 EXCEPTION_DEFAULT | MACH_EXCEPTION_CODES; | 679 EXCEPTION_DEFAULT | MACH_EXCEPTION_CODES; |
| 680 | 680 |
| 681 EXPECT_CALL( | 681 EXPECT_CALL( |
| 682 server, | 682 server, |
| 683 MockCatchMachException( | 683 MockCatchMachException( |
| 684 kExceptionBehavior, | 684 kExceptionBehavior, |
| 685 kServerLocalPort, | 685 kServerLocalPort, |
| 686 kExceptionThreadPort, | 686 kExceptionThreadPort, |
| 687 kExceptionTaskPort, | 687 kExceptionTaskPort, |
| 688 kExceptionType, | 688 kExceptionType, |
| 689 AreExceptionCodes(kMachExceptionCodes[0], kMachExceptionCodes[1]), | 689 AreExceptionCodes( |
| 690 kTestMachExceptionCodes[0], kTestMachExceptionCodes[1]), |
| 690 Pointee(Eq(THREAD_STATE_NONE)), | 691 Pointee(Eq(THREAD_STATE_NONE)), |
| 691 IsThreadStateCount(0u), | 692 IsThreadStateCount(0u), |
| 692 IsThreadStateCount(0u))) | 693 IsThreadStateCount(0u))) |
| 693 .WillOnce(Return(KERN_SUCCESS)) | 694 .WillOnce(Return(KERN_SUCCESS)) |
| 694 .RetiresOnSaturation(); | 695 .RetiresOnSaturation(); |
| 695 | 696 |
| 696 bool destroy_complex_request = false; | 697 bool destroy_complex_request = false; |
| 697 EXPECT_TRUE(server.MachMessageServerFunction( | 698 EXPECT_TRUE(server.MachMessageServerFunction( |
| 698 reinterpret_cast<mach_msg_header_t*>(&request), | 699 reinterpret_cast<mach_msg_header_t*>(&request), |
| 699 reinterpret_cast<mach_msg_header_t*>(&reply), | 700 reinterpret_cast<mach_msg_header_t*>(&reply), |
| (...skipping 20 matching lines...) Expand all Loading... |
| 720 EXCEPTION_STATE | MACH_EXCEPTION_CODES; | 721 EXCEPTION_STATE | MACH_EXCEPTION_CODES; |
| 721 | 722 |
| 722 EXPECT_CALL( | 723 EXPECT_CALL( |
| 723 server, | 724 server, |
| 724 MockCatchMachException( | 725 MockCatchMachException( |
| 725 kExceptionBehavior, | 726 kExceptionBehavior, |
| 726 kServerLocalPort, | 727 kServerLocalPort, |
| 727 MACH_PORT_NULL, | 728 MACH_PORT_NULL, |
| 728 MACH_PORT_NULL, | 729 MACH_PORT_NULL, |
| 729 kExceptionType, | 730 kExceptionType, |
| 730 AreExceptionCodes(kMachExceptionCodes[0], kMachExceptionCodes[1]), | 731 AreExceptionCodes( |
| 732 kTestMachExceptionCodes[0], kTestMachExceptionCodes[1]), |
| 731 Pointee(Eq(kThreadStateFlavor)), | 733 Pointee(Eq(kThreadStateFlavor)), |
| 732 IsThreadStateCount(kThreadStateFlavorCount), | 734 IsThreadStateCount(kThreadStateFlavorCount), |
| 733 IsThreadStateCount(arraysize(reply.new_state)))) | 735 IsThreadStateCount(arraysize(reply.new_state)))) |
| 734 .WillOnce(Return(KERN_SUCCESS)) | 736 .WillOnce(Return(KERN_SUCCESS)) |
| 735 .RetiresOnSaturation(); | 737 .RetiresOnSaturation(); |
| 736 | 738 |
| 737 bool destroy_complex_request = false; | 739 bool destroy_complex_request = false; |
| 738 EXPECT_TRUE(server.MachMessageServerFunction( | 740 EXPECT_TRUE(server.MachMessageServerFunction( |
| 739 reinterpret_cast<mach_msg_header_t*>(&request), | 741 reinterpret_cast<mach_msg_header_t*>(&request), |
| 740 reinterpret_cast<mach_msg_header_t*>(&reply), | 742 reinterpret_cast<mach_msg_header_t*>(&reply), |
| (...skipping 23 matching lines...) Expand all Loading... |
| 764 EXCEPTION_STATE_IDENTITY | MACH_EXCEPTION_CODES; | 766 EXCEPTION_STATE_IDENTITY | MACH_EXCEPTION_CODES; |
| 765 | 767 |
| 766 EXPECT_CALL( | 768 EXPECT_CALL( |
| 767 server, | 769 server, |
| 768 MockCatchMachException( | 770 MockCatchMachException( |
| 769 kExceptionBehavior, | 771 kExceptionBehavior, |
| 770 kServerLocalPort, | 772 kServerLocalPort, |
| 771 kExceptionThreadPort, | 773 kExceptionThreadPort, |
| 772 kExceptionTaskPort, | 774 kExceptionTaskPort, |
| 773 kExceptionType, | 775 kExceptionType, |
| 774 AreExceptionCodes(kMachExceptionCodes[0], kMachExceptionCodes[1]), | 776 AreExceptionCodes( |
| 777 kTestMachExceptionCodes[0], kTestMachExceptionCodes[1]), |
| 775 Pointee(Eq(kThreadStateFlavor)), | 778 Pointee(Eq(kThreadStateFlavor)), |
| 776 IsThreadStateCount(kThreadStateFlavorCount), | 779 IsThreadStateCount(kThreadStateFlavorCount), |
| 777 IsThreadStateCount(arraysize(reply.new_state)))) | 780 IsThreadStateCount(arraysize(reply.new_state)))) |
| 778 .WillOnce(Return(KERN_SUCCESS)) | 781 .WillOnce(Return(KERN_SUCCESS)) |
| 779 .RetiresOnSaturation(); | 782 .RetiresOnSaturation(); |
| 780 | 783 |
| 781 bool destroy_complex_request = false; | 784 bool destroy_complex_request = false; |
| 782 EXPECT_TRUE(server.MachMessageServerFunction( | 785 EXPECT_TRUE(server.MachMessageServerFunction( |
| 783 reinterpret_cast<mach_msg_header_t*>(&request), | 786 reinterpret_cast<mach_msg_header_t*>(&request), |
| 784 reinterpret_cast<mach_msg_header_t*>(&reply), | 787 reinterpret_cast<mach_msg_header_t*>(&reply), |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 917 int sig = (code[0] >> 24) & 0xff; | 920 int sig = (code[0] >> 24) & 0xff; |
| 918 SetExpectedChildTermination(kTerminationSignal, sig); | 921 SetExpectedChildTermination(kTerminationSignal, sig); |
| 919 } | 922 } |
| 920 | 923 |
| 921 if (has_state) { | 924 if (has_state) { |
| 922 EXPECT_EQ(flavor_, *flavor); | 925 EXPECT_EQ(flavor_, *flavor); |
| 923 EXPECT_EQ(state_count_, old_state_count); | 926 EXPECT_EQ(state_count_, old_state_count); |
| 924 EXPECT_NE(static_cast<const natural_t*>(NULL), old_state); | 927 EXPECT_NE(static_cast<const natural_t*>(NULL), old_state); |
| 925 EXPECT_EQ(static_cast<mach_msg_type_number_t>(THREAD_STATE_MAX), | 928 EXPECT_EQ(static_cast<mach_msg_type_number_t>(THREAD_STATE_MAX), |
| 926 *new_state_count); | 929 *new_state_count); |
| 927 EXPECT_NE(static_cast<const natural_t*>(NULL), new_state); | 930 EXPECT_NE(static_cast<natural_t*>(NULL), new_state); |
| 928 } else { | 931 } else { |
| 929 EXPECT_EQ(THREAD_STATE_NONE, *flavor); | 932 EXPECT_EQ(THREAD_STATE_NONE, *flavor); |
| 930 EXPECT_EQ(0u, old_state_count); | 933 EXPECT_EQ(0u, old_state_count); |
| 931 EXPECT_EQ(NULL, old_state); | 934 EXPECT_EQ(NULL, old_state); |
| 932 EXPECT_EQ(0u, *new_state_count); | 935 EXPECT_EQ(0u, *new_state_count); |
| 933 EXPECT_EQ(NULL, new_state); | 936 EXPECT_EQ(NULL, new_state); |
| 934 } | 937 } |
| 935 | 938 |
| 936 // Even for an EXC_CRASH handler, returning KERN_SUCCESS with a | 939 // Even for an EXC_CRASH handler, returning KERN_SUCCESS with a |
| 937 // state-carrying reply will cause the kernel to try to set a new thread | 940 // state-carrying reply will cause the kernel to try to set a new thread |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1078 | 1081 |
| 1079 TestExcServerVariants test_exc_server_variants( | 1082 TestExcServerVariants test_exc_server_variants( |
| 1080 MACH_EXCEPTION_CODES | EXCEPTION_STATE_IDENTITY, | 1083 MACH_EXCEPTION_CODES | EXCEPTION_STATE_IDENTITY, |
| 1081 test.flavor, | 1084 test.flavor, |
| 1082 test.count); | 1085 test.count); |
| 1083 test_exc_server_variants.Run(); | 1086 test_exc_server_variants.Run(); |
| 1084 } | 1087 } |
| 1085 } | 1088 } |
| 1086 | 1089 |
| 1087 } // namespace | 1090 } // namespace |
| OLD | NEW |