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 1014 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1025 EXPECT_EQ(nullptr, old_state); | 1025 EXPECT_EQ(nullptr, old_state); |
1026 EXPECT_EQ(0u, *new_state_count); | 1026 EXPECT_EQ(0u, *new_state_count); |
1027 EXPECT_EQ(nullptr, new_state); | 1027 EXPECT_EQ(nullptr, new_state); |
1028 } | 1028 } |
1029 | 1029 |
1030 EXPECT_EQ(implicit_cast<mach_msg_trailer_type_t>(MACH_MSG_TRAILER_FORMAT_0), | 1030 EXPECT_EQ(implicit_cast<mach_msg_trailer_type_t>(MACH_MSG_TRAILER_FORMAT_0), |
1031 trailer->msgh_trailer_type); | 1031 trailer->msgh_trailer_type); |
1032 EXPECT_EQ(REQUESTED_TRAILER_SIZE(kMachMessageOptions), | 1032 EXPECT_EQ(REQUESTED_TRAILER_SIZE(kMachMessageOptions), |
1033 trailer->msgh_trailer_size); | 1033 trailer->msgh_trailer_size); |
1034 | 1034 |
1035 ExcServerCopyState( | |
1036 behavior, old_state, old_state_count, new_state, new_state_count); | |
1037 | |
1035 return ExcServerSuccessfulReturnValue(behavior, false); | 1038 return ExcServerSuccessfulReturnValue(behavior, false); |
1036 } | 1039 } |
1037 | 1040 |
1038 private: | 1041 private: |
1039 // MachMultiprocess: | 1042 // MachMultiprocess: |
1040 | 1043 |
1041 void MachMultiprocessParent() override { | 1044 void MachMultiprocessParent() override { |
1042 UniversalMachExcServer universal_mach_exc_server(this); | 1045 UniversalMachExcServer universal_mach_exc_server(this); |
1043 | 1046 |
1044 kern_return_t kr = | 1047 kern_return_t kr = |
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1268 index, | 1271 index, |
1269 test_data.behavior, | 1272 test_data.behavior, |
1270 test_data.set_thread_state ? "true" : "false")); | 1273 test_data.set_thread_state ? "true" : "false")); |
1271 | 1274 |
1272 EXPECT_EQ(test_data.kr, | 1275 EXPECT_EQ(test_data.kr, |
1273 ExcServerSuccessfulReturnValue(test_data.behavior, | 1276 ExcServerSuccessfulReturnValue(test_data.behavior, |
1274 test_data.set_thread_state)); | 1277 test_data.set_thread_state)); |
1275 } | 1278 } |
1276 } | 1279 } |
1277 | 1280 |
1281 TEST(ExcServerVariants, ExcServerCopyState) { | |
1282 const natural_t old_state[] = {1, 2, 3, 4, 5}; | |
1283 natural_t new_state[10] = {}; | |
1284 | |
1285 const mach_msg_type_number_t old_state_count = arraysize(old_state); | |
1286 mach_msg_type_number_t new_state_count = arraysize(new_state); | |
1287 | |
1288 // EXCEPTION_DEFAULT (with or without MACH_EXCEPTION_CODES) is not | |
1289 // state-carrying. new_state and new_state_count should be untouched. | |
1290 ExcServerCopyState(EXCEPTION_DEFAULT, | |
1291 old_state, | |
1292 old_state_count, | |
1293 new_state, | |
1294 &new_state_count); | |
1295 EXPECT_EQ(arraysize(new_state), new_state_count); | |
1296 for (size_t i = 0; i < arraysize(new_state); ++i) { | |
1297 EXPECT_EQ(0u, new_state[i]) << "i " << i; | |
1298 } | |
1299 | |
1300 ExcServerCopyState(MACH_EXCEPTION_CODES | EXCEPTION_DEFAULT, | |
1301 old_state, | |
1302 old_state_count, | |
1303 new_state, | |
1304 &new_state_count); | |
1305 EXPECT_EQ(arraysize(new_state), new_state_count); | |
1306 for (size_t i = 0; i < arraysize(new_state); ++i) { | |
1307 EXPECT_EQ(0u, new_state[i]) << "i " << i; | |
1308 } | |
1309 | |
1310 // This is a state-carrying exception where old_state_count is small. | |
1311 mach_msg_type_number_t copy_limit = 2; | |
1312 ExcServerCopyState( | |
1313 EXCEPTION_STATE, old_state, copy_limit, new_state, &new_state_count); | |
1314 EXPECT_EQ(copy_limit, new_state_count); | |
1315 for (size_t i = 0; i < copy_limit; ++i) { | |
1316 EXPECT_EQ(old_state[i], new_state[i]) << "i " << i; | |
1317 } | |
1318 for (size_t i = copy_limit; i < arraysize(new_state); ++i) { | |
1319 EXPECT_EQ(0u, new_state[i]) << "i " << i; | |
1320 } | |
1321 | |
1322 // This is a state-carrying exception where new_state_count is small. | |
1323 copy_limit = 3; | |
1324 new_state_count = copy_limit; | |
1325 ExcServerCopyState(EXCEPTION_STATE_IDENTITY, | |
1326 old_state, | |
1327 old_state_count, | |
1328 new_state, | |
1329 &new_state_count); | |
1330 EXPECT_EQ(copy_limit, new_state_count); | |
1331 for (size_t i = 0; i < new_state_count; ++i) { | |
1332 EXPECT_EQ(old_state[i], new_state[i]) << "i " << i; | |
1333 } | |
1334 for (size_t i = new_state_count; i < arraysize(new_state); ++i) { | |
Robert Sesek
2015/03/31 23:03:31
You use |copy_limit| on line 1318 instead of |new_
Mark Mentovai
2015/03/31 23:13:24
Robert Sesek wrote:
| |
1335 EXPECT_EQ(0u, new_state[i]) << "i " << i; | |
1336 } | |
1337 | |
1338 // This is a state-carrying exception where all of old_state is copied to | |
1339 // new_state, which is large enough to receive it and then some. | |
1340 new_state_count = arraysize(new_state); | |
1341 ExcServerCopyState(MACH_EXCEPTION_CODES | EXCEPTION_STATE_IDENTITY, | |
1342 old_state, | |
1343 old_state_count, | |
1344 new_state, | |
1345 &new_state_count); | |
1346 EXPECT_EQ(old_state_count, new_state_count); | |
1347 for (size_t i = 0; i < arraysize(old_state); ++i) { | |
1348 EXPECT_EQ(old_state[i], new_state[i]) << "i " << i; | |
1349 } | |
1350 for (size_t i = arraysize(old_state); i < arraysize(new_state); ++i) { | |
1351 EXPECT_EQ(0u, new_state[i]) << "i " << i; | |
1352 } | |
1353 } | |
1354 | |
1278 } // namespace | 1355 } // namespace |
1279 } // namespace test | 1356 } // namespace test |
1280 } // namespace crashpad | 1357 } // namespace crashpad |
OLD | NEW |