aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2017-12-30 15:15:44 +0100
committerLennart Poettering <lennart@poettering.net>2018-01-04 13:28:24 +0100
commit217d89678269334f461e9abeeffed57077b21454 (patch)
tree530f5b8752db250b44c669e24ded6945ec1bc52c /src/basic/socket-util.c
parenttree-wide: use {pid,uid,gid}_is_valid() where appropriate (diff)
downloadsystemd-217d89678269334f461e9abeeffed57077b21454.tar.gz
systemd-217d89678269334f461e9abeeffed57077b21454.tar.bz2
systemd-217d89678269334f461e9abeeffed57077b21454.zip
socket-util: slight rework of getpeersec()
Let's call getsockopt() in a loop, so that we can deal correctly with the label changing while we are trying to read it. (also, while we are at it, let's make sure that there's always one trailing NUL byte at the end of the buffer, after all SO_PEERSEC has zero documentation, and multiple implementing backends, hence let's better be safe than sorry)
Diffstat (limited to 'src/basic/socket-util.c')
-rw-r--r--src/basic/socket-util.c31
1 files changed, 11 insertions, 20 deletions
diff --git a/src/basic/socket-util.c b/src/basic/socket-util.c
index d67fbd213..cb10a1dd0 100644
--- a/src/basic/socket-util.c
+++ b/src/basic/socket-util.c
@@ -979,41 +979,32 @@ int getpeercred(int fd, struct ucred *ucred) {
}
int getpeersec(int fd, char **ret) {
+ _cleanup_free_ char *s = NULL;
socklen_t n = 64;
- char *s;
- int r;
assert(fd >= 0);
assert(ret);
- s = new0(char, n);
- if (!s)
- return -ENOMEM;
+ for (;;) {
+ s = new0(char, n+1);
+ if (!s)
+ return -ENOMEM;
- r = getsockopt(fd, SOL_SOCKET, SO_PEERSEC, s, &n);
- if (r < 0) {
- free(s);
+ if (getsockopt(fd, SOL_SOCKET, SO_PEERSEC, s, &n) >= 0)
+ break;
if (errno != ERANGE)
return -errno;
- s = new0(char, n);
- if (!s)
- return -ENOMEM;
-
- r = getsockopt(fd, SOL_SOCKET, SO_PEERSEC, s, &n);
- if (r < 0) {
- free(s);
- return -errno;
- }
+ s = mfree(s);
}
- if (isempty(s)) {
- free(s);
+ if (isempty(s))
return -EOPNOTSUPP;
- }
*ret = s;
+ s = NULL;
+
return 0;
}