wok-undigest diff glibc/stuff/glibc-2.14.1-CVE-2015-0235.patch @ rev 1235

compile alsa-lib
author Hans-G?nter Theisgen
date Sat Aug 06 17:22:27 2022 +0100 (23 months ago)
parents
children
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/glibc/stuff/glibc-2.14.1-CVE-2015-0235.patch	Sat Aug 06 17:22:27 2022 +0100
     1.3 @@ -0,0 +1,149 @@
     1.4 +CVE-2015-0235 GHOST
     1.5 +From https://sourceware.org/git/?p=glibc.git;a=commit;h=d5dd6189d506068ed11c8bfa1e1e9bffde04decd
     1.6 +--- glibc-2.14.1/nss/digits_dots.c
     1.7 ++++ glibc-2.14.1/nss/digits_dots.c
     1.8 +@@ -47,7 +47,10 @@
     1.9 +     {
    1.10 +       if (h_errnop)
    1.11 + 	*h_errnop = NETDB_INTERNAL;
    1.12 +-      *result = NULL;
    1.13 ++      if (buffer_size == NULL)
    1.14 ++        *status = NSS_STATUS_TRYAGAIN;
    1.15 ++      else
    1.16 ++        *result = NULL;
    1.17 +       return -1;
    1.18 +     }
    1.19 + 
    1.20 +@@ -84,14 +87,16 @@
    1.21 + 	}
    1.22 + 
    1.23 +       size_needed = (sizeof (*host_addr)
    1.24 +-		     + sizeof (*h_addr_ptrs) + strlen (name) + 1);
    1.25 ++		     + sizeof (*h_addr_ptrs)
    1.26 ++		     + sizeof (*h_alias_ptr) + strlen (name) + 1);
    1.27 + 
    1.28 +       if (buffer_size == NULL)
    1.29 +         {
    1.30 + 	  if (buflen < size_needed)
    1.31 + 	    {
    1.32 ++	      *status = NSS_STATUS_TRYAGAIN;
    1.33 + 	      if (h_errnop != NULL)
    1.34 +-		*h_errnop = TRY_AGAIN;
    1.35 ++		*h_errnop = NETDB_INTERNAL;
    1.36 + 	      __set_errno (ERANGE);
    1.37 + 	      goto done;
    1.38 + 	    }
    1.39 +@@ -110,7 +115,7 @@
    1.40 + 	      *buffer_size = 0;
    1.41 + 	      __set_errno (save);
    1.42 + 	      if (h_errnop != NULL)
    1.43 +-		*h_errnop = TRY_AGAIN;
    1.44 ++		*h_errnop = NETDB_INTERNAL;
    1.45 + 	      *result = NULL;
    1.46 + 	      goto done;
    1.47 + 	    }
    1.48 +@@ -150,7 +155,9 @@
    1.49 + 		  if (! ok)
    1.50 + 		    {
    1.51 + 		      *h_errnop = HOST_NOT_FOUND;
    1.52 +-		      if (buffer_size)
    1.53 ++		      if (buffer_size == NULL)
    1.54 ++		        *status = NSS_STATUS_NOTFOUND;
    1.55 ++		      else
    1.56 + 			*result = NULL;
    1.57 + 		      goto done;
    1.58 + 		    }
    1.59 +@@ -202,15 +209,6 @@
    1.60 + 
    1.61 +       if ((isxdigit (name[0]) && strchr (name, ':') != NULL) || name[0] == ':')
    1.62 + 	{
    1.63 +-	  const char *cp;
    1.64 +-	  char *hostname;
    1.65 +-	  typedef unsigned char host_addr_t[16];
    1.66 +-	  host_addr_t *host_addr;
    1.67 +-	  typedef char *host_addr_list_t[2];
    1.68 +-	  host_addr_list_t *h_addr_ptrs;
    1.69 +-	  size_t size_needed;
    1.70 +-	  int addr_size;
    1.71 +-
    1.72 + 	  switch (af)
    1.73 + 	    {
    1.74 + 	    default:
    1.75 +@@ -226,7 +224,10 @@
    1.76 + 	      /* This is not possible.  We cannot represent an IPv6 address
    1.77 + 		 in an `struct in_addr' variable.  */
    1.78 + 	      *h_errnop = HOST_NOT_FOUND;
    1.79 +-	      *result = NULL;
    1.80 ++	      if (buffer_size == NULL)
    1.81 ++	        *status = NSS_STATUS_NOTFOUND;
    1.82 ++	      else
    1.83 ++	        *result = NULL;
    1.84 + 	      goto done;
    1.85 + 
    1.86 + 	    case AF_INET6:
    1.87 +@@ -234,42 +235,6 @@
    1.88 + 	      break;
    1.89 + 	    }
    1.90 + 
    1.91 +-	  size_needed = (sizeof (*host_addr)
    1.92 +-			 + sizeof (*h_addr_ptrs) + strlen (name) + 1);
    1.93 +-
    1.94 +-	  if (buffer_size == NULL && buflen < size_needed)
    1.95 +-	    {
    1.96 +-	      if (h_errnop != NULL)
    1.97 +-		*h_errnop = TRY_AGAIN;
    1.98 +-	      __set_errno (ERANGE);
    1.99 +-	      goto done;
   1.100 +-	    }
   1.101 +-	  else if (buffer_size != NULL && *buffer_size < size_needed)
   1.102 +-	    {
   1.103 +-	      char *new_buf;
   1.104 +-	      *buffer_size = size_needed;
   1.105 +-	      new_buf = realloc (*buffer, *buffer_size);
   1.106 +-
   1.107 +-	      if (new_buf == NULL)
   1.108 +-		{
   1.109 +-		  save = errno;
   1.110 +-		  free (*buffer);
   1.111 +-		  __set_errno (save);
   1.112 +-		  *buffer = NULL;
   1.113 +-		  *buffer_size = 0;
   1.114 +-		  *result = NULL;
   1.115 +-		  goto done;
   1.116 +-		}
   1.117 +-	      *buffer = new_buf;
   1.118 +-	    }
   1.119 +-
   1.120 +-	  memset (*buffer, '\0', size_needed);
   1.121 +-
   1.122 +-	  host_addr = (host_addr_t *) *buffer;
   1.123 +-	  h_addr_ptrs = (host_addr_list_t *)
   1.124 +-	    ((char *) host_addr + sizeof (*host_addr));
   1.125 +-	  hostname = (char *) h_addr_ptrs + sizeof (*h_addr_ptrs);
   1.126 +-
   1.127 + 	  for (cp = name;; ++cp)
   1.128 + 	    {
   1.129 + 	      if (!*cp)
   1.130 +@@ -282,7 +247,9 @@
   1.131 + 		  if (inet_pton (AF_INET6, name, host_addr) <= 0)
   1.132 + 		    {
   1.133 + 		      *h_errnop = HOST_NOT_FOUND;
   1.134 +-		      if (buffer_size)
   1.135 ++		      if (buffer_size == NULL)
   1.136 ++		        *status = NSS_STATUS_NOTFOUND;
   1.137 ++		      else
   1.138 + 			*result = NULL;
   1.139 + 		      goto done;
   1.140 + 		    }
   1.141 +--- glibc-2.14.1/nss/getXXbyYY_r.c
   1.142 ++++ glibc-2.14.1/nss/getXXbyYY_r.c
   1.143 +@@ -180,6 +180,9 @@
   1.144 +     case -1:
   1.145 +       return errno;
   1.146 +     case 1:
   1.147 ++#ifdef NEED_H_ERRNO
   1.148 ++      any_service = true;
   1.149 ++#endif
   1.150 +       goto done;
   1.151 +     }
   1.152 + #endif