On Tue, Jan 25, 2022 at 04:28:33PM -0800, Chad Fraleigh wrote:
> Since apparently linux will auto-detect (as mentioned by Marton Balint),
> based on the optlen parameter, just using unsigned char in all cases seems to
> be the cleanest. However, I would advise including a comment in the code to
> that effect which says to ignore the [outdated] linux documentation (so
> someone doesn't needlessly "correct" it in the future).
>
I agree with, use unsigned char is preferable for all system I think.
> I looked at the kernel source and it does work both ways:
>
> static int do_ip_setsockopt(struct sock *sk, int level, int optname,
> sockptr_t optval, unsigned int optlen)
> {
> ...
> switch (optname) {
> ...
> case IP_MULTICAST_TTL:
> ...
> if (optlen >= sizeof(int)) {
> if (copy_from_sockptr(&val, optval, sizeof(val)))
> return -EFAULT;
> } else if (optlen >= sizeof(char)) {
> unsigned char ucval;
>
> if (copy_from_sockptr(&ucval, optval, sizeof(ucval)))
> return -EFAULT;
> val = (int) ucval;
> }
> }
> ...
> }
>
> This check has been in the kernel since at least 2.6.12-rc2 (from Apr 2005).
> It should work fine, unless newer ffmpeg builds support is needed on older
> systems. So the only question is how old are the kernels in IoT and android
> devices which might use the current ffmpeg?
>
>
> On 1/24/2022 11:25 PM, [email protected] wrote:
> > On Wed, Jan 12, 2022 at 12:13:13AM -0500, Brad Smith wrote:
> >> Fix setsockopt() usage on OpenBSD with IP_MULTICAST_TTL. The field
> >> type should be an unsigned char on anything but Linux.
> >>
> >>
> >> diff --git a/libavformat/udp.c b/libavformat/udp.c
> >> index 180d96a988..29aa865fff 100644
> >> --- a/libavformat/udp.c
> >> +++ b/libavformat/udp.c
> >> @@ -163,7 +163,13 @@ static int udp_set_multicast_ttl(int sockfd, int
> >> mcastTTL,
> >> {
> >> #ifdef IP_MULTICAST_TTL
> >> if (addr->sa_family == AF_INET) {
> >> - if (setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_TTL, &mcastTTL,
> >> sizeof(mcastTTL)) < 0) {
> >> +#ifdef __linux__
> >> + int ttl = mcastTTL;
> >> +#else
> >> + unsigned char ttl = mcastTTL;
> >> +#endif
> >
> >
> > I don't have BSD system for test, but I prefer to use socklen_t, please try
> > with my proposal patch:
> >
> > ---
> > libavformat/udp.c | 4 +++-
> > 1 file changed, 3 insertions(+), 1 deletion(-)
> >
> > diff --git a/libavformat/udp.c b/libavformat/udp.c
> > index 83c042d079..b9baa0a803 100644
> > --- a/libavformat/udp.c
> > +++ b/libavformat/udp.c
> > @@ -164,7 +164,9 @@ static int udp_set_multicast_ttl(int sockfd, int
> > mcastTTL,
> > {
> > #ifdef IP_MULTICAST_TTL
> > if (addr->sa_family == AF_INET) {
> > - if (setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_TTL, &mcastTTL,
> > sizeof(mcastTTL)) < 0) {
> > + socklen_t ttl = mcastTTL;
> > +
> > + if (setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl,
> > sizeof(ttl)) < 0) {
> > ff_log_net_error(logctx, AV_LOG_ERROR,
> > "setsockopt(IP_MULTICAST_TTL)");
> > return ff_neterrno();
> >
> >
> >> +
> >> + if (setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl,
> >> sizeof(ttl)) < 0) {
> >> ff_log_net_error(NULL, AV_LOG_ERROR,
> >> "setsockopt(IP_MULTICAST_TTL)");
> >> return ff_neterrno();
> >> }
> >> _______________________________________________
> >> ffmpeg-devel mailing list
> >> [email protected]
> >> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> >>
> >> To unsubscribe, visit link above, or email
> >> [email protected] with subject "unsubscribe".
> >
> _______________________________________________
> ffmpeg-devel mailing list
> [email protected]
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> [email protected] with subject "unsubscribe".
--
Thanks,
Limin Wang
_______________________________________________
ffmpeg-devel mailing list
[email protected]
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
[email protected] with subject "unsubscribe".