[FFmpeg-devel] [PATCH] avformat/rtsp: fix getnameinfo() call on FreeBSD
FreeBSD's socket calls require the sockaddr struct length to agree with the address family, Linux does not. This patch fixes a failing getnameinfo() call on FreeBSD. Signed-off-by: Kevin Lo --- diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c index c6292c5..15fe25d 100644 --- a/libavformat/rtsp.c +++ b/libavformat/rtsp.c @@ -2310,7 +2310,11 @@ static int sdp_read_header(AVFormatContext *s) AVDictionary *opts = map_to_opts(rt); err = getnameinfo((struct sockaddr*) &rtsp_st->sdp_ip, +#ifdef __FreeBSD__ + ((struct sockaddr*) &rtsp_st->sdp_ip)->sa_len, +#else sizeof(rtsp_st->sdp_ip), +#endif namebuf, sizeof(namebuf), NULL, 0, NI_NUMERICHOST); if (err) { av_log(s, AV_LOG_ERROR, "getnameinfo: %s\n", gai_strerror(err)); ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
Re: [FFmpeg-devel] [PATCH] avformat/rtsp: fix getnameinfo() call on FreeBSD
On Thu, Nov 24, 2016 at 04:12:41PM +0100, Nicolas George wrote: > Le quartidi 4 frimaire, an CCXXV, Kevin Lo a écrit : > > FreeBSD's socket calls require the sockaddr struct length to agree > > with the address family, Linux does not. This patch fixes a failing > > getnameinfo() call on FreeBSD. > > > > Signed-off-by: Kevin Lo > > I looked at the standard, the semantic of salen is not specified. In > doubt, I would consider the usage to be invalid even if it works by > happenstance on Linux. I know that's not the standard, that's why I added 'ifdef __FreeBSD__'. > > --- > > > > diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c > > index c6292c5..15fe25d 100644 > > --- a/libavformat/rtsp.c > > +++ b/libavformat/rtsp.c > > @@ -2310,7 +2310,11 @@ static int sdp_read_header(AVFormatContext *s) > > AVDictionary *opts = map_to_opts(rt); > > > > err = getnameinfo((struct sockaddr*) &rtsp_st->sdp_ip, > > > +#ifdef __FreeBSD__ > > + ((struct sockaddr*) > > &rtsp_st->sdp_ip)->sa_len, > > +#else > >sizeof(rtsp_st->sdp_ip), > > +#endif > > On the other hand, sa_len is not standard, and littering the code with > ifdefry is ugly. Better add a field sdp_ip_len and set it at the same > time as sdp_ip. > > Also, there are other instance of the same misuse of getnameinfo() in > this file. > > >namebuf, sizeof(namebuf), NULL, 0, > > NI_NUMERICHOST); > > if (err) { > > av_log(s, AV_LOG_ERROR, "getnameinfo: %s\n", > > gai_strerror(err)); > > Regards, > > -- > Nicolas George > ___ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
Re: [FFmpeg-devel] [PATCH] avformat/rtsp: fix getnameinfo() call on FreeBSD
On Fri, Nov 25, 2016 at 07:13:50AM +0800, Kevin Lo wrote: > > On Thu, Nov 24, 2016 at 04:12:41PM +0100, Nicolas George wrote: > > Le quartidi 4 frimaire, an CCXXV, Kevin Lo a écrit : > > > FreeBSD's socket calls require the sockaddr struct length to agree > > > with the address family, Linux does not. This patch fixes a failing > > > getnameinfo() call on FreeBSD. > > > > > > Signed-off-by: Kevin Lo > > > > I looked at the standard, the semantic of salen is not specified. In > > doubt, I would consider the usage to be invalid even if it works by > > happenstance on Linux. > > I know that's not the standard, that's why I added 'ifdef __FreeBSD__'. Sorry I forgot to mention that I'll resend the patch about adding sdp_ip_len, thanks. > > > --- > > > > > > diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c > > > index c6292c5..15fe25d 100644 > > > --- a/libavformat/rtsp.c > > > +++ b/libavformat/rtsp.c > > > @@ -2310,7 +2310,11 @@ static int sdp_read_header(AVFormatContext *s) > > > AVDictionary *opts = map_to_opts(rt); > > > > > > err = getnameinfo((struct sockaddr*) &rtsp_st->sdp_ip, > > > > > +#ifdef __FreeBSD__ > > > + ((struct sockaddr*) > > > &rtsp_st->sdp_ip)->sa_len, > > > +#else > > >sizeof(rtsp_st->sdp_ip), > > > +#endif > > > > On the other hand, sa_len is not standard, and littering the code with > > ifdefry is ugly. Better add a field sdp_ip_len and set it at the same > > time as sdp_ip. > > > > Also, there are other instance of the same misuse of getnameinfo() in > > this file. > > > > >namebuf, sizeof(namebuf), NULL, 0, > > > NI_NUMERICHOST); > > > if (err) { > > > av_log(s, AV_LOG_ERROR, "getnameinfo: %s\n", > > > gai_strerror(err)); > > > > Regards, > > > > -- > > Nicolas George > > > > > ___ > > ffmpeg-devel mailing list > > ffmpeg-devel@ffmpeg.org > > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > ___ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
[FFmpeg-devel] [PATCH] avformat/rtsp: introduce get_sa_len() function
Since the Linux implementation of sockaddr doesn't have sa_len as a member, but the FreeBSD version does, introduce a get_sa_len() function that determines the size based on the address family. Signed-off-by: Kevin Lo --- diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c index c6292c5..883f5a6 100644 --- a/libavformat/rtsp.c +++ b/libavformat/rtsp.c @@ -202,6 +202,19 @@ static int get_sockaddr(AVFormatContext *s, return 0; } +static socklen_t +get_sa_len(struct sockaddr *addr) +{ +switch (addr->sa_family) { +case AF_INET: + return (sizeof(struct sockaddr_in)); +case AF_INET6: + return (sizeof(struct sockaddr_in6)); +default: + return (sizeof(struct sockaddr)); +} +} + #if CONFIG_RTPDEC static void init_rtp_handler(RTPDynamicProtocolHandler *handler, RTSPStream *rtsp_st, AVStream *st) @@ -389,6 +402,7 @@ static void sdp_parse_line(AVFormatContext *s, SDPParseState *s1, RTSPSource *rtsp_src; struct sockaddr_storage sdp_ip; int ttl; +socklen_t salen; av_log(s, AV_LOG_TRACE, "sdp: %c='%s'\n", letter, buf); @@ -1614,7 +1628,8 @@ int ff_rtsp_make_setup_request(AVFormatContext *s, const char *host, int port, } if (ttl > 0) snprintf(optbuf, sizeof(optbuf), "?ttl=%d", ttl); -getnameinfo((struct sockaddr*) &addr, sizeof(addr), +getnameinfo((struct sockaddr*) &addr, + get_sa_len((struct sockaddr*) &addr), namebuf, sizeof(namebuf), NULL, 0, NI_NUMERICHOST); ff_url_join(url, sizeof(url), "rtp", NULL, namebuf, port, "%s", optbuf); @@ -1830,7 +1845,8 @@ redirect: goto fail; } if (!getpeername(tcp_fd, (struct sockaddr*) &peer, &peer_len)) { -getnameinfo((struct sockaddr*) &peer, peer_len, host, sizeof(host), +getnameinfo((struct sockaddr*) &peer, + get_sa_len((struct sockaddr*) &peer), host, sizeof(host), NULL, 0, NI_NUMERICHOST); } @@ -2310,7 +2326,7 @@ static int sdp_read_header(AVFormatContext *s) AVDictionary *opts = map_to_opts(rt); err = getnameinfo((struct sockaddr*) &rtsp_st->sdp_ip, - sizeof(rtsp_st->sdp_ip), + get_sa_len((struct sockaddr*) &rtsp_st->sdp_ip), namebuf, sizeof(namebuf), NULL, 0, NI_NUMERICHOST); if (err) { av_log(s, AV_LOG_ERROR, "getnameinfo: %s\n", gai_strerror(err)); ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
[FFmpeg-devel] [PATCH v2] avformat/rtsp: introduce get_sa_len() function
Since the Linux implementation of sockaddr doesn't have sa_len as a member, but the FreeBSD version does, introduce a get_sa_len() function that determines the size based on the address family. Signed-off-by: Kevin Lo --- diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c index c6292c5..4c543ed 100644 --- a/libavformat/rtsp.c +++ b/libavformat/rtsp.c @@ -202,6 +202,19 @@ static int get_sockaddr(AVFormatContext *s, return 0; } +static socklen_t +get_sa_len(struct sockaddr *addr) +{ +switch (addr->sa_family) { +case AF_INET: + return (sizeof(struct sockaddr_in)); +case AF_INET6: + return (sizeof(struct sockaddr_in6)); +default: + return (sizeof(struct sockaddr)); +} +} + #if CONFIG_RTPDEC static void init_rtp_handler(RTPDynamicProtocolHandler *handler, RTSPStream *rtsp_st, AVStream *st) @@ -1614,7 +1627,8 @@ int ff_rtsp_make_setup_request(AVFormatContext *s, const char *host, int port, } if (ttl > 0) snprintf(optbuf, sizeof(optbuf), "?ttl=%d", ttl); -getnameinfo((struct sockaddr*) &addr, sizeof(addr), +getnameinfo((struct sockaddr*) &addr, + get_sa_len((struct sockaddr*) &addr), namebuf, sizeof(namebuf), NULL, 0, NI_NUMERICHOST); ff_url_join(url, sizeof(url), "rtp", NULL, namebuf, port, "%s", optbuf); @@ -1830,7 +1844,8 @@ redirect: goto fail; } if (!getpeername(tcp_fd, (struct sockaddr*) &peer, &peer_len)) { -getnameinfo((struct sockaddr*) &peer, peer_len, host, sizeof(host), +getnameinfo((struct sockaddr*) &peer, + get_sa_len((struct sockaddr*) &peer), host, sizeof(host), NULL, 0, NI_NUMERICHOST); } @@ -2310,7 +2325,7 @@ static int sdp_read_header(AVFormatContext *s) AVDictionary *opts = map_to_opts(rt); err = getnameinfo((struct sockaddr*) &rtsp_st->sdp_ip, - sizeof(rtsp_st->sdp_ip), + get_sa_len((struct sockaddr*) &rtsp_st->sdp_ip), namebuf, sizeof(namebuf), NULL, 0, NI_NUMERICHOST); if (err) { av_log(s, AV_LOG_ERROR, "getnameinfo: %s\n", gai_strerror(err)); ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
[FFmpeg-devel] [PATCH v3] avformat/rtsp: introduce get_sa_len() function
Since the Linux implementation of sockaddr doesn't have sa_len as a member, but the FreeBSD version does, introduce a get_sa_len() function that determines the size based on the address family. Signed-off-by: Kevin Lo --- v3: Check for the right feature when using a sockaddr_in6. Some systems, such as OS/2, define AF_INET6 without a full implementation. diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c index c6292c5..ff0e221 100644 --- a/libavformat/rtsp.c +++ b/libavformat/rtsp.c @@ -202,6 +202,21 @@ static int get_sockaddr(AVFormatContext *s, return 0; } +static socklen_t +get_sa_len(struct sockaddr *addr) +{ +switch (addr->sa_family) { +case AF_INET: + return (sizeof(struct sockaddr_in)); +#if HAVE_STRUCT_SOCKADDR_IN6 +case AF_INET6: + return (sizeof(struct sockaddr_in6)); +#endif +default: + return (sizeof(struct sockaddr)); +} +} + #if CONFIG_RTPDEC static void init_rtp_handler(RTPDynamicProtocolHandler *handler, RTSPStream *rtsp_st, AVStream *st) @@ -1614,7 +1629,8 @@ int ff_rtsp_make_setup_request(AVFormatContext *s, const char *host, int port, } if (ttl > 0) snprintf(optbuf, sizeof(optbuf), "?ttl=%d", ttl); -getnameinfo((struct sockaddr*) &addr, sizeof(addr), +getnameinfo((struct sockaddr*) &addr, + get_sa_len((struct sockaddr*) &addr), namebuf, sizeof(namebuf), NULL, 0, NI_NUMERICHOST); ff_url_join(url, sizeof(url), "rtp", NULL, namebuf, port, "%s", optbuf); @@ -1830,7 +1846,8 @@ redirect: goto fail; } if (!getpeername(tcp_fd, (struct sockaddr*) &peer, &peer_len)) { -getnameinfo((struct sockaddr*) &peer, peer_len, host, sizeof(host), +getnameinfo((struct sockaddr*) &peer, + get_sa_len((struct sockaddr*) &peer), host, sizeof(host), NULL, 0, NI_NUMERICHOST); } @@ -2310,7 +2327,7 @@ static int sdp_read_header(AVFormatContext *s) AVDictionary *opts = map_to_opts(rt); err = getnameinfo((struct sockaddr*) &rtsp_st->sdp_ip, - sizeof(rtsp_st->sdp_ip), + get_sa_len((struct sockaddr*) &rtsp_st->sdp_ip), namebuf, sizeof(namebuf), NULL, 0, NI_NUMERICHOST); if (err) { av_log(s, AV_LOG_ERROR, "getnameinfo: %s\n", gai_strerror(err)); ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
Re: [FFmpeg-devel] [PATCH v2] avformat/rtsp: introduce get_sa_len() function
On Thu, Nov 24, 2016 at 10:48:38PM -0800, Dave Yeo wrote: > > On 11/24/16 07:47 PM, Kevin Lo wrote: > > Since the Linux implementation of sockaddr doesn't have sa_len as a member, > > but the FreeBSD version does, introduce a get_sa_len() function that > > determines the size based on the address family. > > > > Signed-off-by: Kevin Lo > > --- > > > > diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c > > index c6292c5..4c543ed 100644 > > --- a/libavformat/rtsp.c > > +++ b/libavformat/rtsp.c > > @@ -202,6 +202,19 @@ static int get_sockaddr(AVFormatContext *s, > > return 0; > > } > > > > +static socklen_t > > +get_sa_len(struct sockaddr *addr) > > +{ > > +switch (addr->sa_family) { > > +case AF_INET: > > + return (sizeof(struct sockaddr_in)); > > +case AF_INET6: > > + return (sizeof(struct sockaddr_in6)); > > +default: > > + return (sizeof(struct sockaddr)); > > +} > > +} > > + > [...] > > Fails here (OS/2), > ... > CC libavformat/rtspdec.o > K:/usr/local/src/ffmpeg/libavformat/rtsp.c: In function 'get_sa_len': > K:/usr/local/src/ffmpeg/libavformat/rtsp.c:212:17: error: invalid > application of > 'sizeof' to incomplete type 'struct sockaddr_in6' >return (sizeof(struct sockaddr_in6)); > ^ > make: *** [libavformat/rtsp.o] Error 1 > ... > Perhaps use > #if HAVE_STRUCT_SOCKADDR_IN6 > case AF_INET6: > return (sizeof(struct sockaddr_in6)); > #endif > or such. Thanks for pointing it out, I just resent the patch, thanks > Dave Kevin ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel