Skip to content

Commit 37bc9dc

Browse files
committed
nss-systemd: use _cleanup_ for pthread_mutex_{lock,unlock}
v2: separate the declaration from the assignment to appease clang.
1 parent 29d4392 commit 37bc9dc

File tree

1 file changed

+39
-62
lines changed

1 file changed

+39
-62
lines changed

src/nss-systemd/nss-systemd.c

Lines changed: 39 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include "group-record-nss.h"
1010
#include "macro.h"
1111
#include "nss-util.h"
12+
#include "pthread-util.h"
1213
#include "signal-util.h"
1314
#include "strv.h"
1415
#include "user-util.h"
@@ -277,10 +278,11 @@ static enum nss_status nss_systemd_endent(GetentData *p) {
277278

278279
assert(p);
279280

280-
assert_se(pthread_mutex_lock(&p->mutex) == 0);
281+
_cleanup_(pthread_mutex_unlock_assertp) pthread_mutex_t *_l = NULL;
282+
_l = pthread_mutex_lock_assert(&p->mutex);
283+
281284
p->iterator = userdb_iterator_free(p->iterator);
282285
p->by_membership = false;
283-
assert_se(pthread_mutex_unlock(&p->mutex) == 0);
284286

285287
return NSS_STATUS_SUCCESS;
286288
}
@@ -294,45 +296,41 @@ enum nss_status _nss_systemd_endgrent(void) {
294296
}
295297

296298
enum nss_status _nss_systemd_setpwent(int stayopen) {
297-
enum nss_status ret;
298-
299299
PROTECT_ERRNO;
300300
BLOCK_SIGNALS(NSS_SIGNALS_BLOCK);
301301

302302
if (userdb_nss_compat_is_enabled() <= 0)
303303
return NSS_STATUS_NOTFOUND;
304304

305-
assert_se(pthread_mutex_lock(&getpwent_data.mutex) == 0);
305+
_cleanup_(pthread_mutex_unlock_assertp) pthread_mutex_t *_l = NULL;
306+
int r;
307+
308+
_l = pthread_mutex_lock_assert(&getpwent_data.mutex);
306309

307310
getpwent_data.iterator = userdb_iterator_free(getpwent_data.iterator);
308311
getpwent_data.by_membership = false;
309312

310-
ret = userdb_all(nss_glue_userdb_flags(), &getpwent_data.iterator) < 0 ?
311-
NSS_STATUS_UNAVAIL : NSS_STATUS_SUCCESS;
312-
313-
assert_se(pthread_mutex_unlock(&getpwent_data.mutex) == 0);
314-
return ret;
313+
r = userdb_all(nss_glue_userdb_flags(), &getpwent_data.iterator);
314+
return r < 0 ? NSS_STATUS_UNAVAIL : NSS_STATUS_SUCCESS;
315315
}
316316

317317
enum nss_status _nss_systemd_setgrent(int stayopen) {
318-
enum nss_status ret;
319-
320318
PROTECT_ERRNO;
321319
BLOCK_SIGNALS(NSS_SIGNALS_BLOCK);
322320

323321
if (userdb_nss_compat_is_enabled() <= 0)
324322
return NSS_STATUS_NOTFOUND;
325323

326-
assert_se(pthread_mutex_lock(&getgrent_data.mutex) == 0);
324+
_cleanup_(pthread_mutex_unlock_assertp) pthread_mutex_t *_l = NULL;
325+
int r;
326+
327+
_l = pthread_mutex_lock_assert(&getgrent_data.mutex);
327328

328329
getgrent_data.iterator = userdb_iterator_free(getgrent_data.iterator);
329330
getpwent_data.by_membership = false;
330331

331-
ret = groupdb_all(nss_glue_userdb_flags(), &getgrent_data.iterator) < 0 ?
332-
NSS_STATUS_UNAVAIL : NSS_STATUS_SUCCESS;
333-
334-
assert_se(pthread_mutex_unlock(&getgrent_data.mutex) == 0);
335-
return ret;
332+
r = groupdb_all(nss_glue_userdb_flags(), &getgrent_data.iterator);
333+
return r < 0 ? NSS_STATUS_UNAVAIL : NSS_STATUS_SUCCESS;
336334
}
337335

