Browse Source

Check mmap() against MAP_FAILED

Fixes #338
tags/v1.9.13
falkTX 7 years ago
parent
commit
cc8576a7ab
1 changed files with 16 additions and 10 deletions
  1. +16
    -10
      linux/JackLinuxFutex.cpp

+ 16
- 10
linux/JackLinuxFutex.cpp View File

@@ -147,7 +147,9 @@ bool JackLinuxFutex::Allocate(const char* name, const char* server_name, int val
return false; return false;
} }


if ((fFutex = (FutexData*)mmap(NULL, sizeof(FutexData), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_LOCKED, fSharedMem, 0)) == NULL) {
FutexData* futex = (FutexData*)mmap(NULL, sizeof(FutexData), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_LOCKED, fSharedMem, 0);

if (futex == NULL || futex == MAP_FAILED) {
jack_error("Allocate: can't check in named futex name = %s err = %s", fName, strerror(errno)); jack_error("Allocate: can't check in named futex name = %s err = %s", fName, strerror(errno));
close(fSharedMem); close(fSharedMem);
fSharedMem = -1; fSharedMem = -1;
@@ -157,11 +159,12 @@ bool JackLinuxFutex::Allocate(const char* name, const char* server_name, int val


fPrivate = internal; fPrivate = internal;


fFutex->futex = value;
fFutex->internal = internal;
fFutex->wasInternal = internal;
fFutex->needsChange = false;
fFutex->externalCount = 0;
futex->futex = value;
futex->internal = internal;
futex->wasInternal = internal;
futex->needsChange = false;
futex->externalCount = 0;
fFutex = futex;
return true; return true;
} }


@@ -182,24 +185,27 @@ bool JackLinuxFutex::Connect(const char* name, const char* server_name)
return false; return false;
} }


if ((fFutex = (FutexData*)mmap(NULL, sizeof(FutexData), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_LOCKED, fSharedMem, 0)) == NULL) {
FutexData* futex = (FutexData*)mmap(NULL, sizeof(FutexData), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_LOCKED, fSharedMem, 0);

if (futex == NULL || futex == MAP_FAILED) {
jack_error("Connect: can't connect named futex name = %s err = %s", fName, strerror(errno)); jack_error("Connect: can't connect named futex name = %s err = %s", fName, strerror(errno));
close(fSharedMem); close(fSharedMem);
fSharedMem = -1; fSharedMem = -1;
return false; return false;
} }


if (! fPrivate && fFutex->wasInternal)
if (! fPrivate && futex->wasInternal)
{ {
const char* externalSync = getenv("JACK_INTERNAL_CLIENT_SYNC"); const char* externalSync = getenv("JACK_INTERNAL_CLIENT_SYNC");


if (externalSync != NULL && strstr(fName, externalSync) != NULL && ++fFutex->externalCount == 1)
if (externalSync != NULL && strstr(fName, externalSync) != NULL && ++futex->externalCount == 1)
{ {
jack_error("Note: client %s running as external client temporarily", fName); jack_error("Note: client %s running as external client temporarily", fName);
fFutex->needsChange = true;
futex->needsChange = true;
} }
} }


fFutex = futex;
return true; return true;
} }




Loading…
Cancel
Save