netsock2.c: Made get/set addr port avoid potential uninitialized memory.
authorRichard Mudgett <rmudgett@digium.com>
Thu, 4 May 2017 22:32:03 +0000 (17:32 -0500)
committerRichard Mudgett <rmudgett@digium.com>
Fri, 5 May 2017 23:49:19 +0000 (18:49 -0500)
Change-Id: I532052bd7cd95a4b3565485fc01e2a1ea07ee647

main/netsock2.c

index bfa181c..8fb9c9e 100644 (file)
@@ -431,11 +431,16 @@ int ast_sockaddr_cmp_addr(const struct ast_sockaddr *a, const struct ast_sockadd
 
 uint16_t _ast_sockaddr_port(const struct ast_sockaddr *addr, const char *file, int line, const char *func)
 {
-       if (addr->ss.ss_family == AF_INET &&
-           addr->len == sizeof(struct sockaddr_in)) {
+       /*
+        * Test addr->len first to be tolerant of an ast_sockaddr_setnull()
+        * addr.  In that case addr->len might be the only value initialized.
+        */
+       if (addr->len == sizeof(struct sockaddr_in)
+               && addr->ss.ss_family == AF_INET) {
                return ntohs(((struct sockaddr_in *)&addr->ss)->sin_port);
-       } else if (addr->ss.ss_family == AF_INET6 &&
-                addr->len == sizeof(struct sockaddr_in6)) {
+       }
+       if (addr->len == sizeof(struct sockaddr_in6)
+               && addr->ss.ss_family == AF_INET6) {
                return ntohs(((struct sockaddr_in6 *)&addr->ss)->sin6_port);
        }
        if (option_debug >= 1) {
@@ -446,11 +451,15 @@ uint16_t _ast_sockaddr_port(const struct ast_sockaddr *addr, const char *file, i
 
 void _ast_sockaddr_set_port(struct ast_sockaddr *addr, uint16_t port, const char *file, int line, const char *func)
 {
-       if (addr->ss.ss_family == AF_INET &&
-           addr->len == sizeof(struct sockaddr_in)) {
+       /*
+        * Test addr->len first to be tolerant of an ast_sockaddr_setnull()
+        * addr.  In that case addr->len might be the only value initialized.
+        */
+       if (addr->len == sizeof(struct sockaddr_in)
+               && addr->ss.ss_family == AF_INET) {
                ((struct sockaddr_in *)&addr->ss)->sin_port = htons(port);
-       } else if (addr->ss.ss_family == AF_INET6 &&
-                addr->len == sizeof(struct sockaddr_in6)) {
+       } else if (addr->len == sizeof(struct sockaddr_in6)
+               && addr->ss.ss_family == AF_INET6) {
                ((struct sockaddr_in6 *)&addr->ss)->sin6_port = htons(port);
        } else if (option_debug >= 1) {
                ast_log(__LOG_DEBUG, file, line, func,