From patchwork Fri Nov 25 07:17:22 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kevin Lo X-Patchwork-Id: 1559 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.90.1 with SMTP id o1csp190656vsb; Thu, 24 Nov 2016 23:20:27 -0800 (PST) X-Received: by 10.194.29.231 with SMTP id n7mr5908683wjh.104.1480058427248; Thu, 24 Nov 2016 23:20:27 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id sc5si41032965wjb.155.2016.11.24.23.20.26; Thu, 24 Nov 2016 23:20:27 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id A3DDF689217; Fri, 25 Nov 2016 09:20:19 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from ns.kevlo.org (220-135-115-6.HINET-IP.hinet.net [220.135.115.6]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 3EA9A687EB1 for ; Fri, 25 Nov 2016 09:20:10 +0200 (EET) Received: from ns.kevlo.org (localhost [127.0.0.1]) by ns.kevlo.org (8.15.2/8.15.2) with ESMTPS id uAP7HO7U094141 (version=TLSv1.2 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 25 Nov 2016 15:17:25 +0800 (CST) (envelope-from kevlo@ns.kevlo.org) Received: (from kevlo@localhost) by ns.kevlo.org (8.15.2/8.15.2/Submit) id uAP7HNLG094140 for ffmpeg-devel@ffmpeg.org; Fri, 25 Nov 2016 15:17:23 +0800 (CST) (envelope-from kevlo) Date: Fri, 25 Nov 2016 15:17:22 +0800 From: Kevin Lo To: ffmpeg-devel@ffmpeg.org Message-ID: <20161125071722.GA94123@ns.kevlo.org> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.24 (2015-08-30) Subject: [FFmpeg-devel] [PATCH v3] avformat/rtsp: introduce get_sa_len() function X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" 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));