diff options
Diffstat (limited to 'security/ssh6/patches/patch-bp')
-rw-r--r-- | security/ssh6/patches/patch-bp | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/security/ssh6/patches/patch-bp b/security/ssh6/patches/patch-bp new file mode 100644 index 00000000000..97c6ac152fe --- /dev/null +++ b/security/ssh6/patches/patch-bp @@ -0,0 +1,120 @@ +$NetBSD: patch-bp,v 1.1 2000/03/20 02:25:44 itojun Exp $ + +--- getaddrinfo.c.orig Wed Dec 31 19:00:00 1969 ++++ getaddrinfo.c Fri Dec 24 21:50:41 1999 +@@ -0,0 +1,115 @@ ++/* ++ * fake library for ssh ++ * ++ * This file includes getaddrinfo(), freeaddrinfo() and gai_strerror(). ++ * These funtions are defined in rfc2133. ++ * ++ * But these functions are not implemented correctly. The minimum subset ++ * is implemented for ssh use only. For exapmle, this routine assumes ++ * that ai_family is AF_INET. Don't use it for another purpose. ++ * ++ * In the case not using 'configure --enable-ipv6', this getaddrinfo.c ++ * will be used if you have broken getaddrinfo or no getaddrinfo. ++ */ ++ ++#include "includes.h" ++#include "ssh.h" ++ ++#include "gai.h" ++ ++static struct addrinfo * ++malloc_ai(port, addr) ++int port; ++u_long addr; ++{ ++ struct addrinfo *ai; ++ ++ if (ai = (struct addrinfo *)malloc(sizeof(struct addrinfo) + ++ sizeof(struct sockaddr_in))) { ++ memset(ai, 0, sizeof(struct addrinfo) + sizeof(struct sockaddr_in)); ++ ai->ai_addr = (struct sockaddr *)(ai + 1); ++ /* XXX -- ssh doesn't use sa_len */ ++ ai->ai_addrlen = sizeof(struct sockaddr_in); ++ ai->ai_addr->sa_family = ai->ai_family = AF_INET; ++ ((struct sockaddr_in *)(ai)->ai_addr)->sin_port = port; ++ ((struct sockaddr_in *)(ai)->ai_addr)->sin_addr.s_addr = addr; ++ return ai; ++ } else { ++ return NULL; ++ } ++} ++ ++char * ++gai_strerror(ecode) ++int ecode; ++{ ++ switch (ecode) { ++ case EAI_NODATA: ++ return "no address associated with hostname."; ++ case EAI_MEMORY: ++ return "memory allocation failure."; ++ default: ++ return "unknown error."; ++ } ++} ++ ++void ++freeaddrinfo(ai) ++struct addrinfo *ai; ++{ ++ struct addrinfo *next; ++ ++ do { ++ next = ai->ai_next; ++ free(ai); ++ } while (ai = next); ++} ++ ++int ++getaddrinfo(hostname, servname, hints, res) ++const char *hostname, *servname; ++const struct addrinfo *hints; ++struct addrinfo **res; ++{ ++ struct addrinfo *cur, *prev = NULL; ++ struct hostent *hp; ++ int i, port; ++ ++ if (servname) ++ port = htons(atoi(servname)); ++ else ++ port = 0; ++ if (hints && hints->ai_flags & AI_PASSIVE) ++ if (*res = malloc_ai(port, htonl(0x00000000))) ++ return 0; ++ else ++ return EAI_MEMORY; ++ if (!hostname) ++ if (*res = malloc_ai(port, htonl(0x7f000001))) ++ return 0; ++ else ++ return EAI_MEMORY; ++ if (inet_addr(hostname) != -1) ++ if (*res = malloc_ai(port, inet_addr(hostname))) ++ return 0; ++ else ++ return EAI_MEMORY; ++ if ((hp = gethostbyname(hostname)) && ++ hp->h_name && hp->h_name[0] && hp->h_addr_list[0]) { ++ for (i = 0; hp->h_addr_list[i]; i++) ++ if (cur = malloc_ai(port, ++ ((struct in_addr *)hp->h_addr_list[i])->s_addr)) { ++ if (prev) ++ prev->ai_next = cur; ++ else ++ *res = cur; ++ prev = cur; ++ } else { ++ if (*res) ++ freeaddrinfo(*res); ++ return EAI_MEMORY; ++ } ++ return 0; ++ } ++ return EAI_NODATA; ++} |