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

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