From 5459570bb0ef795065dcf71365c83e5b7cb58cd7 Mon Sep 17 00:00:00 2001 From: Stephen Gallagher Date: Fri, 18 Nov 2011 12:28:55 -0500 Subject: RESPONDER: Ensure that all input strings are valid UTF-8 --- src/responder/common/responder.h | 2 ++ src/responder/common/responder_common.c | 8 ++++++++ src/responder/nss/nsssrv_cmd.c | 21 +++++++++++++++++++++ src/responder/nss/nsssrv_netgroup.c | 7 +++++++ src/responder/pam/pamsrv_cmd.c | 5 +++++ 5 files changed, 43 insertions(+) (limited to 'src/responder') diff --git a/src/responder/common/responder.h b/src/responder/common/responder.h index 6b81aadac..29bfff06e 100644 --- a/src/responder/common/responder.h +++ b/src/responder/common/responder.h @@ -171,4 +171,6 @@ int sss_dp_send_acct_req(struct resp_ctx *rctx, TALLOC_CTX *callback_memctx, bool fast_reply, int type, const char *opt_name, uint32_t opt_id); +bool sss_utf8_check(const uint8_t *s, size_t n); + #endif /* __SSS_RESPONDER_H__ */ diff --git a/src/responder/common/responder_common.c b/src/responder/common/responder_common.c index 2a4a5d20c..5389031bc 100644 --- a/src/responder/common/responder_common.c +++ b/src/responder/common/responder_common.c @@ -33,6 +33,7 @@ #include #include #include +#include #include "config.h" #include "util/util.h" #include "db/sysdb.h" @@ -683,3 +684,10 @@ int sss_dp_get_domain_conn(struct resp_ctx *rctx, const char *domain, return EOK; } +bool sss_utf8_check(const uint8_t *s, size_t n) +{ + if (u8_check(s, n) == NULL) { + return true; + } + return false; +} diff --git a/src/responder/nss/nsssrv_cmd.c b/src/responder/nss/nsssrv_cmd.c index 2aa7a9126..31a47210d 100644 --- a/src/responder/nss/nsssrv_cmd.c +++ b/src/responder/nss/nsssrv_cmd.c @@ -873,6 +873,13 @@ static int nss_cmd_getpwnam(struct cli_ctx *cctx) ret = EINVAL; goto done; } + + /* If the body isn't valid UTF-8, fail */ + if (!sss_utf8_check(body, blen)) { + ret = EINVAL; + goto done; + } + rawname = (const char *)body; domname = NULL; @@ -2140,6 +2147,13 @@ static int nss_cmd_getgrnam(struct cli_ctx *cctx) ret = EINVAL; goto done; } + + /* If the body isn't valid UTF-8, fail */ + if (!sss_utf8_check(body, blen)) { + ret = EINVAL; + goto done; + } + rawname = (const char *)body; domname = NULL; @@ -3180,6 +3194,13 @@ static int nss_cmd_initgroups(struct cli_ctx *cctx) ret = EINVAL; goto done; } + + /* If the body isn't valid UTF-8, fail */ + if (!sss_utf8_check(body, blen)) { + ret = EINVAL; + goto done; + } + rawname = (const char *)body; domname = NULL; diff --git a/src/responder/nss/nsssrv_netgroup.c b/src/responder/nss/nsssrv_netgroup.c index dbee7f2de..ac586c960 100644 --- a/src/responder/nss/nsssrv_netgroup.c +++ b/src/responder/nss/nsssrv_netgroup.c @@ -113,6 +113,13 @@ int nss_cmd_setnetgrent(struct cli_ctx *client) ret = EINVAL; goto done; } + + /* If the body isn't valid UTF-8, fail */ + if (!sss_utf8_check(body, blen)) { + ret = EINVAL; + goto done; + } + rawname = (const char *)body; req = setnetgrent_send(cmdctx, rawname, cmdctx); diff --git a/src/responder/pam/pamsrv_cmd.c b/src/responder/pam/pamsrv_cmd.c index 3c9d7600a..cbf22236e 100644 --- a/src/responder/pam/pamsrv_cmd.c +++ b/src/responder/pam/pamsrv_cmd.c @@ -70,6 +70,11 @@ static int extract_string(char **var, size_t size, uint8_t *body, size_t blen, if (str[size-1]!='\0') return EINVAL; + /* If the string isn't valid UTF-8, fail */ + if (!sss_utf8_check(str, size)) { + return EINVAL; + } + *c += size; *var = (char *) str; -- cgit