diff options
Diffstat (limited to 'src/util/connection.c')
-rw-r--r-- | src/util/connection.c | 49 |
1 files changed, 48 insertions, 1 deletions
diff --git a/src/util/connection.c b/src/util/connection.c index aa5db91bf..12969b3ba 100644 --- a/src/util/connection.c +++ b/src/util/connection.c | |||
@@ -346,6 +346,12 @@ GNUNET_CONNECTION_create_from_accept (GNUNET_CONNECTION_AccessCheck access, | |||
346 | struct sockaddr_in6 *v6; | 346 | struct sockaddr_in6 *v6; |
347 | struct sockaddr *sa; | 347 | struct sockaddr *sa; |
348 | void *uaddr; | 348 | void *uaddr; |
349 | struct GNUNET_CONNECTION_Credentials *gcp; | ||
350 | struct GNUNET_CONNECTION_Credentials gc; | ||
351 | #ifdef SO_PEERCRED | ||
352 | struct ucred uc; | ||
353 | socklen_t olen; | ||
354 | #endif | ||
349 | 355 | ||
350 | addrlen = sizeof (addr); | 356 | addrlen = sizeof (addr); |
351 | sock = | 357 | sock = |
@@ -384,9 +390,50 @@ GNUNET_CONNECTION_create_from_accept (GNUNET_CONNECTION_AccessCheck access, | |||
384 | uaddr = GNUNET_malloc (addrlen); | 390 | uaddr = GNUNET_malloc (addrlen); |
385 | memcpy (uaddr, addr, addrlen); | 391 | memcpy (uaddr, addr, addrlen); |
386 | } | 392 | } |
393 | gcp = NULL; | ||
394 | gc.uid = 0; | ||
395 | gc.gid = 0; | ||
396 | if (sa->sa_family == AF_UNIX) | ||
397 | { | ||
398 | #if HAVE_GETPEEREID | ||
399 | /* most BSDs */ | ||
400 | if (0 == getpeereid (GNUNET_NETWORK_get_fd (sock), | ||
401 | &gc.uid, | ||
402 | &gc.gid)) | ||
403 | gcp = &gc; | ||
404 | #else | ||
405 | #ifdef SO_PEERCRED | ||
406 | /* largely traditional GNU/Linux */ | ||
407 | olen = sizeof (uc); | ||
408 | if ( (0 == | ||
409 | getsockopt (GNUNET_NETWORK_get_fd (sock), | ||
410 | SOL_SOCKET, SO_PEERCRED, &uc, &olen)) && | ||
411 | (olen == sizeof (uc)) ) | ||
412 | { | ||
413 | gc.uid = uc.uid; | ||
414 | gc.gid = uc.gid; | ||
415 | gcp = &gc; | ||
416 | } | ||
417 | #else | ||
418 | #if HAVE_GETPEERUCRED | ||
419 | /* this is for Solaris 10 */ | ||
420 | ucred_t *uc; | ||
421 | |||
422 | uc = NULL; | ||
423 | if (0 == getpeerucred (GNUNET_NETWORK_get_fd (sock), &uc)) | ||
424 | { | ||
425 | gc.uid = ucred_geteuid (uc); | ||
426 | gc.gid = ucred_getegid (uc); | ||
427 | gcp = &gc; | ||
428 | } | ||
429 | ucred_free (uc); | ||
430 | #endif | ||
431 | #endif | ||
432 | #endif | ||
433 | } | ||
387 | 434 | ||
388 | if ((access != NULL) && | 435 | if ((access != NULL) && |
389 | (GNUNET_YES != (aret = access (access_cls, uaddr, addrlen)))) | 436 | (GNUNET_YES != (aret = access (access_cls, gcp, uaddr, addrlen)))) |
390 | { | 437 | { |
391 | if (aret == GNUNET_NO) | 438 | if (aret == GNUNET_NO) |
392 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | 439 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, |