X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fcore%2Fsocket.c;h=d57e7701cae642e1e6db007ee142b9d03c6a48bc;hb=9754d56;hp=7c18a2b75c17898676df6b6e7c79b33fe5bbabb6;hpb=5d2abc04fc95f5c5f6d0eaf2f9b06c70d504019f;p=elogind.git diff --git a/src/core/socket.c b/src/core/socket.c index 7c18a2b75..d57e7701c 100644 --- a/src/core/socket.c +++ b/src/core/socket.c @@ -663,17 +663,21 @@ static int instance_from_socket(int fd, unsigned nr, char **instance) { int k; k = getpeercred(fd, &ucred); - if (k < 0) + if (k >= 0) { + if (asprintf(&r, + "%u-"PID_FMT"-"UID_FMT, + nr, ucred.pid, ucred.uid) < 0) + return -ENOMEM; + } else if (k == -ENODATA) { + /* This handles the case where somebody is + * connecting from another pid/uid namespace + * (e.g. from outside of our container). */ + if (asprintf(&r, + "%u-unknown", + nr) < 0) + return -ENOMEM; + } else return k; - - if (asprintf(&r, - "%u-%lu-%lu", - nr, - (unsigned long) ucred.pid, - (unsigned long) ucred.uid) < 0) - return -ENOMEM; - - break; } default: