[FFmpeg-devel] [PATCH] avformat/rtsp: fix getnameinfo() call on FreeBSD

2016-11-24 Thread Kevin Lo
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

2016-11-24 Thread Kevin Lo
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

2016-11-24 Thread Kevin Lo
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

2016-11-24 Thread Kevin Lo
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

2016-11-24 Thread Kevin Lo
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

2016-11-24 Thread Kevin Lo
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

2016-11-24 Thread Kevin Lo
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