diff --git a/lib/libc/gen/getgrent.c b/lib/libc/gen/getgrent.c --- a/lib/libc/gen/getgrent.c +++ b/lib/libc/gen/getgrent.c @@ -347,16 +347,16 @@ memcpy(&p, buffer + sizeof(struct group), sizeof(char *)); if (orig_buf_size + sizeof(struct group) + sizeof(char *) + - _ALIGN(p) - (size_t)p < buffer_size) { + __nss_buf_misalignment(p) < buffer_size) { *ret_errno = ERANGE; return (NS_RETURN); } orig_buf = (char *)_ALIGN(orig_buf); memcpy(orig_buf, buffer + sizeof(struct group) + sizeof(char *) + - _ALIGN(p) - (size_t)p, + __nss_buf_misalignment(p), buffer_size - sizeof(struct group) - sizeof(char *) - - _ALIGN(p) + (size_t)p); + __nss_buf_misalignment(p)); p = (char *)_ALIGN(p); NS_APPLY_OFFSET(grp->gr_name, orig_buf, p, char *); diff --git a/lib/libc/include/nscache.h b/lib/libc/include/nscache.h --- a/lib/libc/include/nscache.h +++ b/lib/libc/include/nscache.h @@ -29,6 +29,8 @@ #ifndef __NS_CACHE_H__ #define __NS_CACHE_H__ +#include + #include "nscachedcli.h" typedef int (*nss_cache_id_func_t)(char *, size_t *, va_list, void *); @@ -178,6 +180,12 @@ } nss_cache_data; __BEGIN_DECLS +static inline __ptrdiff_t +__nss_buf_misalignment(const void *p) +{ + return ((char *)_ALIGN(p) - (char *)p); +} + /* dummy function, which is needed to make nss_method_lookup happy */ extern int __nss_cache_handler(void *, void *, va_list); diff --git a/lib/libc/net/gethostnamadr.c b/lib/libc/net/gethostnamadr.c --- a/lib/libc/net/gethostnamadr.c +++ b/lib/libc/net/gethostnamadr.c @@ -402,9 +402,9 @@ orig_buf = (char *)_ALIGN(orig_buf); memcpy(orig_buf, buffer + sizeof(struct hostent) + sizeof(char *) + - _ALIGN(p) - (size_t)p, + __nss_buf_misalignment(p), buffer_size - sizeof(struct hostent) - sizeof(char *) - - _ALIGN(p) + (size_t)p); + __nss_buf_misalignment(p)); p = (char *)_ALIGN(p); NS_APPLY_OFFSET(ht->h_name, orig_buf, p, char *); diff --git a/lib/libc/net/getnetnamadr.c b/lib/libc/net/getnetnamadr.c --- a/lib/libc/net/getnetnamadr.c +++ b/lib/libc/net/getnetnamadr.c @@ -249,9 +249,9 @@ orig_buf = (char *)_ALIGN(orig_buf); memcpy(orig_buf, buffer + sizeof(struct netent) + sizeof(char *) + - _ALIGN(p) - (size_t)p, + __nss_buf_misalignment(p), buffer_size - sizeof(struct netent) - sizeof(char *) - - _ALIGN(p) + (size_t)p); + __nss_buf_misalignment(p)); p = (char *)_ALIGN(p); NS_APPLY_OFFSET(ne->n_name, orig_buf, p, char *); diff --git a/lib/libc/net/getprotoent.c b/lib/libc/net/getprotoent.c --- a/lib/libc/net/getprotoent.c +++ b/lib/libc/net/getprotoent.c @@ -265,9 +265,9 @@ orig_buf = (char *)_ALIGN(orig_buf); memcpy(orig_buf, buffer + sizeof(struct protoent) + sizeof(char *) + - _ALIGN(p) - (size_t)p, + __nss_buf_misalignment(p), buffer_size - sizeof(struct protoent) - sizeof(char *) - - _ALIGN(p) + (size_t)p); + __nss_buf_misalignment(p)); p = (char *)_ALIGN(p); NS_APPLY_OFFSET(proto->p_name, orig_buf, p, char *); diff --git a/lib/libc/net/getservent.c b/lib/libc/net/getservent.c --- a/lib/libc/net/getservent.c +++ b/lib/libc/net/getservent.c @@ -1084,9 +1084,9 @@ orig_buf = (char *)_ALIGN(orig_buf); memcpy(orig_buf, buffer + sizeof(struct servent) + sizeof(char *) + - (_ALIGN(p) - (size_t)p), + __nss_buf_misalignment(p), buffer_size - sizeof(struct servent) - sizeof(char *) - - (_ALIGN(p) - (size_t)p)); + __nss_buf_misalignment(p)); p = (char *)_ALIGN(p); NS_APPLY_OFFSET(serv->s_name, orig_buf, p, char *); diff --git a/lib/libc/rpc/getrpcent.c b/lib/libc/rpc/getrpcent.c --- a/lib/libc/rpc/getrpcent.c +++ b/lib/libc/rpc/getrpcent.c @@ -778,9 +778,9 @@ orig_buf = (char *)_ALIGN(orig_buf); memcpy(orig_buf, buffer + sizeof(struct rpcent) + sizeof(char *) + - _ALIGN(p) - (size_t)p, + __nss_buf_misalignment(p), buffer_size - sizeof(struct rpcent) - sizeof(char *) - - _ALIGN(p) + (size_t)p); + __nss_buf_misalignment(p)); p = (char *)_ALIGN(p); NS_APPLY_OFFSET(rpc->r_name, orig_buf, p, char *);