blob: 684996ed537cba70c0faba961eff96f84a28a0ef (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
/* ISC license. */
#include <stdint.h>
#include <string.h>
#include <errno.h>
#include "nsss-internal.h"
int nsss_grp_copy (struct group *gr, char *buf, size_t buflen, struct group const *gr2, char const *s, size_t len, char *const *p, size_t n)
{
char **q ;
size_t offset = (uintptr_t)buf % 16 ;
offset = offset ? 16 - offset : 0 ;
if (buflen < offset) return (errno = ERANGE, 0) ;
buf += offset ; buflen -= offset ;
offset = (n+1) * sizeof(char *) ;
if (buflen < offset || buflen - offset < len) return (errno = ERANGE, 0) ;
q = (char **)buf ;
gr->gr_mem = q ;
buf += offset ;
memcpy(buf, s, len) ;
for (size_t i = 0 ; i < n ; i++) q[i] = buf + (p[i] - s) ;
q[n] = 0 ;
gr->gr_name = buf + (gr2->gr_name - s) ;
gr->gr_passwd = buf + (gr2->gr_passwd - s) ;
gr->gr_gid = gr2->gr_gid ;
return 1 ;
}
|