]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
dynamic-user: Revert back to using POSIX locks
authorDaan De Meyer <daan.j.demeyer@gmail.com>
Mon, 13 Mar 2023 12:05:19 +0000 (13:05 +0100)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Mon, 13 Mar 2023 12:06:42 +0000 (13:06 +0100)
unposix locks are shared between child and parent after fork() which
is precisely what we don't want in this case so revert back to POSIX
locks which are not shared between parent and child.

src/core/dynamic-user.c

index 42936bf56761709ab0a963a001c04d3b81d37de1..3824ae747fdfe28acf19fabb8d854ab4308f16a1 100644 (file)
@@ -383,11 +383,11 @@ static int dynamic_user_realize(
         /* Acquire a UID for the user name. This will allocate a UID for the user name if the user doesn't exist
          * yet. If it already exists its existing UID/GID will be reused. */
 
-        r = unposix_lock(d->storage_socket[0], LOCK_EX);
+        r = posix_lock(d->storage_socket[0], LOCK_EX);
         if (r < 0)
                 return r;
 
-        CLEANUP_UNPOSIX_UNLOCK(d->storage_socket[0]);
+        CLEANUP_POSIX_UNLOCK(d->storage_socket[0]);
 
         r = dynamic_user_pop(d, &num, &uid_lock_fd);
         if (r < 0) {
@@ -399,7 +399,7 @@ static int dynamic_user_realize(
 
                 /* OK, nothing stored yet, let's try to find something useful. While we are working on this release the
                  * lock however, so that nobody else blocks on our NSS lookups. */
-                r = unposix_lock(d->storage_socket[0], LOCK_UN);
+                r = posix_lock(d->storage_socket[0], LOCK_UN);
                 if (r < 0)
                         return r;
 
@@ -451,7 +451,7 @@ static int dynamic_user_realize(
                 }
 
                 /* So, we found a working UID/lock combination. Let's see if we actually still need it. */
-                r = unposix_lock(d->storage_socket[0], LOCK_EX);
+                r = posix_lock(d->storage_socket[0], LOCK_EX);
                 if (r < 0) {
                         unlink_uid_lock(uid_lock_fd, num, d->name);
                         return r;
@@ -523,11 +523,11 @@ int dynamic_user_current(DynamicUser *d, uid_t *ret) {
         /* Get the currently assigned UID for the user, if there's any. This simply pops the data from the
          * storage socket, and pushes it back in right-away. */
 
-        r = unposix_lock(d->storage_socket[0], LOCK_EX);
+        r = posix_lock(d->storage_socket[0], LOCK_EX);
         if (r < 0)
                 return r;
 
-        CLEANUP_UNPOSIX_UNLOCK(d->storage_socket[0]);
+        CLEANUP_POSIX_UNLOCK(d->storage_socket[0]);
 
         r = dynamic_user_pop(d, &uid, &lock_fd);
         if (r < 0)
@@ -565,11 +565,11 @@ static int dynamic_user_close(DynamicUser *d) {
         /* Release the user ID, by releasing the lock on it, and emptying the storage socket. After this the
          * user is unrealized again, much like it was after it the DynamicUser object was first allocated. */
 
-        r = unposix_lock(d->storage_socket[0], LOCK_EX);
+        r = posix_lock(d->storage_socket[0], LOCK_EX);
         if (r < 0)
                 return r;
 
-        CLEANUP_UNPOSIX_UNLOCK(d->storage_socket[0]);
+        CLEANUP_POSIX_UNLOCK(d->storage_socket[0]);
 
         r = dynamic_user_pop(d, &uid, &lock_fd);
         if (r == -EAGAIN)