wok-undigest annotate glibc/stuff/glibc-2.14.1-CVE-2015-0235.patch @ rev 1198

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