Apply patch for [CVE-2012-2677][boost] ordered_malloc() overflow
[external/boost.git] / libs / interprocess / example / doc_shared_memory.cpp
1 //////////////////////////////////////////////////////////////////////////////
2 //
3 // (C) Copyright Ion Gaztanaga 2006-2009. Distributed under the Boost
4 // Software License, Version 1.0. (See accompanying file
5 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 //
7 // See http://www.boost.org/libs/interprocess for documentation.
8 //
9 //////////////////////////////////////////////////////////////////////////////
10 #include <boost/interprocess/detail/config_begin.hpp>
11 //[doc_shared_memory
12 #include <boost/interprocess/shared_memory_object.hpp>
13 #include <boost/interprocess/mapped_region.hpp>
14 #include <cstring>
15 #include <cstdlib>
16 #include <string>
17 //<-
18 #include "../test/get_process_id_name.hpp"
19 //->
20
21 int main(int argc, char *argv[])
22 {
23    using namespace boost::interprocess;
24
25    if(argc == 1){  //Parent process
26       //Remove shared memory on construction and destruction
27       struct shm_remove 
28       {
29       //<-
30       #if 1
31          shm_remove() { shared_memory_object::remove(test::get_process_id_name()); }
32          ~shm_remove(){ shared_memory_object::remove(test::get_process_id_name()); }
33       #else
34       //->
35          shm_remove() { shared_memory_object::remove("MySharedMemory"); }
36          ~shm_remove(){ shared_memory_object::remove("MySharedMemory"); }
37       //<-
38       #endif
39       //->
40       } remover;
41
42       //Create a shared memory object.
43       //<-
44       #if 1
45       shared_memory_object shm (create_only, test::get_process_id_name(), read_write);
46       #else
47       //->
48       shared_memory_object shm (create_only, "MySharedMemory", read_write);
49       //<-
50       #endif
51       //->
52
53       //Set size
54       shm.truncate(1000);
55
56       //Map the whole shared memory in this process
57       mapped_region region(shm, read_write);
58
59       //Write all the memory to 1
60       std::memset(region.get_address(), 1, region.get_size());
61
62       //Launch child process
63       std::string s(argv[0]); s += " child ";
64       //<-
65       s += test::get_process_id_name();
66       //->
67       if(0 != std::system(s.c_str()))
68          return 1;
69    }
70    else{
71       //Open already created shared memory object.
72       //<-
73       #if 1
74       shared_memory_object shm (open_only, argv[2], read_only);
75       #else
76       //->
77       shared_memory_object shm (open_only, "MySharedMemory", read_only);
78       //<-
79       #endif
80       //->
81
82       //Map the whole shared memory in this process
83       mapped_region region(shm, read_only);
84
85       //Check that memory was initialized to 1
86       char *mem = static_cast<char*>(region.get_address());
87       for(std::size_t i = 0; i < region.get_size(); ++i)
88          if(*mem++ != 1)
89             return 1;   //Error checking memory
90    }
91    return 0;
92 }
93 //]
94 #include <boost/interprocess/detail/config_end.hpp>