diff options
Diffstat (limited to 'source3/lib')
-rw-r--r-- | source3/lib/substitute.c | 6 | ||||
-rw-r--r-- | source3/lib/util_sock.c | 58 | ||||
-rw-r--r-- | source3/lib/wins_srv.c | 8 |
3 files changed, 33 insertions, 39 deletions
diff --git a/source3/lib/substitute.c b/source3/lib/substitute.c index d4c7cd6467..bd15399b13 100644 --- a/source3/lib/substitute.c +++ b/source3/lib/substitute.c @@ -41,6 +41,7 @@ void set_local_machine_name(const char* local_name, bool perm) { static bool already_perm = False; fstring tmp_local_machine; + char addr[INET6_ADDRSTRLEN]; fstrcpy(tmp_local_machine,local_name); trim_char(tmp_local_machine,' ',' '); @@ -51,7 +52,7 @@ void set_local_machine_name(const char* local_name, bool perm) */ if ( strequal(tmp_local_machine, "*SMBSERVER") || strequal(tmp_local_machine, "*SMBSERV") ) { - fstrcpy( local_machine, client_socket_addr() ); + fstrcpy( local_machine, client_socket_addr(addr, sizeof(addr)) ); return; } @@ -499,7 +500,8 @@ char *alloc_sub_basic(const char *smb_name, const char *domain_name, client_addr(addr, sizeof(addr))); break; case 'i': - a_string = realloc_string_sub( a_string, "%i", client_socket_addr() ); + a_string = realloc_string_sub( a_string, "%i", + client_socket_addr(addr, sizeof(addr)) ); break; case 'L' : if ( StrnCaseCmp(p, "%LOGONSERVER%", strlen("%LOGONSERVER%")) == 0 ) { diff --git a/source3/lib/util_sock.c b/source3/lib/util_sock.c index 3cce12381c..b31736430e 100644 --- a/source3/lib/util_sock.c +++ b/source3/lib/util_sock.c @@ -199,12 +199,11 @@ uint32 interpret_addr(const char *str) A convenient addition to interpret_addr(). ******************************************************************/ -struct in_addr *interpret_addr2(const char *str) +struct in_addr *interpret_addr2(struct in_addr *ip, const char *str) { - static struct in_addr ret; uint32 a = interpret_addr(str); - ret.s_addr = a; - return(&ret); + ip->s_addr = a; + return ip; } /******************************************************************* @@ -331,15 +330,7 @@ bool is_zero_addr(const struct sockaddr_storage *pss) void zero_ip_v4(struct in_addr *ip) { - static bool init; - static struct in_addr ipzero; - - if (!init) { - ipzero = *interpret_addr2("0.0.0.0"); - init = true; - } - - *ip = ipzero; + memset(ip, '\0', sizeof(struct in_addr)); } /******************************************************************* @@ -595,21 +586,20 @@ void client_setfd(int fd) } /**************************************************************************** - Return a static string of an IP address (IPv4 or IPv6). + Return the string of an IP address (IPv4 or IPv6). ****************************************************************************/ -static const char *get_socket_addr(int fd) +static const char *get_socket_addr(int fd, char *addr_buf, size_t addr_len) { struct sockaddr_storage sa; socklen_t length = sizeof(sa); - static char addr_buf[INET6_ADDRSTRLEN]; /* Ok, returning a hard coded IPv4 address * is bogus, but it's just as bogus as a * zero IPv6 address. No good choice here. */ - safe_strcpy(addr_buf, "0.0.0.0", sizeof(addr_buf)-1); + safe_strcpy(addr_buf, "0.0.0.0", addr_len-1); if (fd == -1) { return addr_buf; @@ -621,7 +611,7 @@ static const char *get_socket_addr(int fd) return addr_buf; } - return print_sockaddr_len(addr_buf, sizeof(addr_buf), &sa, length); + return print_sockaddr_len(addr_buf, addr_len, &sa, length); } /**************************************************************************** @@ -664,9 +654,9 @@ const char *client_addr(char *addr, size_t addrlen) return get_peer_addr(client_fd,addr,addrlen); } -const char *client_socket_addr(void) +const char *client_socket_addr(char *addr, size_t addr_len) { - return get_socket_addr(client_fd); + return get_socket_addr(client_fd, addr, addr_len); } int client_socket_port(void) @@ -1672,9 +1662,9 @@ int open_udp_socket(const char *host, int port) int type = SOCK_DGRAM; struct sockaddr_in sock_out; int res; - struct in_addr *addr; + struct in_addr addr; - addr = interpret_addr2(host); + (void)interpret_addr2(&addr, host); res = socket(PF_INET, type, 0); if (res == -1) { @@ -1682,7 +1672,7 @@ int open_udp_socket(const char *host, int port) } memset((char *)&sock_out,'\0',sizeof(sock_out)); - putip((char *)&sock_out.sin_addr,(char *)addr); + putip((char *)&sock_out.sin_addr,(char *)&addr); sock_out.sin_port = htons(port); sock_out.sin_family = PF_INET; @@ -1987,32 +1977,32 @@ out_umask: Get my own canonical name, including domain. ****************************************************************************/ +static fstring dnshostname_cache; + bool get_mydnsfullname(fstring my_dnsname) { - static fstring dnshostname; - - if (!*dnshostname) { + if (!*dnshostname_cache) { struct addrinfo *res = NULL; bool ret; /* get my host name */ - if (gethostname(dnshostname, sizeof(dnshostname)) == -1) { - *dnshostname = '\0'; + if (gethostname(dnshostname_cache, sizeof(dnshostname_cache)) == -1) { + *dnshostname_cache = '\0'; DEBUG(0,("get_mydnsfullname: gethostname failed\n")); return false; } /* Ensure null termination. */ - dnshostname[sizeof(dnshostname)-1] = '\0'; + dnshostname_cache[sizeof(dnshostname_cache)-1] = '\0'; ret = interpret_string_addr_internal(&res, - dnshostname, + dnshostname_cache, AI_ADDRCONFIG|AI_CANONNAME); if (!ret || res == NULL) { DEBUG(3,("get_mydnsfullname: getaddrinfo failed for " "name %s [%s]\n", - dnshostname, + dnshostname_cache, gai_strerror(ret) )); return false; } @@ -2024,16 +2014,16 @@ bool get_mydnsfullname(fstring my_dnsname) if (res->ai_canonname == NULL) { DEBUG(3,("get_mydnsfullname: failed to get " "canonical name for %s\n", - dnshostname)); + dnshostname_cache)); freeaddrinfo(res); return false; } - fstrcpy(dnshostname, res->ai_canonname); + fstrcpy(dnshostname_cache, res->ai_canonname); freeaddrinfo(res); } - fstrcpy(my_dnsname, dnshostname); + fstrcpy(my_dnsname, dnshostname_cache); return true; } diff --git a/source3/lib/wins_srv.c b/source3/lib/wins_srv.c index 0fb0648fec..0e184a6b7c 100644 --- a/source3/lib/wins_srv.c +++ b/source3/lib/wins_srv.c @@ -183,14 +183,16 @@ static void parse_ip(struct tagged_ip *ip, const char *str) char *s = strchr(str, ':'); if (!s) { fstrcpy(ip->tag, "*"); - ip->ip = *interpret_addr2(str); + (void)interpret_addr2(&ip->ip,str); return; } - ip->ip = *interpret_addr2(s+1); + (void)interpret_addr2(&ip->ip,s+1); fstrcpy(ip->tag, str); s = strchr(ip->tag, ':'); - if (s) *s = 0; + if (s) { + *s = 0; + } } |