diff options
author | Richard Mudgett <rmudgett@digium.com> | 2017-05-04 17:32:03 -0500 |
---|---|---|
committer | Richard Mudgett <rmudgett@digium.com> | 2017-05-05 18:53:05 -0500 |
commit | 614eda785d6e6ed538bc2adfbbe2ad4d2800006e (patch) | |
tree | e8c24d73fcb55c84f558b8cdc4b9e88f2dfac98c /main | |
parent | 250fee82aaa02c7d8be4d21cba75bf5460b32af9 (diff) |
netsock2.c: Made get/set addr port avoid potential uninitialized memory.
Change-Id: I532052bd7cd95a4b3565485fc01e2a1ea07ee647
Diffstat (limited to 'main')
-rw-r--r-- | main/netsock2.c | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/main/netsock2.c b/main/netsock2.c index 8d36805f9..83538b5f4 100644 --- a/main/netsock2.c +++ b/main/netsock2.c @@ -433,11 +433,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) { @@ -448,11 +453,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, |