Hi Steve, You're talking about https://github.com/apache/guacamole-server/blob/master/src/libguac/pool.c , I presume? In that case you're right unless - the malloc and pthread_* functions are redefined to mean something weird, or - the physical page containing malloc'ed pool is later made shared between processes, or is flagged to be shared with a child after forking, or remapped to another virtual address in the same process, all of which are highly unlikely.
So a process-shared mutex is unnecessary here on any POSIX system, not only on OpenBSD. Nick Permyakov > Hi, > > I am looking into guacamole's use of pthread_mutexattr_setpshare. > (an aside, if I comment out the 4 lines of code invoking > pthread_mutexattr_setpshare, it compiles with gcc on OpenBSD 6.6 > (GENERIC.MP) ) > > I am an experienced C programmer, but I've never looked in threading in > C before so it has required quite a bit of reading. I haven't been able > to find a comprehensive "architecture" document, just various man pages, > some with sample code. > > For example: > https://linux.die.net/man/3/pthread_mutexattr_init > > In the above documentation, it states: > > ...the possibility that an application may allocate the > synchronization objects from this section in memory that is accessed > by multiple processes (and therefore, by threads of multiple processes). > > That is the purpose of the guacamole's pthread_mutexattr_setpshared(foo, > PTHREAD_PROCESS_SHARED) , to permit multiple threaded processes to > access the resource protected by the MUTEX. > > However, from my reading of the code, the MUTEX is only protecting > malloc'd memory, which as far as I know, isn't a resource that can be > accessed by multiple processes. > > It is my newby (to pthreads) interpretation of the code that in all 4 > cases, the code is malloc'ing memory that is being protected by the > MUTEX. For example: > > src/libguac/pool.c: > ... > guac_pool* guac_pool_alloc(int size) { > > pthread_mutexattr_t lock_attributes; > guac_pool* pool = malloc(sizeof(guac_pool)); > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > Allocate memory that will only be accessible by this process > > /* If unable to allocate, just return NULL. */ > if (pool == NULL) > return NULL; > > /* Initialize empty pool */ > pool->min_size = size; > pool->active = 0; > pool->__next_value = 0; > pool->__head = NULL; > pool->__tail = NULL; > > /* Init lock */ > pthread_mutexattr_init(&lock_attributes); > pthread_mutexattr_setpshared(&lock_attributes, PTHREAD_PROCESS_SHARED); > pthread_mutex_init(&(pool->__lock), &lock_attributes); > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > This codes saves the MUTEX in the locally allocated memory > > No other process can find this MUTEX in malloc'd memory, so setting it > to PTHREAD_PROCESS_SHARED seems totally irrelevant. > > If so, I *think* it's OK to just comment out that code as OpenBSD's > pthread implementation will work fine within a process, just not > multiple processes. > > Is this a correct assessment of the code and OpenBSD's pthread environnment? > > Thanks, > Steve W. > > On 15/04/2020 10:19 a.m., Stuart Henderson wrote: > > On 2020-04-14, Steve Williams <st...@williamsitconsulting.com> wrote: > >> Guacamole (I believe) needs to run under something like tomcat to serve > >> up the java war file & application. > > I looked at this before - it also requires guacamole-server to be built > > (written in C), it requires mutexes shared between different processes > > (pthread_mutexattr_setpshared(foo, PTHREAD_PROCESS_SHARED) which > > isn't supported in OpenBSD's thread library. > > > > But what you can do is run guacamole elsewhere and have a reverse http > > proxy running on OpenBSD doing http auth and feeding connections across. > > > >> So, I was thinking of using some form of authpf to open up pf rules when > >> I needed to access systems remotely. > >> > >> But, I don't want to open up Tomcat to the world when I'm using > >> guacamole, so is it possible to have authpf tweak pf rules so that the > >> originating IP address of the ssh session would be the only one that > >> could access Tomcat? > > That is exactly what authpf normally does anyway. > > > >> I was thinking even httpd in front of tomcat with httpd authentication, > >> but that doesn't seem to make sense to me at a high level. > >> > >> I was looking at relayd but it doesn't seen to have any authentication > >> mechanism built in. > > httpd can't proxy connections to another http server. relayd can but as > > you say doesn't have a way to add http authentication. You can do this > > with nginx, haproxy or Apache httpd though. > >