limit.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584
  1. #include <msgpack.hpp>
  2. #include <gtest/gtest.h>
  3. #include <sstream>
  4. TEST(limit, unpack_array_no_over)
  5. {
  6. std::stringstream ss;
  7. std::vector<int> v;
  8. v.push_back(1);
  9. v.push_back(2);
  10. v.push_back(3);
  11. msgpack::pack(ss, v);
  12. try {
  13. msgpack::object_handle oh =
  14. msgpack::unpack(ss.str().c_str(), ss.str().size(), MSGPACK_NULLPTR, MSGPACK_NULLPTR,
  15. msgpack::unpack_limit(3, 0, 0, 0, 0));
  16. EXPECT_TRUE(true);
  17. }
  18. catch(msgpack::array_size_overflow const&) {
  19. EXPECT_TRUE(false);
  20. }
  21. catch(...) {
  22. EXPECT_TRUE(false);
  23. }
  24. }
  25. TEST(limit, unpack_array_over)
  26. {
  27. std::stringstream ss;
  28. std::vector<int> v;
  29. v.push_back(1);
  30. v.push_back(2);
  31. v.push_back(3);
  32. msgpack::pack(ss, v);
  33. try {
  34. msgpack::object_handle oh =
  35. msgpack::unpack(ss.str().c_str(), ss.str().size(), MSGPACK_NULLPTR, MSGPACK_NULLPTR,
  36. msgpack::unpack_limit(2, 0, 0, 0, 0));
  37. EXPECT_TRUE(false);
  38. }
  39. catch(msgpack::array_size_overflow const&) {
  40. EXPECT_TRUE(true);
  41. }
  42. catch(...) {
  43. EXPECT_TRUE(false);
  44. }
  45. }
  46. TEST(limit, unpack_map_no_over)
  47. {
  48. std::stringstream ss;
  49. std::map<int, int> m;
  50. m[1] = 1;
  51. m[2] = 2;
  52. m[3] = 3;
  53. msgpack::pack(ss, m);
  54. try {
  55. msgpack::object_handle oh =
  56. msgpack::unpack(ss.str().c_str(), ss.str().size(), MSGPACK_NULLPTR, MSGPACK_NULLPTR,
  57. msgpack::unpack_limit(0, 3, 0, 0, 0));
  58. EXPECT_TRUE(true);
  59. }
  60. catch(msgpack::map_size_overflow const&) {
  61. EXPECT_TRUE(false);
  62. }
  63. catch(...) {
  64. EXPECT_TRUE(false);
  65. }
  66. }
  67. TEST(limit, unpack_map_over)
  68. {
  69. std::stringstream ss;
  70. std::map<int, int> m;
  71. m[1] = 1;
  72. m[2] = 2;
  73. m[3] = 3;
  74. msgpack::pack(ss, m);
  75. try {
  76. msgpack::object_handle oh =
  77. msgpack::unpack(ss.str().c_str(), ss.str().size(), MSGPACK_NULLPTR, MSGPACK_NULLPTR,
  78. msgpack::unpack_limit(0, 2, 0, 0, 0));
  79. EXPECT_TRUE(false);
  80. }
  81. catch(msgpack::map_size_overflow const&) {
  82. EXPECT_TRUE(true);
  83. }
  84. catch(...) {
  85. EXPECT_TRUE(false);
  86. }
  87. }
  88. TEST(limit, unpack_str_no_over)
  89. {
  90. std::stringstream ss;
  91. std::string s("123");
  92. msgpack::pack(ss, s);
  93. try {
  94. msgpack::object_handle oh =
  95. msgpack::unpack(ss.str().c_str(), ss.str().size(), MSGPACK_NULLPTR, MSGPACK_NULLPTR,
  96. msgpack::unpack_limit(0, 0, 3, 0, 0));
  97. EXPECT_TRUE(true);
  98. }
  99. catch(msgpack::str_size_overflow const&) {
  100. EXPECT_TRUE(false);
  101. }
  102. catch(...) {
  103. EXPECT_TRUE(false);
  104. }
  105. }
  106. TEST(limit, unpack_str_over)
  107. {
  108. std::stringstream ss;
  109. std::string s("123");
  110. msgpack::pack(ss, s);
  111. try {
  112. msgpack::object_handle oh =
  113. msgpack::unpack(ss.str().c_str(), ss.str().size(), MSGPACK_NULLPTR, MSGPACK_NULLPTR,
  114. msgpack::unpack_limit(0, 0, 2, 0, 0));
  115. EXPECT_TRUE(false);
  116. }
  117. catch(msgpack::str_size_overflow const&) {
  118. EXPECT_TRUE(true);
  119. }
  120. catch(...) {
  121. EXPECT_TRUE(false);
  122. }
  123. }
  124. TEST(limit, unpack_bin_no_over)
  125. {
  126. std::stringstream ss;
  127. std::vector<char> v;
  128. v.push_back('1');
  129. v.push_back('2');
  130. v.push_back('3');
  131. msgpack::pack(ss, v);
  132. try {
  133. msgpack::object_handle oh =
  134. msgpack::unpack(ss.str().c_str(), ss.str().size(), MSGPACK_NULLPTR, MSGPACK_NULLPTR,
  135. msgpack::unpack_limit(0, 0, 0, 3, 0));
  136. EXPECT_TRUE(true);
  137. }
  138. catch(msgpack::bin_size_overflow const&) {
  139. EXPECT_TRUE(false);
  140. }
  141. catch(...) {
  142. EXPECT_TRUE(false);
  143. }
  144. }
  145. TEST(limit, unpack_bin_over)
  146. {
  147. std::stringstream ss;
  148. std::vector<char> v;
  149. v.push_back('1');
  150. v.push_back('2');
  151. v.push_back('3');
  152. msgpack::pack(ss, v);
  153. try {
  154. msgpack::object_handle oh =
  155. msgpack::unpack(ss.str().c_str(), ss.str().size(), MSGPACK_NULLPTR, MSGPACK_NULLPTR,
  156. msgpack::unpack_limit(0, 0, 0, 2, 0));
  157. EXPECT_TRUE(false);
  158. }
  159. catch(msgpack::bin_size_overflow const&) {
  160. EXPECT_TRUE(true);
  161. }
  162. catch(...) {
  163. EXPECT_TRUE(false);
  164. }
  165. }
  166. TEST(limit, unpack_ext_no_over)
  167. {
  168. std::stringstream ss;
  169. msgpack::packer<std::stringstream> packer(ss);
  170. char const buf [] = { 1, 2, 3 };
  171. packer.pack_ext(sizeof(buf), 1);
  172. packer.pack_ext_body(buf, sizeof(buf));
  173. try {
  174. msgpack::object_handle oh =
  175. msgpack::unpack(ss.str().c_str(), ss.str().size(), MSGPACK_NULLPTR, MSGPACK_NULLPTR,
  176. msgpack::unpack_limit(0, 0, 0, 0, 3+1));
  177. EXPECT_TRUE(true);
  178. }
  179. catch(msgpack::ext_size_overflow const&) {
  180. EXPECT_TRUE(false);
  181. }
  182. catch(...) {
  183. EXPECT_TRUE(false);
  184. }
  185. }
  186. TEST(limit, unpack_ext_over)
  187. {
  188. std::stringstream ss;
  189. msgpack::packer<std::stringstream> packer(ss);
  190. char const buf [] = { 1, 2, 3 };
  191. packer.pack_ext(sizeof(buf), 1);
  192. packer.pack_ext_body(buf, sizeof(buf));
  193. try {
  194. msgpack::object_handle oh =
  195. msgpack::unpack(ss.str().c_str(), ss.str().size(), MSGPACK_NULLPTR, MSGPACK_NULLPTR,
  196. msgpack::unpack_limit(0, 0, 0, 0, 2+1));
  197. EXPECT_TRUE(false);
  198. }
  199. catch(msgpack::ext_size_overflow const&) {
  200. EXPECT_TRUE(true);
  201. }
  202. catch(...) {
  203. EXPECT_TRUE(false);
  204. }
  205. }
  206. TEST(limit, unpack_ext_over_32_bit)
  207. {
  208. if (sizeof(std::size_t) == 4) {
  209. char const buf [] = {
  210. static_cast<char>(0xc9u),
  211. static_cast<char>(0xffu),
  212. static_cast<char>(0xffu),
  213. static_cast<char>(0xffu),
  214. static_cast<char>(0xffu),
  215. static_cast<char>(0x01u),
  216. };
  217. try {
  218. msgpack::object_handle unp;
  219. msgpack::unpack(unp, buf, sizeof(buf), MSGPACK_NULLPTR, MSGPACK_NULLPTR,
  220. msgpack::unpack_limit(0, 0, 0, 0, 0xffffffff));
  221. EXPECT_TRUE(false);
  222. }
  223. catch(msgpack::ext_size_overflow const&) {
  224. EXPECT_TRUE(true);
  225. }
  226. catch(...) {
  227. EXPECT_TRUE(false);
  228. }
  229. }
  230. }
  231. TEST(limit, unpack_ext_no_over_64_bit)
  232. {
  233. if (sizeof(std::size_t) == 8) {
  234. char const buf [] = {
  235. static_cast<char>(0xc9u),
  236. static_cast<char>(0xffu),
  237. static_cast<char>(0xffu),
  238. static_cast<char>(0xffu),
  239. static_cast<char>(0xffu),
  240. static_cast<char>(0x01u),
  241. };
  242. try {
  243. msgpack::object_handle unp;
  244. msgpack::unpack(unp, buf, sizeof(buf), MSGPACK_NULLPTR, MSGPACK_NULLPTR,
  245. msgpack::unpack_limit(0, 0, 0, 0, 0xffffffff));
  246. EXPECT_TRUE(false);
  247. }
  248. catch(msgpack::ext_size_overflow const&) {
  249. EXPECT_TRUE(false);
  250. }
  251. catch(msgpack::insufficient_bytes const&) {
  252. EXPECT_TRUE(true);
  253. }
  254. catch(...) {
  255. EXPECT_TRUE(false);
  256. }
  257. }
  258. }
  259. TEST(limit, unpack_depth_no_over)
  260. {
  261. std::stringstream ss;
  262. std::vector<int> inner;
  263. inner.push_back(1);
  264. std::vector<std::vector<int> > outer;
  265. outer.push_back(inner);
  266. msgpack::pack(ss, outer);
  267. try {
  268. msgpack::object_handle unp;
  269. msgpack::unpack(unp, ss.str().c_str(), ss.str().size(), MSGPACK_NULLPTR, MSGPACK_NULLPTR,
  270. msgpack::unpack_limit(1, 0, 0, 0, 0, 2));
  271. EXPECT_TRUE(true);
  272. }
  273. catch(msgpack::depth_size_overflow const&) {
  274. EXPECT_TRUE(false);
  275. }
  276. catch(...) {
  277. EXPECT_TRUE(false);
  278. }
  279. }
  280. TEST(limit, unpack_depth_over)
  281. {
  282. std::stringstream ss;
  283. std::vector<int> inner;
  284. inner.push_back(1);
  285. std::vector<std::vector<int> > outer;
  286. outer.push_back(inner);
  287. msgpack::pack(ss, outer);
  288. try {
  289. msgpack::object_handle unp;
  290. msgpack::unpack(unp, ss.str().c_str(), ss.str().size(), MSGPACK_NULLPTR, MSGPACK_NULLPTR,
  291. msgpack::unpack_limit(1, 0, 0, 0, 0, 1));
  292. EXPECT_TRUE(false);
  293. }
  294. catch(msgpack::depth_size_overflow const&) {
  295. EXPECT_TRUE(true);
  296. }
  297. catch(...) {
  298. EXPECT_TRUE(false);
  299. }
  300. }
  301. #if !defined(MSGPACK_USE_CPP03)
  302. TEST(limit, unpack_array_over_cpp11_no_off_no_ref)
  303. {
  304. std::stringstream ss;
  305. std::vector<int> v;
  306. v.push_back(1);
  307. v.push_back(2);
  308. v.push_back(3);
  309. msgpack::pack(ss, v);
  310. try {
  311. msgpack::object_handle unp =
  312. msgpack::unpack(ss.str().c_str(), ss.str().size(), MSGPACK_NULLPTR, MSGPACK_NULLPTR,
  313. msgpack::unpack_limit(2, 0, 0, 0, 0));
  314. EXPECT_TRUE(false);
  315. }
  316. catch(msgpack::array_size_overflow const&) {
  317. EXPECT_TRUE(true);
  318. }
  319. catch(...) {
  320. EXPECT_TRUE(false);
  321. }
  322. }
  323. TEST(limit, unpack_array_over_cpp11_no_off_ref)
  324. {
  325. std::stringstream ss;
  326. std::vector<int> v;
  327. v.push_back(1);
  328. v.push_back(2);
  329. v.push_back(3);
  330. msgpack::pack(ss, v);
  331. try {
  332. bool ref;
  333. msgpack::object_handle unp =
  334. msgpack::unpack(ss.str().c_str(), ss.str().size(), ref, MSGPACK_NULLPTR, MSGPACK_NULLPTR,
  335. msgpack::unpack_limit(2, 0, 0, 0, 0));
  336. EXPECT_TRUE(false);
  337. }
  338. catch(msgpack::array_size_overflow const&) {
  339. EXPECT_TRUE(true);
  340. }
  341. catch(...) {
  342. EXPECT_TRUE(false);
  343. }
  344. }
  345. TEST(limit, unpack_array_over_cpp11_off_no_ref)
  346. {
  347. std::stringstream ss;
  348. std::vector<int> v;
  349. v.push_back(1);
  350. v.push_back(2);
  351. v.push_back(3);
  352. msgpack::pack(ss, v);
  353. try {
  354. std::size_t off = 0;
  355. msgpack::object_handle unp =
  356. msgpack::unpack(ss.str().c_str(), ss.str().size(), off, MSGPACK_NULLPTR, MSGPACK_NULLPTR,
  357. msgpack::unpack_limit(2, 0, 0, 0, 0));
  358. EXPECT_TRUE(false);
  359. }
  360. catch(msgpack::array_size_overflow const&) {
  361. EXPECT_TRUE(true);
  362. }
  363. catch(...) {
  364. EXPECT_TRUE(false);
  365. }
  366. }
  367. TEST(limit, unpack_array_over_cpp11_off_ref)
  368. {
  369. std::stringstream ss;
  370. std::vector<int> v;
  371. v.push_back(1);
  372. v.push_back(2);
  373. v.push_back(3);
  374. msgpack::pack(ss, v);
  375. try {
  376. bool ref;
  377. std::size_t off = 0;
  378. msgpack::object_handle unp =
  379. msgpack::unpack(ss.str().c_str(), ss.str().size(), off, ref, MSGPACK_NULLPTR, MSGPACK_NULLPTR,
  380. msgpack::unpack_limit(2, 0, 0, 0, 0));
  381. EXPECT_TRUE(false);
  382. }
  383. catch(msgpack::array_size_overflow const&) {
  384. EXPECT_TRUE(true);
  385. }
  386. catch(...) {
  387. EXPECT_TRUE(false);
  388. }
  389. }
  390. #endif // !defined(MSGPACK_USE_CPP03)
  391. TEST(limit, unpack_array_over_no_off_no_ref)
  392. {
  393. std::stringstream ss;
  394. std::vector<int> v;
  395. v.push_back(1);
  396. v.push_back(2);
  397. v.push_back(3);
  398. msgpack::pack(ss, v);
  399. try {
  400. msgpack::object_handle unp;
  401. msgpack::unpack(unp, ss.str().c_str(), ss.str().size(), MSGPACK_NULLPTR, MSGPACK_NULLPTR,
  402. msgpack::unpack_limit(2, 0, 0, 0, 0));
  403. EXPECT_TRUE(false);
  404. }
  405. catch(msgpack::array_size_overflow const&) {
  406. EXPECT_TRUE(true);
  407. }
  408. catch(...) {
  409. EXPECT_TRUE(false);
  410. }
  411. }
  412. TEST(limit, unpack_array_over_no_off_ref)
  413. {
  414. std::stringstream ss;
  415. std::vector<int> v;
  416. v.push_back(1);
  417. v.push_back(2);
  418. v.push_back(3);
  419. msgpack::pack(ss, v);
  420. try {
  421. bool ref;
  422. msgpack::object_handle unp;
  423. msgpack::unpack(unp, ss.str().c_str(), ss.str().size(), ref, MSGPACK_NULLPTR, MSGPACK_NULLPTR,
  424. msgpack::unpack_limit(2, 0, 0, 0, 0));
  425. EXPECT_TRUE(false);
  426. }
  427. catch(msgpack::array_size_overflow const&) {
  428. EXPECT_TRUE(true);
  429. }
  430. catch(...) {
  431. EXPECT_TRUE(false);
  432. }
  433. }
  434. TEST(limit, unpack_array_over_off_no_ref)
  435. {
  436. std::stringstream ss;
  437. std::vector<int> v;
  438. v.push_back(1);
  439. v.push_back(2);
  440. v.push_back(3);
  441. msgpack::pack(ss, v);
  442. try {
  443. std::size_t off = 0;
  444. msgpack::object_handle unp;
  445. msgpack::unpack(unp, ss.str().c_str(), ss.str().size(), off, MSGPACK_NULLPTR, MSGPACK_NULLPTR,
  446. msgpack::unpack_limit(2, 0, 0, 0, 0));
  447. EXPECT_TRUE(false);
  448. }
  449. catch(msgpack::array_size_overflow const&) {
  450. EXPECT_TRUE(true);
  451. }
  452. catch(...) {
  453. EXPECT_TRUE(false);
  454. }
  455. }
  456. TEST(limit, unpack_array_over_off_ref)
  457. {
  458. std::stringstream ss;
  459. std::vector<int> v;
  460. v.push_back(1);
  461. v.push_back(2);
  462. v.push_back(3);
  463. msgpack::pack(ss, v);
  464. try {
  465. bool ref;
  466. std::size_t off = 0;
  467. msgpack::object_handle unp;
  468. msgpack::unpack(unp, ss.str().c_str(), ss.str().size(), off, ref, MSGPACK_NULLPTR, MSGPACK_NULLPTR,
  469. msgpack::unpack_limit(2, 0, 0, 0, 0));
  470. EXPECT_TRUE(false);
  471. }
  472. catch(msgpack::array_size_overflow const&) {
  473. EXPECT_TRUE(true);
  474. }
  475. catch(...) {
  476. EXPECT_TRUE(false);
  477. }
  478. }
  479. // obsolete
  480. #if MSGPACK_DEFAULT_API_VERSION == 1
  481. TEST(limit, unpack_array_over_off_ref_pointer)
  482. {
  483. std::stringstream ss;
  484. std::vector<int> v;
  485. v.push_back(1);
  486. v.push_back(2);
  487. v.push_back(3);
  488. msgpack::pack(ss, v);
  489. try {
  490. bool ref;
  491. std::size_t off = 0;
  492. msgpack::object_handle unp;
  493. #if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2))
  494. #pragma GCC diagnostic push
  495. #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
  496. #endif // (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2))
  497. msgpack::unpack(&unp, ss.str().c_str(), ss.str().size(), &off, &ref, MSGPACK_NULLPTR, MSGPACK_NULLPTR,
  498. msgpack::unpack_limit(2, 0, 0, 0, 0));
  499. #if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2))
  500. #pragma GCC diagnostic pop
  501. #endif // (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2))
  502. EXPECT_TRUE(false);
  503. }
  504. catch(msgpack::array_size_overflow const&) {
  505. EXPECT_TRUE(true);
  506. }
  507. catch(...) {
  508. EXPECT_TRUE(false);
  509. }
  510. }
  511. #endif // MSGPACK_DEFAULT_API_VERSION == 1
  512. TEST(limit, unpacker_array_over)
  513. {
  514. std::stringstream ss;
  515. std::vector<int> v;
  516. v.push_back(1);
  517. v.push_back(2);
  518. v.push_back(3);
  519. msgpack::pack(ss, v);
  520. try {
  521. msgpack::unpacker u(MSGPACK_NULLPTR, MSGPACK_NULLPTR, MSGPACK_UNPACKER_INIT_BUFFER_SIZE,
  522. msgpack::unpack_limit(2, 0, 0, 0, 0));
  523. u.reserve_buffer(ss.str().size());
  524. memcpy(u.buffer(), ss.str().c_str(), ss.str().size());
  525. u.buffer_consumed(ss.str().size());
  526. msgpack::object_handle unp;
  527. u.next(unp);
  528. EXPECT_TRUE(false);
  529. }
  530. catch(msgpack::array_size_overflow const&) {
  531. EXPECT_TRUE(true);
  532. }
  533. catch(...) {
  534. EXPECT_TRUE(false);
  535. }
  536. }
  537. TEST(limit, unpacker_reserve)
  538. {
  539. msgpack::unpacker u(MSGPACK_NULLPTR, MSGPACK_NULLPTR, MSGPACK_UNPACKER_INIT_BUFFER_SIZE,
  540. msgpack::unpack_limit());
  541. std::size_t original_capacity = u.buffer_capacity();
  542. u.reserve_buffer(original_capacity + 1u);
  543. EXPECT_EQ((original_capacity + COUNTER_SIZE) * 2 - COUNTER_SIZE, u.buffer_capacity());
  544. }
  545. TEST(limit, unpacker_reserve_more_than_twice)
  546. {
  547. msgpack::unpacker u(MSGPACK_NULLPTR, MSGPACK_NULLPTR, MSGPACK_UNPACKER_INIT_BUFFER_SIZE,
  548. msgpack::unpack_limit());
  549. std::size_t original_capacity = u.buffer_capacity();
  550. u.reserve_buffer(original_capacity * 3);
  551. EXPECT_EQ((original_capacity + COUNTER_SIZE) * 4 - COUNTER_SIZE, u.buffer_capacity());
  552. }