@@ -171,6 +171,9 @@ int main(int argc, char **argv) {
171171 " Do not use this option per default! "
172172 " It should only be used if the semaphore of an improperly terminated instance continues "
173173 " to exist as an orphan and is no longer used." );
174+ options.add_options ()(" b,permissions" ,
175+ " permission bits that are applied when creating a shared memory." ,
176+ cxxopts::value<std::string>()->default_value (" 0640" ));
174177 options.add_options ()(" h,help" , " print usage" );
175178 options.add_options ()(" version" , " print version information" );
176179 options.add_options ()(" license" , " show licences" );
@@ -262,6 +265,23 @@ int main(int argc, char **argv) {
262265
263266 const auto FORCE_SHM = args.count (" force" ) > 0 ;
264267
268+ mode_t shm_permissions = 0660 ;
269+ {
270+ const auto shm_permissions_str = args[" permissions" ].as <std::string>();
271+ bool fail = false ;
272+ std::size_t idx = 0 ;
273+ try {
274+ shm_permissions = std::stoul (shm_permissions_str, &idx, 0 );
275+ } catch (const std::exception &) { fail = true ; }
276+ fail = fail || idx != shm_permissions_str.size ();
277+
278+ if (fail || (~static_cast <mode_t >(0x1FF ) & shm_permissions) != 0 ) {
279+ std::cerr << Print_Time::iso << " ERROR: Invalid file permissions \" " << shm_permissions_str << ' "'
280+ << std::endl;
281+ return EX_USAGE;
282+ }
283+ }
284+
265285 // check ulimit
266286 std::size_t min_files =
267287 CONNECTIONS + 5 ; // number of connections + stderr + stdout + stdin + signal_fd + server socket
@@ -291,7 +311,8 @@ int main(int argc, char **argv) {
291311 args[" ao-registers" ].as <std::size_t >(),
292312 args[" ai-registers" ].as <std::size_t >(),
293313 args[" name-prefix" ].as <std::string>(),
294- FORCE_SHM);
314+ FORCE_SHM,
315+ shm_permissions);
295316 } catch (const std::system_error &e) {
296317 std::cerr << Print_Time::iso << " ERROR: " << e.what () << std::endl;
297318 return EX_OSERR;
@@ -313,7 +334,8 @@ int main(int argc, char **argv) {
313334 args[" ao-registers" ].as <std::size_t >(),
314335 args[" ai-registers" ].as <std::size_t >(),
315336 sstr.str (),
316- FORCE_SHM));
337+ FORCE_SHM,
338+ shm_permissions));
317339 mb_mappings[i] = separate_mappings.back ()->get_mapping ();
318340 } catch (const std::system_error &e) {
319341 std::cerr << Print_Time::iso << " ERROR: " << e.what () << std::endl;
@@ -340,7 +362,8 @@ int main(int argc, char **argv) {
340362 args[" ao-registers" ].as <std::size_t >(),
341363 args[" ai-registers" ].as <std::size_t >(),
342364 sstr.str (),
343- FORCE_SHM));
365+ FORCE_SHM,
366+ shm_permissions));
344367 mb_mappings[a] = separate_mappings.back ()->get_mapping ();
345368 } catch (const std::system_error &e) {
346369 std::cerr << Print_Time::iso << " ERROR: " << e.what () << std::endl;
0 commit comments