summaryrefslogtreecommitdiff
path: root/sysdeps/unix/sysv/linux/setsourcefilter.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2004-08-06 09:25:59 +0000
committerUlrich Drepper <drepper@redhat.com>2004-08-06 09:25:59 +0000
commit9030e7c44aa75345336673c0252974ead4eb8364 (patch)
treec898cc7e9f7f6e5559cacaa0c1dc78893628bd54 /sysdeps/unix/sysv/linux/setsourcefilter.c
parenta55bda85baca5feee69b7bc01b9c76f89a6347dd (diff)
Update.
2004-07-30 Guido Guenther <agx@sigxcpu.org> * nss/getent.c (passwd_keys): Use strtoul instead of isdigit to test if the key is numeric or not. (group_keys): Likewise.
Diffstat (limited to 'sysdeps/unix/sysv/linux/setsourcefilter.c')
-rw-r--r--sysdeps/unix/sysv/linux/setsourcefilter.c24
1 files changed, 18 insertions, 6 deletions
diff --git a/sysdeps/unix/sysv/linux/setsourcefilter.c b/sysdeps/unix/sysv/linux/setsourcefilter.c
index f9f75c43cd..027699bd94 100644
--- a/sysdeps/unix/sysv/linux/setsourcefilter.c
+++ b/sysdeps/unix/sysv/linux/setsourcefilter.c
@@ -26,6 +26,10 @@
#include <sys/socket.h>
+/* Defined in getsourcefilter.c. */
+extern int __get_sol (int af, socklen_t len);
+
+
int
setsourcefilter (int s, uint32_t interface, struct sockaddr *group,
socklen_t grouplen, uint32_t fmode, uint32_t numsrc,
@@ -34,17 +38,17 @@ setsourcefilter (int s, uint32_t interface, struct sockaddr *group,
/* We have to create an struct ip_msfilter object which we can pass
to the kernel. */
size_t needed = GROUP_FILTER_SIZE (numsrc);
- int use_malloc = __libc_use_alloca (needed);
+ int use_alloca = __libc_use_alloca (needed);
struct group_filter *gf;
- if (use_malloc)
+ if (use_alloca)
+ gf = (struct group_filter *) alloca (needed);
+ else
{
gf = (struct group_filter *) malloc (needed);
if (gf == NULL)
return -1;
}
- else
- gf = (struct group_filter *) alloca (needed);
gf->gf_interface = interface;
memcpy (&gf->gf_group, group, grouplen);
@@ -52,9 +56,17 @@ setsourcefilter (int s, uint32_t interface, struct sockaddr *group,
gf->gf_numsrc = numsrc;
memcpy (gf->gf_slist, slist, numsrc * sizeof (struct sockaddr_storage));
- int result = __setsockopt (s, SOL_IP, MCAST_MSFILTER, gf, needed);
+ /* We need to provide the appropriate socket level value. */
+ int sol = __get_sol (group->sa_family, grouplen);
+ if (sol == -1)
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ int result = __setsockopt (s, sol, MCAST_MSFILTER, gf, needed);
- if (use_malloc)
+ if (! use_alloca)
{
int save_errno = errno;
free (gf);