From cdccd29f39cd20cb2a8b71e50445eb839f076331 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 18 Jan 2019 20:13:55 +0100 Subject: nss: unportect errno before writing to NSS' *errnop Fixes: #11321 --- src/nss-systemd/nss-systemd.c | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'src/nss-systemd') diff --git a/src/nss-systemd/nss-systemd.c b/src/nss-systemd/nss-systemd.c index f554828d49..f8db27ae27 100644 --- a/src/nss-systemd/nss-systemd.c +++ b/src/nss-systemd/nss-systemd.c @@ -210,6 +210,7 @@ enum nss_status _nss_systemd_getpwnam_r( l = strlen(name); if (buflen < l+1) { + UNPROTECT_ERRNO; *errnop = ERANGE; return NSS_STATUS_TRYAGAIN; } @@ -227,6 +228,7 @@ enum nss_status _nss_systemd_getpwnam_r( return NSS_STATUS_SUCCESS; fail: + UNPROTECT_ERRNO; *errnop = -r; return NSS_STATUS_UNAVAIL; } @@ -310,6 +312,7 @@ enum nss_status _nss_systemd_getpwuid_r( l = strlen(translated) + 1; if (buflen < l) { + UNPROTECT_ERRNO; *errnop = ERANGE; return NSS_STATUS_TRYAGAIN; } @@ -327,6 +330,7 @@ enum nss_status _nss_systemd_getpwuid_r( return NSS_STATUS_SUCCESS; fail: + UNPROTECT_ERRNO; *errnop = -r; return NSS_STATUS_UNAVAIL; } @@ -408,6 +412,7 @@ enum nss_status _nss_systemd_getgrnam_r( l = sizeof(char*) + strlen(name) + 1; if (buflen < l) { + UNPROTECT_ERRNO; *errnop = ERANGE; return NSS_STATUS_TRYAGAIN; } @@ -423,6 +428,7 @@ enum nss_status _nss_systemd_getgrnam_r( return NSS_STATUS_SUCCESS; fail: + UNPROTECT_ERRNO; *errnop = -r; return NSS_STATUS_UNAVAIL; } @@ -506,6 +512,7 @@ enum nss_status _nss_systemd_getgrgid_r( l = sizeof(char*) + strlen(translated) + 1; if (buflen < l) { + UNPROTECT_ERRNO; *errnop = ERANGE; return NSS_STATUS_TRYAGAIN; } @@ -521,6 +528,7 @@ enum nss_status _nss_systemd_getgrgid_r( return NSS_STATUS_SUCCESS; fail: + UNPROTECT_ERRNO; *errnop = -r; return NSS_STATUS_UNAVAIL; } @@ -740,6 +748,7 @@ enum nss_status _nss_systemd_getpwent_r(struct passwd *result, char *buffer, siz LIST_FOREACH(entries, p, getpwent_data.position) { len = strlen(p->name) + 1; if (buflen < len) { + UNPROTECT_ERRNO; *errnop = ERANGE; ret = NSS_STATUS_TRYAGAIN; goto finalize; @@ -791,6 +800,7 @@ enum nss_status _nss_systemd_getgrent_r(struct group *result, char *buffer, size LIST_FOREACH(entries, p, getgrent_data.position) { len = sizeof(char*) + strlen(p->name) + 1; if (buflen < len) { + UNPROTECT_ERRNO; *errnop = ERANGE; ret = NSS_STATUS_TRYAGAIN; goto finalize; -- cgit v1.2.1