338336
enum nss_status _nss_systemd_getpwent_r(
@@ -341,7 +339,6 @@ enum nss_status _nss_systemd_getpwent_r(
341339
int *errnop) {
342340

343341
_cleanup_(user_record_unrefp) UserRecord *ur = NULL;
344-
enum nss_status ret;
345342
int r;
346343

347344
PROTECT_ERRNO;
@@ -359,40 +356,33 @@ enum nss_status _nss_systemd_getpwent_r(
359356
if (!r)
360357
return NSS_STATUS_NOTFOUND;
361358

362-
assert_se(pthread_mutex_lock(&getpwent_data.mutex) == 0);
359+
_cleanup_(pthread_mutex_unlock_assertp) pthread_mutex_t *_l = NULL;
360+
361+
_l = pthread_mutex_lock_assert(&getpwent_data.mutex);
363362

364363
if (!getpwent_data.iterator) {
365364
UNPROTECT_ERRNO;
366365
*errnop = EHOSTDOWN;
367-
ret = NSS_STATUS_UNAVAIL;
368-
goto finish;
366+
return NSS_STATUS_UNAVAIL;
369367
}
370368

371369
r = userdb_iterator_get(getpwent_data.iterator, &ur);
372-
if (r == -ESRCH) {
373-
ret = NSS_STATUS_NOTFOUND;
374-
goto finish;
375-
}
370+
if (r == -ESRCH)
371+
return NSS_STATUS_NOTFOUND;
376372
if (r < 0) {
377373
UNPROTECT_ERRNO;
378374
*errnop = -r;
379-
ret = NSS_STATUS_UNAVAIL;
380-
goto finish;
375+
return NSS_STATUS_UNAVAIL;
381376
}
382377

383378
r = nss_pack_user_record(ur, result, buffer, buflen);
384379
if (r < 0) {
385380
UNPROTECT_ERRNO;
386381
*errnop = -r;
387-
ret = NSS_STATUS_TRYAGAIN;
388-
goto finish;
382+
return NSS_STATUS_TRYAGAIN;
389383
}
390384

391-
ret = NSS_STATUS_SUCCESS;
392-
393-
finish:
394-
assert_se(pthread_mutex_unlock(&getpwent_data.mutex) == 0);
395-
return ret;
385+
return NSS_STATUS_SUCCESS;
396386
}
397387

398388
enum nss_status _nss_systemd_getgrent_r(
@@ -402,7 +392,6 @@ enum nss_status _nss_systemd_getgrent_r(
402392

403393
_cleanup_(group_record_unrefp) GroupRecord *gr = NULL;
404394
_cleanup_free_ char **members = NULL;
405-
enum nss_status ret;
406395
int r;
407396

408397
PROTECT_ERRNO;
@@ -420,13 +409,14 @@ enum nss_status _nss_systemd_getgrent_r(
420409
if (!r)
421410
return NSS_STATUS_UNAVAIL;
422411

423-
assert_se(pthread_mutex_lock(&getgrent_data.mutex) == 0);
412+
_cleanup_(pthread_mutex_unlock_assertp) pthread_mutex_t *_l = NULL;
413+
414+
_l = pthread_mutex_lock_assert(&getgrent_data.mutex);
424415

425416
if (!getgrent_data.iterator) {
426417
UNPROTECT_ERRNO;
427418
*errnop = EHOSTDOWN;
428-
ret = NSS_STATUS_UNAVAIL;
429-
goto finish;
419+
return NSS_STATUS_UNAVAIL;
430420
}
431421

432422
if (!getgrent_data.by_membership) {
@@ -444,23 +434,20 @@ enum nss_status _nss_systemd_getgrent_r(
444434
if (r < 0) {
445435
UNPROTECT_ERRNO;
446436
*errnop = -r;
447-
ret = NSS_STATUS_UNAVAIL;
448-
goto finish;
437+
return NSS_STATUS_UNAVAIL;
449438
}
450439

451440
getgrent_data.by_membership = true;
452441
} else if (r < 0) {
453442
UNPROTECT_ERRNO;
454443
*errnop = -r;
455-
ret = NSS_STATUS_UNAVAIL;
456-
goto finish;
444+
return NSS_STATUS_UNAVAIL;
457445
} else if (!STR_IN_SET(gr->group_name, root_group.gr_name, nobody_group.gr_name)) {
458446
r = membershipdb_by_group_strv(gr->group_name, nss_glue_userdb_flags(), &members);
459447
if (r < 0) {
460448
UNPROTECT_ERRNO;
461449
*errnop = -r;
462-
ret = NSS_STATUS_UNAVAIL;
463-
goto finish;
450+
return NSS_STATUS_UNAVAIL;
464451
}
465452
}
466453
}
@@ -472,15 +459,12 @@ enum nss_status _nss_systemd_getgrent_r(
472459
_cleanup_free_ char *user_name = NULL, *group_name = NULL;
473460

474461
r = membershipdb_iterator_get(getgrent_data.iterator, &user_name, &group_name);
475-
if (r == -ESRCH) {
476-
ret = NSS_STATUS_NOTFOUND;
477-
goto finish;
478-
}
462+
if (r == -ESRCH)
463+
return NSS_STATUS_NOTFOUND;
479464
if (r < 0) {
480465
UNPROTECT_ERRNO;
481466
*errnop = -r;
482-
ret = NSS_STATUS_UNAVAIL;
483-
goto finish;
467+
return NSS_STATUS_UNAVAIL;
484468
}
485469

486470
if (STR_IN_SET(user_name, root_passwd.pw_name, nobody_passwd.pw_name))
@@ -494,8 +478,7 @@ enum nss_status _nss_systemd_getgrent_r(
494478
if (lock_fd < 0 && lock_fd != -EBUSY) {
495479
UNPROTECT_ERRNO;
496480
*errnop = -lock_fd;
497-
ret = NSS_STATUS_UNAVAIL;
498-
goto finish;
481+
return NSS_STATUS_UNAVAIL;
499482
}
500483
}
501484

@@ -511,8 +494,7 @@ enum nss_status _nss_systemd_getgrent_r(
511494
if (!members) {
512495
UNPROTECT_ERRNO;
513496
*errnop = ENOMEM;
514-
ret = NSS_STATUS_TRYAGAIN;
515-
goto finish;
497+
return NSS_STATUS_TRYAGAIN;
516498
}
517499

518500
/* Note that we currently generate one group entry per user that is part of a
@@ -526,15 +508,10 @@ enum nss_status _nss_systemd_getgrent_r(
526508
if (r < 0) {
527509
UNPROTECT_ERRNO;
528510
*errnop = -r;
529-
ret = NSS_STATUS_TRYAGAIN;
530-
goto finish;
511+
return NSS_STATUS_TRYAGAIN;
531512
}
532513

533-
ret = NSS_STATUS_SUCCESS;
534-
535-
finish:
536-
assert_se(pthread_mutex_unlock(&getgrent_data.mutex) == 0);
537-
return ret;
514+
return NSS_STATUS_SUCCESS;
538515
}
539516

540517
enum nss_status _nss_systemd_initgroups_dyn(

0 commit comments

Comments
 (0)