The jack_group2gid() function does a thread-safe lookup of a unix gid from a
unix group name.
The jack_promiscuous_perms() function adjusts the permissions of a shared
resource (socket, semaphore, shm segment, ...) referenced by a fd and/or a
path so it can be used by any member of the provided unix group.
By using those functions it will be possible to enable a secure promiscuous
mode. 'Secure' meaning here that one is not forced to launch every clients
with a (way) too permissive 0000 umask.
* detect version option before all other oprion parsing
jackd now checks its arguments for "-V" and "--version" before all other
option parsing happens.
* remove some dead code from option parsing
Version options are detected before optparse runs, the removed code
paths thus became obsolete.
* remove rest of version option from optparse
Detection of the version option is now handled outside of optparse, thus
left over stings and variables are removed.
* switch to string comparison for detection version option
Demanding an exact match for the option strings reflects the original
behavior more closely than a search for substrings.
If configured with --clients=512 (translates to CLIENT_NUM), we exceed
the maximum stack size. CLIENT_NUM==500 still works, but let's allocate
the matrix on the heap to be safe.
Kudos to Markus Seeber for the initial bug triage.
Fixes#212
Reported by valgrind using the command below:
$ valgrind jackd -p128 -t2000 -dalsa -dhw:0 -r44100 -p2048 -n2 -S
==17496== Memcheck, a memory error detector
==17496== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==17496== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info
==17496== Command: jackd -p128 -t2000 -dalsa -dhw:0 -r44100 -p2048 -n2 -S
==17496==
jackdmp 1.9.11
Copyright 2001-2005 Paul Davis and others.
Copyright 2004-2016 Grame.
jackdmp comes with ABSOLUTELY NO WARRANTY
This is free software, and you are welcome to redistribute it
under certain conditions; see the file COPYING for details
JACK server starting in realtime mode with priority 10
self-connect-mode is "Don't restrict self connect requests"
creating alsa driver ... hw:0|hw:0|2048|2|44100|0|0|nomon|swmeter|-|16bit
configuring for 44100Hz, period = 2048 frames (46.4 ms), buffer = 2 periods
ALSA: final selected sample format for capture: 16bit little-endian
ALSA: use 2 periods for capture
ALSA: final selected sample format for playback: 16bit little-endian
ALSA: use 2 periods for playback
==17496== Thread 3:
==17496== Conditional jump or move depends on uninitialised value(s)
==17496== at 0x4E91CC9: Jack::JackEngineControl::CalcCPULoad(Jack::JackClientInterface**, Jack::JackGraphManager*, unsigned long, unsigned long) (JackEngineControl.cpp:58)
==17496== by 0x4EB3256: Jack::JackEngineControl::CycleBegin(Jack::JackClientInterface**, Jack::JackGraphManager*, unsigned long, unsigned long) (JackEngineControl.h:153)
==17496== by 0x4EAF54A: Jack::JackEngine::Process(unsigned long, unsigned long) (JackEngine.cpp:166)
==17496== by 0x4EA922E: Jack::JackLockedEngine::Process(unsigned long, unsigned long) (JackLockedEngine.h:261)
==17496== by 0x4EA8819: Jack::JackAudioDriver::ProcessGraphAsyncMaster() (JackAudioDriver.cpp:250)
==17496== by 0x4EA87D0: Jack::JackAudioDriver::ProcessGraphAsync() (JackAudioDriver.cpp:236)
==17496== by 0x4EA8795: Jack::JackAudioDriver::ProcessAsync() (JackAudioDriver.cpp:225)
==17496== by 0x4EA870E: Jack::JackAudioDriver::Process() (JackAudioDriver.cpp:202)
==17496== by 0x4EBA5DA: Jack::JackThreadedDriver::Process() (JackThreadedDriver.cpp:71)
==17496== by 0x4EBAC52: Jack::JackThreadedDriver::Execute() (JackThreadedDriver.cpp:244)
==17496== by 0x4EA4B63: Jack::JackPosixThread::ThreadHandler(void*) (JackPosixThread.cpp:61)
==17496== by 0x59F5181: start_thread (pthread_create.c:312)
==17496==
^CJack main caught signal 2
==17496==
==17496== HEAP SUMMARY:
==17496== in use at exit: 95,475 bytes in 1,441 blocks
==17496== total heap usage: 2,793 allocs, 1,352 frees, 7,217,645 bytes allocated
==17496==
==17496== LEAK SUMMARY:
==17496== definitely lost: 1,458 bytes in 10 blocks
==17496== indirectly lost: 7,680 bytes in 4 blocks
==17496== possibly lost: 42,998 bytes in 1,314 blocks
==17496== still reachable: 43,339 bytes in 113 blocks
==17496== suppressed: 0 bytes in 0 blocks
==17496== Rerun with --leak-check=full to see details of leaked memory
==17496==
==17496== For counts of detected and suppressed errors, rerun with: -v
==17496== Use --track-origins=yes to see where uninitialised values come from
==17496== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
JACK2 added this function first, but the int return has been always wrong.
When JACK1 added JackPortRenameCallback it used the proper return.
Now that JACK1 supports port renames, devs will start to use it.
(previously it didn't work properly because of the missing jack_client_t* arg)
Some code might be broken because of this, but it's a very simple change,
and existing code would have been broken when changing JACK1 to JACK2.
Finally, JACK2 code never uses the int return value of this callback.
So there's no real reason to NOT change this.