wok-stable annotate glibc/stuff/glibc-2.13-CVE-2015-0235.patch @ rev 12445

glibc: CVE-2015-0235 fix
author Pascal Bellard <pascal.bellard@slitaz.org>
date Thu Jan 29 11:20:25 2015 +0100 (2015-01-29)
parents
children 18a6783e147f
rev   line source
pascal@12445 1 CVE-2015-0235 GHOST
pascal@12445 2 From https://sourceware.org/git/?p=glibc.git;a=commit;h=d5dd6189d506068ed11c8bfa1e1e9bffde04decd
pascal@12445 3 --- glibc-2.13/nss/digits_dots.c
pascal@12445 4 +++ glibc-2.13/nss/digits_dots.c
pascal@12445 5 @@ -47,7 +47,10 @@
pascal@12445 6 {
pascal@12445 7 if (h_errnop)
pascal@12445 8 *h_errnop = NETDB_INTERNAL;
pascal@12445 9 - *result = NULL;
pascal@12445 10 + if (buffer_size == NULL)
pascal@12445 11 + *status = NSS_STATUS_TRYAGAIN;
pascal@12445 12 + else
pascal@12445 13 + *result = NULL;
pascal@12445 14 return -1;
pascal@12445 15 }
pascal@12445 16
pascal@12445 17 @@ -84,14 +87,16 @@
pascal@12445 18 }
pascal@12445 19
pascal@12445 20 size_needed = (sizeof (*host_addr)
pascal@12445 21 - + sizeof (*h_addr_ptrs) + strlen (name) + 1);
pascal@12445 22 + sizeof (*h_addr_ptrs)
pascal@12445 23 + + sizeof (*h_allias_ptr) + strlen (name) + 1);
pascal@12445 24
pascal@12445 25 if (buffer_size == NULL)
pascal@12445 26 {
pascal@12445 27 if (buflen < size_needed)
pascal@12445 28 {
pascal@12445 29 + *status = NSS_STATUS_TRYAGAIN;
pascal@12445 30 if (h_errnop != NULL)
pascal@12445 31 - *h_errnop = TRY_AGAIN;
pascal@12445 32 + *h_errnop = NETDB_INTERNAL;
pascal@12445 33 __set_errno (ERANGE);
pascal@12445 34 goto done;
pascal@12445 35 }
pascal@12445 36 @@ -110,7 +115,7 @@
pascal@12445 37 *buffer_size = 0;
pascal@12445 38 __set_errno (save);
pascal@12445 39 if (h_errnop != NULL)
pascal@12445 40 - *h_errnop = TRY_AGAIN;
pascal@12445 41 + *h_errnop = NETDB_INTERNAL;
pascal@12445 42 *result = NULL;
pascal@12445 43 goto done;
pascal@12445 44 }
pascal@12445 45 @@ -150,7 +155,9 @@
pascal@12445 46 if (! ok)
pascal@12445 47 {
pascal@12445 48 *h_errnop = HOST_NOT_FOUND;
pascal@12445 49 - if (buffer_size)
pascal@12445 50 + if (buffer_size == NULL)
pascal@12445 51 + *status = NSS_STATUS_NOTFOUND:
pascal@12445 52 + else
pascal@12445 53 *result = NULL;
pascal@12445 54 goto done;
pascal@12445 55 }
pascal@12445 56 @@ -202,15 +209,6 @@
pascal@12445 57
pascal@12445 58 if ((isxdigit (name[0]) && strchr (name, ':') != NULL) || name[0] == ':')
pascal@12445 59 {
pascal@12445 60 - const char *cp;
pascal@12445 61 - char *hostname;
pascal@12445 62 - typedef unsigned char host_addr_t[16];
pascal@12445 63 - host_addr_t *host_addr;
pascal@12445 64 - typedef char *host_addr_list_t[2];
pascal@12445 65 - host_addr_list_t *h_addr_ptrs;
pascal@12445 66 - size_t size_needed;
pascal@12445 67 - int addr_size;
pascal@12445 68 -
pascal@12445 69 switch (af)
pascal@12445 70 {
pascal@12445 71 default:
pascal@12445 72 @@ -226,7 +224,10 @@
pascal@12445 73 /* This is not possible. We cannot represent an IPv6 address
pascal@12445 74 in an `struct in_addr' variable. */
pascal@12445 75 *h_errnop = HOST_NOT_FOUND;
pascal@12445 76 - *result = NULL;
pascal@12445 77 + if (buffer_size == NULL)
pascal@12445 78 + *status = NSS_STATUS_NOTFOUND;
pascal@12445 79 + else
pascal@12445 80 + *result = NULL;
pascal@12445 81 goto done;
pascal@12445 82
pascal@12445 83 case AF_INET6:
pascal@12445 84 @@ -234,42 +235,6 @@
pascal@12445 85 break;
pascal@12445 86 }
pascal@12445 87
pascal@12445 88 - size_needed = (sizeof (*host_addr)
pascal@12445 89 - + sizeof (*h_addr_ptrs) + strlen (name) + 1);
pascal@12445 90 -
pascal@12445 91 - if (buffer_size == NULL && buflen < size_needed)
pascal@12445 92 - {
pascal@12445 93 - if (h_errnop != NULL)
pascal@12445 94 - *h_errnop = TRY_AGAIN;
pascal@12445 95 - __set_errno (ERANGE);
pascal@12445 96 - goto done;
pascal@12445 97 - }
pascal@12445 98 - else if (buffer_size != NULL && *buffer_size < size_needed)
pascal@12445 99 - {
pascal@12445 100 - char *new_buf;
pascal@12445 101 - *buffer_size = size_needed;
pascal@12445 102 - new_buf = realloc (*buffer, *buffer_size);
pascal@12445 103 -
pascal@12445 104 - if (new_buf == NULL)
pascal@12445 105 - {
pascal@12445 106 - save = errno;
pascal@12445 107 - free (*buffer);
pascal@12445 108 - __set_errno (save);
pascal@12445 109 - *buffer = NULL;
pascal@12445 110 - *buffer_size = 0;
pascal@12445 111 - *result = NULL;
pascal@12445 112 - goto done;
pascal@12445 113 - }
pascal@12445 114 - *buffer = new_buf;
pascal@12445 115 - }
pascal@12445 116 -
pascal@12445 117 - memset (*buffer, '\0', size_needed);
pascal@12445 118 -
pascal@12445 119 - host_addr = (host_addr_t *) *buffer;
pascal@12445 120 - h_addr_ptrs = (host_addr_list_t *)
pascal@12445 121 - ((char *) host_addr + sizeof (*host_addr));
pascal@12445 122 - hostname = (char *) h_addr_ptrs + sizeof (*h_addr_ptrs);
pascal@12445 123 -
pascal@12445 124 for (cp = name;; ++cp)
pascal@12445 125 {
pascal@12445 126 if (!*cp)
pascal@12445 127 @@ -282,7 +247,9 @@
pascal@12445 128 if (inet_pton (AF_INET6, name, host_addr) <= 0)
pascal@12445 129 {
pascal@12445 130 *h_errnop = HOST_NOT_FOUND;
pascal@12445 131 - if (buffer_size)
pascal@12445 132 + if (buffer_size == NULL)
pascal@12445 133 + *status = NSS_STATUS_NOTFOUND:
pascal@12445 134 + else
pascal@12445 135 *result = NULL;
pascal@12445 136 goto done;
pascal@12445 137 }