From 8bf65dbab8703697c85b033beb5c189fce17b036 Mon Sep 17 00:00:00 2001 From: Michal Zidek Date: Tue, 10 Sep 2013 23:09:04 +0200 Subject: Properly align buffer when storing pointers. Properly align buffer address to sizeof(char *) when storing pointers to strings. resolves: https://fedorahosted.org/sssd/ticket/1359 --- src/sss_client/nss_group.c | 8 +++----- src/sss_client/nss_mc_group.c | 10 +++++++++- src/sss_client/nss_services.c | 7 ++----- src/util/util_safealign.h | 10 ++++++++++ 4 files changed, 24 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/sss_client/nss_group.c b/src/sss_client/nss_group.c index a7fb0937..9e259318 100644 --- a/src/sss_client/nss_group.c +++ b/src/sss_client/nss_group.c @@ -233,14 +233,12 @@ static int sss_nss_getgr_readrep(struct sss_nss_gr_rep *pr, NULL); if (ret != EOK) return ret; - /* Make sure pr->buffer[i+pad] is 32 bit aligned */ - pad = 0; - while((i + pad) % 4) { - pad++; - } + /* Make sure pr->buffer[i+pad] is aligned to sizeof(char *) */ + pad = PADDING_SIZE(i, char *); /* now members */ pr->result->gr_mem = (char **)&(pr->buffer[i+pad]); + ptmem = (sizeof(char *) * (mem_num + 1)) + pad; if (ptmem > dlen) { return ERANGE; /* not ENOMEM, ERANGE is what glibc looks for */ diff --git a/src/sss_client/nss_mc_group.c b/src/sss_client/nss_mc_group.c index 5610233e..fb5e43f8 100644 --- a/src/sss_client/nss_mc_group.c +++ b/src/sss_client/nss_mc_group.c @@ -27,6 +27,7 @@ #include #include #include "nss_mc.h" +#include "util/util_safealign.h" struct sss_cli_mc_ctx gr_mc_ctx = { false, -1, 0, NULL, 0, NULL, 0, NULL, 0 }; @@ -64,7 +65,14 @@ static errno_t sss_nss_mc_parse_result(struct sss_mc_rec *rec, /* fill in group */ result->gr_gid = data->gid; - result->gr_mem = (char **)buffer; + + /* The address &buffer[0] must be aligned to sizeof(char *) */ + if (!IS_ALIGNED(buffer, char *)) { + /* The buffer is not properly aligned. */ + return EFAULT; + } + + result->gr_mem = (char **)DISCARD_ALIGN(buffer); result->gr_mem[data->members] = NULL; cookie = NULL; diff --git a/src/sss_client/nss_services.c b/src/sss_client/nss_services.c index b40e1fa9..e89e0d2f 100644 --- a/src/sss_client/nss_services.c +++ b/src/sss_client/nss_services.c @@ -127,11 +127,8 @@ sss_nss_getsvc_readrep(struct sss_nss_svc_rep *sr, NULL); if (ret != EOK) return ret; - /* Make sure sr->buffer[i+pad] is 32-bit aligned */ - pad = 0; - while((i + pad) % 4) { - pad++; - } + /* Make sure sr->buffer[i+pad] is aligned to sizeof(char *) */ + pad = PADDING_SIZE(i, char *); /* Copy in the aliases */ sr->result->s_aliases = (char **) &(sr->buffer[i+pad]); diff --git a/src/util/util_safealign.h b/src/util/util_safealign.h index c39ba159..685d6596 100644 --- a/src/util/util_safealign.h +++ b/src/util/util_safealign.h @@ -32,6 +32,16 @@ #include #include +/* Use this macro to suppress alignment warnings (use it + * only to suppress false-positives) */ +#define DISCARD_ALIGN(ptr) ((void *)(ptr)) + +#define IS_ALIGNED(ptr, type) \ + ((uintptr_t)(ptr) % sizeof(type) == 0) + +#define PADDING_SIZE(base, type) \ + ((sizeof(type) - ((base) % sizeof(type))) % sizeof(type)) + #define SIZE_T_OVERFLOW(current, add) \ (((size_t)(add)) > (SIZE_MAX - ((size_t)(current)))) -- cgit