4747#include < queue>
4848#include < cassert>
4949#include < cstdarg>
50+ #include < cinttypes>
5051
5152#ifdef _WIN32
5253#include < windows.h>
@@ -448,6 +449,21 @@ struct SharedMemoryManager
448449{
449450 static bool initShm (const std::string& name, size_t len, grk_handle* shm_fd, char ** buffer)
450451 {
452+ if (len == 0 )
453+ {
454+ getMessengerLogger ()->error (" Shared memory size is 0 for %s" , name.c_str ());
455+ errno = EINVAL;
456+ return false ;
457+ }
458+ // Guard: off_t is signed; ensure bytes fits.
459+ if (len > static_cast <uint64_t >(std::numeric_limits<off_t >::max ()))
460+ {
461+ getMessengerLogger ()->error (" Shared memory size too large (%" PRIu64 " ) for %s" , len,
462+ name.c_str ());
463+ errno = EOVERFLOW;
464+ return false ;
465+ }
466+
451467 *shm_fd = shm_open (name.c_str (), O_CREAT | O_RDWR, 0666 );
452468 if (*shm_fd < 0 )
453469 {
@@ -457,7 +473,8 @@ struct SharedMemoryManager
457473 int rc = ftruncate (*shm_fd, (off_t )len);
458474 if (rc)
459475 {
460- getMessengerLogger ()->error (" Error truncating shared memory: %s" , strerror (errno));
476+ getMessengerLogger ()->error (" Error truncating shared memory to %" PRIu64 " bytes: %s" ,
477+ (uint64_t )len, strerror (errno));
461478 rc = close (*shm_fd);
462479 if (rc)
463480 getMessengerLogger ()->error (" Error closing shared memory: %s" , strerror (errno));
@@ -747,7 +764,6 @@ struct Messenger
747764 }
748765#endif
749766
750- bool rc = true ;
751767 char temp[512 ];
752768 sprintf (temp,
753769 " Initializing shared memory buffers: num frames %zu, "
@@ -757,26 +773,30 @@ struct Messenger
757773 getMessengerLogger ()->info (temp);
758774 if (init_.uncompressedFrameSize_ )
759775 {
760- rc = rc && SharedMemoryManager::initShm (grokUncompressedBuf,
761- init_.uncompressedFrameSize_ * init_.numFrames_ ,
762- &uncompressed_fd_, &uncompressed_buffer_);
776+ bool rc = SharedMemoryManager::initShm (grokUncompressedBuf,
777+ init_.uncompressedFrameSize_ * init_.numFrames_ ,
778+ &uncompressed_fd_, &uncompressed_buffer_);
779+ if (!rc)
780+ return false ;
763781
764782 auto msg = std::string (" Initialized shared uncompressed memory buffers: " ) +
765783 (rc ? " success" : " failure" );
766784 getMessengerLogger ()->info (msg.c_str ());
767785 }
768786 if (init_.compressedFrameSize_ )
769787 {
770- rc = rc && SharedMemoryManager::initShm (grokCompressedBuf,
771- init_.compressedFrameSize_ * init_.numFrames_ ,
772- &compressed_fd_, &compressed_buffer_);
788+ bool rc = SharedMemoryManager::initShm (grokCompressedBuf,
789+ init_.compressedFrameSize_ * init_.numFrames_ ,
790+ &compressed_fd_, &compressed_buffer_);
791+ if (!rc)
792+ return false ;
773793
774794 auto msg = std::string (" Initialized shared compressed memory buffers: " ) +
775795 (rc ? " success" : " failure" );
776796 getMessengerLogger ()->info (msg.c_str ());
777797 }
778798
779- return rc ;
799+ return true ;
780800 }
781801
782802 bool deinitShm (void )
@@ -832,14 +852,15 @@ struct Messenger
832852
833853 return success;
834854 }
835- void initClient (size_t uncompressedFrameSize, size_t compressedFrameSize, size_t numFrames)
855+ bool initClient (size_t uncompressedFrameSize, size_t compressedFrameSize, size_t numFrames)
836856 {
837857 getMessengerLogger ()->info (" Initializing shared memory client" );
838858 // client fills queue with pending uncompressed buffers
839859 init_.uncompressedFrameSize_ = uncompressedFrameSize;
840860 init_.compressedFrameSize_ = compressedFrameSize;
841861 init_.numFrames_ = numFrames;
842- initBuffers ();
862+ if (!initBuffers ())
863+ return false ;
843864 auto ptr = uncompressed_buffer_;
844865 for (size_t i = 0 ; i < init_.numFrames_ ; ++i)
845866 {
@@ -851,6 +872,7 @@ struct Messenger
851872 initialized_ = true ;
852873 clientInitializedCondition_.notify_all ();
853874 getMessengerLogger ()->info (" Initialized shared memory client" );
875+ return true ;
854876 }
855877 bool waitForClientInit (void )
856878 {
@@ -1046,8 +1068,9 @@ static void processorThread(Messenger* messenger, std::function<void(std::string
10461068 Messenger::uncompressedFrameSize (width, height, samplesPerPixel);
10471069 auto compressedFrameSize = msg.nextUint ();
10481070 auto numFrames = msg.nextUint ();
1049- messenger->initClient (messenger->init_ .uncompressedFrameSize_ , compressedFrameSize,
1050- numFrames);
1071+ if (!messenger->initClient (messenger->init_ .uncompressedFrameSize_ , compressedFrameSize,
1072+ numFrames))
1073+ return ;
10511074 }
10521075 else if (tag == GRK_MSGR_BATCH_DECOMPRESS_INIT)
10531076 {
@@ -1063,8 +1086,9 @@ static void processorThread(Messenger* messenger, std::function<void(std::string
10631086 auto compressedFrameSize = msg.nextUint ();
10641087 auto numFrames = msg.nextUint ();
10651088 // for decompress: client manages compressed buffers (input)
1066- messenger->initClient (messenger->init_ .uncompressedFrameSize_ , compressedFrameSize,
1067- numFrames);
1089+ if (!messenger->initClient (messenger->init_ .uncompressedFrameSize_ , compressedFrameSize,
1090+ numFrames))
1091+ return ;
10681092 // drain uncompressed buffers and fill with compressed buffers
10691093 {
10701094 BufferSrc dummy;
0 commit comments