Skip to content

Commit 08e87ce

Browse files
author
Grok Compression
committed
shmem: fix on osx
1 parent cca46f6 commit 08e87ce

1 file changed

Lines changed: 39 additions & 15 deletions

File tree

src/lib/codec/shared/Messenger.h

Lines changed: 39 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
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

Comments
 (0)