diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2018-08-21 09:39:55 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2018-09-21 10:29:40 +0200 |
commit | 2df56dbd60bb5d925d2ce0ddbdefdbe6107ea783 (patch) | |
tree | bd7bad558534db4a1f400bc38a2c9aa7ea4f411e /freebsd/lib | |
parent | Update to FreeBSD head 2018-02-01 (diff) | |
download | rtems-libbsd-2df56dbd60bb5d925d2ce0ddbdefdbe6107ea783.tar.bz2 |
Update to FreeBSD head 2018-04-01
Git mirror commit 8dfb1ccc26d1cea7e2529303003ff61f9f1784c4.
Update #3472.
Diffstat (limited to 'freebsd/lib')
-rw-r--r-- | freebsd/lib/libc/include/libc_private.h | 2 | ||||
-rw-r--r-- | freebsd/lib/libc/net/getnameinfo.c | 26 | ||||
-rw-r--r-- | freebsd/lib/libc/rpc/svc_dg.c | 2 | ||||
-rw-r--r-- | freebsd/lib/libcasper/libcasper/libcasper.h | 46 |
4 files changed, 58 insertions, 18 deletions
diff --git a/freebsd/lib/libc/include/libc_private.h b/freebsd/lib/libc/include/libc_private.h index 8e78f556..f5a2a570 100644 --- a/freebsd/lib/libc/include/libc_private.h +++ b/freebsd/lib/libc/include/libc_private.h @@ -409,6 +409,8 @@ int __sys_futimens(int fd, const struct timespec *times) __hidden; int __sys_utimensat(int fd, const char *path, const struct timespec *times, int flag) __hidden; +__size_t __arc4_sysctl(unsigned char *, __size_t); + /* execve() with PATH processing to implement posix_spawnp() */ int _execvpe(const char *, char * const *, char * const *); diff --git a/freebsd/lib/libc/net/getnameinfo.c b/freebsd/lib/libc/net/getnameinfo.c index 741972de..d553ee5c 100644 --- a/freebsd/lib/libc/net/getnameinfo.c +++ b/freebsd/lib/libc/net/getnameinfo.c @@ -126,26 +126,36 @@ getnameinfo(const struct sockaddr *sa, socklen_t salen, afd = find_afd(sa->sa_family); if (afd == NULL) return (EAI_FAMILY); + /* + * getnameinfo() accepts an salen of sizeof(struct sockaddr_storage) + * at maximum as shown in RFC 4038 Sec.6.2.3. + */ + if (salen > sizeof(struct sockaddr_storage)) + return (EAI_FAMILY); + switch (sa->sa_family) { case PF_LOCAL: /* - * PF_LOCAL uses variable sa->sa_len depending on the + * PF_LOCAL uses variable salen depending on the * content length of sun_path. Require 1 byte in * sun_path at least. */ - if (salen > afd->a_socklen || - salen <= afd->a_socklen - + if (salen <= afd->a_socklen - sizeofmember(struct sockaddr_un, sun_path)) - return (EAI_FAIL); + return (EAI_FAMILY); + else if (salen > afd->a_socklen) + salen = afd->a_socklen; break; case PF_LINK: if (salen <= afd->a_socklen - sizeofmember(struct sockaddr_dl, sdl_data)) - return (EAI_FAIL); + return (EAI_FAMILY); break; default: - if (salen != afd->a_socklen) - return (EAI_FAIL); + if (salen < afd->a_socklen) + return (EAI_FAMILY); + else + salen = afd->a_socklen; break; } @@ -519,7 +529,7 @@ getnameinfo_un(const struct afd *afd, if (serv != NULL && servlen > 0) *serv = '\0'; if (host != NULL && hostlen > 0) { - pathlen = sa->sa_len - afd->a_off; + pathlen = salen - afd->a_off; if (pathlen + 1 > hostlen) { *host = '\0'; diff --git a/freebsd/lib/libc/rpc/svc_dg.c b/freebsd/lib/libc/rpc/svc_dg.c index f2a42346..87925cbc 100644 --- a/freebsd/lib/libc/rpc/svc_dg.c +++ b/freebsd/lib/libc/rpc/svc_dg.c @@ -70,7 +70,7 @@ __FBSDID("$FreeBSD$"); #include "rpc_com.h" #include "mt_misc.h" -#define su_data(xprt) ((struct svc_dg_data *)(xprt->xp_p2)) +#define su_data(xprt) ((struct svc_dg_data *)((xprt)->xp_p2)) #define rpc_buffer(xprt) ((xprt)->xp_p1) #ifndef MAX diff --git a/freebsd/lib/libcasper/libcasper/libcasper.h b/freebsd/lib/libcasper/libcasper/libcasper.h index 6e1bfdba..81d65f56 100644 --- a/freebsd/lib/libcasper/libcasper/libcasper.h +++ b/freebsd/lib/libcasper/libcasper/libcasper.h @@ -45,6 +45,8 @@ #include <stdlib.h> #include <unistd.h> +#define CASPER_NO_UNIQ 0x00000001 + #ifndef _NVLIST_T_DECLARED #define _NVLIST_T_DECLARED struct nvlist; @@ -62,12 +64,36 @@ typedef struct cap_channel cap_channel_t; #else struct cap_channel { int cch_fd; + int cch_flags; }; typedef struct cap_channel cap_channel_t; #define CASPER_SUPPORT (0) #endif /* ! WITH_CASPER */ #endif /* ! _CAP_CHANNEL_T_DECLARED */ +#ifdef WITH_CASPER +int cap_channel_flags(const cap_channel_t *chan); +#else +static inline int +cap_channel_flags(const cap_channel_t *chan) +{ + + return (chan->cch_flags); +} +#endif + +static inline int +channel_nvlist_flags(const cap_channel_t *chan) +{ + int flags; + + flags = 0; + if ((cap_channel_flags(chan) & CASPER_NO_UNIQ) != 0) + flags |= NV_FLAG_NO_UNIQUE; + + return (flags); +} + /* * The functions opens unrestricted communication channel to Casper. */ @@ -103,16 +129,17 @@ int cap_service_limit(const cap_channel_t *chan, * The function creates cap_channel_t based on the given socket. */ #ifdef WITH_CASPER -cap_channel_t *cap_wrap(int sock); +cap_channel_t *cap_wrap(int sock, int flags); #else static inline cap_channel_t * -cap_wrap(int sock) +cap_wrap(int sock, int flags) { cap_channel_t *chan; chan = cap_init(); if (chan != NULL) { chan->cch_fd = sock; + chan->cch_flags = flags; } return (chan); } @@ -122,7 +149,7 @@ cap_wrap(int sock) * The function returns communication socket and frees cap_channel_t. */ #ifdef WITH_CASPER -int cap_unwrap(cap_channel_t *chan); +int cap_unwrap(cap_channel_t *chan, int *flags); #else static inline int cap_unwrap(cap_channel_t *chan) @@ -160,6 +187,7 @@ cap_clone(const cap_channel_t *chan) newchan = NULL; } } + newchan->cch_flags = chan->cch_flags; return (newchan); } @@ -212,7 +240,7 @@ static inline int cap_limit_get(const cap_channel_t *chan __unused, nvlist_t **limitsp) { - *limitsp = nvlist_create(0); + *limitsp = nvlist_create(channel_nvlist_flags(chan)); return (0); } #endif @@ -230,9 +258,9 @@ int cap_send_nvlist(const cap_channel_t *chan, const nvlist_t *nvl); * Function receives nvlist over the given capability. */ #ifdef WITH_CASPER -nvlist_t *cap_recv_nvlist(const cap_channel_t *chan, int flags); +nvlist_t *cap_recv_nvlist(const cap_channel_t *chan); #else -#define cap_recv_nvlist(chan, flags) (nvlist_create(flags)) +#define cap_recv_nvlist(chan) (nvlist_create(chan->cch_flags)) #endif /* @@ -240,14 +268,14 @@ nvlist_t *cap_recv_nvlist(const cap_channel_t *chan, int flags); * response over the given capability. */ #ifdef WITH_CASPER -nvlist_t *cap_xfer_nvlist(const cap_channel_t *chan, nvlist_t *nvl, int flags); +nvlist_t *cap_xfer_nvlist(const cap_channel_t *chan, nvlist_t *nvl); #else static inline nvlist_t * -cap_xfer_nvlist(const cap_channel_t *chan __unused, nvlist_t *nvl, int flags) +cap_xfer_nvlist(const cap_channel_t *chan, nvlist_t *nvl) { nvlist_destroy(nvl); - return (nvlist_create(flags)); + return (nvlist_create(channel_nvlist_flags(chan))); } #endif |