kopia lustrzana https://gitlab.com/sane-project/backends
				
				
				
			Fix strict aliasing issues
Strict aliasing warnings can now lead to broken code with gcc 4.4. Replace various sockaddr casts by unions.merge-requests/1/head
							rodzic
							
								
									177f8d2022
								
							
						
					
					
						commit
						f06cf4770b
					
				| 
						 | 
				
			
			@ -1,3 +1,7 @@
 | 
			
		|||
2009-06-16 Julien Blache <jb@jblache.org>
 | 
			
		||||
	* frontend/saned.c: fix strict aliasing issues, now problematic
 | 
			
		||||
	with gcc 4.4.
 | 
			
		||||
 | 
			
		||||
2009-06-14  Nicolas Martin <nicols-guest at users.alioth.debian.org>
 | 
			
		||||
	* backend/pixma_mp150.c, doc/descriptions/pixma.desc, doc/sane-pixma.man:
 | 
			
		||||
	Thanks to Vladimir Andreev patch, fix network scan for MP800R.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -258,7 +258,12 @@ static in_port_t data_port_lo;
 | 
			
		|||
static in_port_t data_port_hi;
 | 
			
		||||
 | 
			
		||||
#ifdef SANED_USES_AF_INDEP
 | 
			
		||||
static struct sockaddr_storage remote_address;
 | 
			
		||||
static union {
 | 
			
		||||
  struct sockaddr_storage ss;
 | 
			
		||||
  struct sockaddr sa;
 | 
			
		||||
  struct sockaddr_in sin;
 | 
			
		||||
  struct sockaddr_in6 sin6;
 | 
			
		||||
} remote_address;
 | 
			
		||||
static int remote_address_len;
 | 
			
		||||
#else
 | 
			
		||||
static struct in_addr remote_address;
 | 
			
		||||
| 
						 | 
				
			
			@ -750,15 +755,15 @@ check_host (int fd)
 | 
			
		|||
  FILE *fp;
 | 
			
		||||
 | 
			
		||||
  /* Get address of remote host */
 | 
			
		||||
  remote_address_len = sizeof (remote_address);
 | 
			
		||||
  if (getpeername (fd, (struct sockaddr *) &remote_address, (socklen_t *) &remote_address_len) < 0)
 | 
			
		||||
  remote_address_len = sizeof (remote_address.ss);
 | 
			
		||||
  if (getpeername (fd, &remote_address.sa, (socklen_t *) &remote_address_len) < 0)
 | 
			
		||||
    {
 | 
			
		||||
      DBG (DBG_ERR, "check_host: getpeername failed: %s\n", strerror (errno));
 | 
			
		||||
      remote_ip = strdup ("[error]");
 | 
			
		||||
      return SANE_STATUS_INVAL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  err = getnameinfo ((struct sockaddr *) &remote_address, remote_address_len,
 | 
			
		||||
  err = getnameinfo (&remote_address.sa, remote_address_len,
 | 
			
		||||
		     hostname, sizeof (hostname), NULL, 0, NI_NUMERICHOST);
 | 
			
		||||
  if (err)
 | 
			
		||||
    {
 | 
			
		||||
| 
						 | 
				
			
			@ -770,7 +775,7 @@ check_host (int fd)
 | 
			
		|||
    remote_ip = strdup (hostname);
 | 
			
		||||
 | 
			
		||||
#ifdef ENABLE_IPV6
 | 
			
		||||
  sin6 = (struct sockaddr_in6 *) &remote_address;
 | 
			
		||||
  sin6 = &remote_address.sin6;
 | 
			
		||||
 | 
			
		||||
  if (SANE_IN6_IS_ADDR_V4MAPPED (sin6->sin6_addr.s6_addr))
 | 
			
		||||
    {
 | 
			
		||||
| 
						 | 
				
			
			@ -815,9 +820,9 @@ check_host (int fd)
 | 
			
		|||
    }
 | 
			
		||||
#endif /* ENABLE_IPV6 */
 | 
			
		||||
 | 
			
		||||
  sin = (struct sockaddr_in *) &remote_address;
 | 
			
		||||
  sin = &remote_address.sin;
 | 
			
		||||
 | 
			
		||||
  switch (SS_FAMILY(remote_address))
 | 
			
		||||
  switch (SS_FAMILY(remote_address.ss))
 | 
			
		||||
    {
 | 
			
		||||
      case AF_INET:
 | 
			
		||||
	if (IN_LOOPBACK (ntohl (sin->sin_addr.s_addr)))
 | 
			
		||||
| 
						 | 
				
			
			@ -995,7 +1000,7 @@ check_host (int fd)
 | 
			
		|||
	    {
 | 
			
		||||
	      if (strchr (config_line, ':') != NULL) /* is a v6 address */
 | 
			
		||||
		{
 | 
			
		||||
		  if (SS_FAMILY(remote_address) == AF_INET6)
 | 
			
		||||
		  if (SS_FAMILY(remote_address.ss) == AF_INET6)
 | 
			
		||||
		    {
 | 
			
		||||
		      if (check_v6_in_range (sin6, config_line, netmask))
 | 
			
		||||
			{
 | 
			
		||||
| 
						 | 
				
			
			@ -1021,7 +1026,7 @@ check_host (int fd)
 | 
			
		|||
			sin = (struct sockaddr_in *)res->ai_addr;
 | 
			
		||||
		    }
 | 
			
		||||
 | 
			
		||||
		  if ((SS_FAMILY(remote_address) == AF_INET) ||
 | 
			
		||||
		  if ((SS_FAMILY(remote_address.ss) == AF_INET) ||
 | 
			
		||||
		      (IPv4map == SANE_TRUE))
 | 
			
		||||
		    {
 | 
			
		||||
		      
 | 
			
		||||
| 
						 | 
				
			
			@ -1034,7 +1039,7 @@ check_host (int fd)
 | 
			
		|||
		      else
 | 
			
		||||
			{
 | 
			
		||||
			  /* restore the old sin pointer */
 | 
			
		||||
			  sin = (struct sockaddr_in *)&remote_address;
 | 
			
		||||
			  sin = &remote_address.sin;
 | 
			
		||||
			}
 | 
			
		||||
		      
 | 
			
		||||
		      if (res != NULL)
 | 
			
		||||
| 
						 | 
				
			
			@ -1399,7 +1404,14 @@ init (Wire * w)
 | 
			
		|||
static int
 | 
			
		||||
start_scan (Wire * w, int h, SANE_Start_Reply * reply)
 | 
			
		||||
{
 | 
			
		||||
  union {
 | 
			
		||||
    struct sockaddr_storage ss;
 | 
			
		||||
    struct sockaddr sa;
 | 
			
		||||
    struct sockaddr_in sin;
 | 
			
		||||
#ifdef ENABLE_IPV6
 | 
			
		||||
    struct sockaddr_in6 sin6;
 | 
			
		||||
#endif /* ENABLE_IPV6 */
 | 
			
		||||
  } data_addr;
 | 
			
		||||
  struct sockaddr_in *sin;
 | 
			
		||||
#ifdef ENABLE_IPV6
 | 
			
		||||
  struct sockaddr_in6 *sin6;
 | 
			
		||||
| 
						 | 
				
			
			@ -1411,8 +1423,8 @@ start_scan (Wire * w, int h, SANE_Start_Reply * reply)
 | 
			
		|||
 | 
			
		||||
  be_handle = handle[h].handle;
 | 
			
		||||
 | 
			
		||||
  len = sizeof (ss);
 | 
			
		||||
  if (getsockname (w->io.fd, (struct sockaddr *) &ss, (socklen_t *) &len) < 0)
 | 
			
		||||
  len = sizeof (data_addr.ss);
 | 
			
		||||
  if (getsockname (w->io.fd, &data_addr.sa, (socklen_t *) &len) < 0)
 | 
			
		||||
    {
 | 
			
		||||
      DBG (DBG_ERR, "start_scan: failed to obtain socket address (%s)\n",
 | 
			
		||||
	   strerror (errno));
 | 
			
		||||
| 
						 | 
				
			
			@ -1420,7 +1432,7 @@ start_scan (Wire * w, int h, SANE_Start_Reply * reply)
 | 
			
		|||
      return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  fd = socket (SS_FAMILY(ss), SOCK_STREAM, 0);
 | 
			
		||||
  fd = socket (SS_FAMILY(data_addr.ss), SOCK_STREAM, 0);
 | 
			
		||||
  if (fd < 0)
 | 
			
		||||
    {
 | 
			
		||||
      DBG (DBG_ERR, "start_scan: failed to obtain data socket (%s)\n",
 | 
			
		||||
| 
						 | 
				
			
			@ -1429,14 +1441,14 @@ start_scan (Wire * w, int h, SANE_Start_Reply * reply)
 | 
			
		|||
      return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  switch (SS_FAMILY(ss))
 | 
			
		||||
  switch (SS_FAMILY(data_addr.ss))
 | 
			
		||||
    {
 | 
			
		||||
      case AF_INET:
 | 
			
		||||
	sin = (struct sockaddr_in *) &ss;
 | 
			
		||||
	sin = &data_addr.sin;
 | 
			
		||||
	break;
 | 
			
		||||
#ifdef ENABLE_IPV6
 | 
			
		||||
      case AF_INET6:
 | 
			
		||||
	sin6 = (struct sockaddr_in6 *) &ss;
 | 
			
		||||
	sin6 = &data_addr.sin6;
 | 
			
		||||
	break;
 | 
			
		||||
#endif /* ENABLE_IPV6 */
 | 
			
		||||
      default:
 | 
			
		||||
| 
						 | 
				
			
			@ -1446,7 +1458,7 @@ start_scan (Wire * w, int h, SANE_Start_Reply * reply)
 | 
			
		|||
  /* Try to bind a port between data_port_lo and data_port_hi for the data connection */
 | 
			
		||||
  for (data_port = data_port_lo; data_port <= data_port_hi; data_port++)
 | 
			
		||||
    {
 | 
			
		||||
      switch (SS_FAMILY(ss))
 | 
			
		||||
      switch (SS_FAMILY(data_addr.ss))
 | 
			
		||||
        {
 | 
			
		||||
          case AF_INET:
 | 
			
		||||
            sin->sin_port = htons(data_port);
 | 
			
		||||
| 
						 | 
				
			
			@ -1462,7 +1474,7 @@ start_scan (Wire * w, int h, SANE_Start_Reply * reply)
 | 
			
		|||
 | 
			
		||||
      DBG (DBG_INFO, "start_scan: trying to bind data port %d\n", data_port);
 | 
			
		||||
 | 
			
		||||
      ret = bind (fd, (struct sockaddr *) &ss, len);
 | 
			
		||||
      ret = bind (fd, &data_addr.sa, len);
 | 
			
		||||
      if (ret == 0)
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -1483,7 +1495,7 @@ start_scan (Wire * w, int h, SANE_Start_Reply * reply)
 | 
			
		|||
      return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (getsockname (fd, (struct sockaddr *) &ss, (socklen_t *) &len) < 0)
 | 
			
		||||
  if (getsockname (fd, &data_addr.sa, (socklen_t *) &len) < 0)
 | 
			
		||||
    {
 | 
			
		||||
      DBG (DBG_ERR, "start_scan: failed to obtain socket address (%s)\n",
 | 
			
		||||
	   strerror (errno));
 | 
			
		||||
| 
						 | 
				
			
			@ -1491,15 +1503,15 @@ start_scan (Wire * w, int h, SANE_Start_Reply * reply)
 | 
			
		|||
      return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  switch (SS_FAMILY(ss))
 | 
			
		||||
  switch (SS_FAMILY(data_addr.ss))
 | 
			
		||||
    {
 | 
			
		||||
      case AF_INET:
 | 
			
		||||
	sin = (struct sockaddr_in *) &ss;
 | 
			
		||||
	sin = &data_addr.sin;
 | 
			
		||||
	reply->port = ntohs (sin->sin_port);
 | 
			
		||||
	break;
 | 
			
		||||
#ifdef ENABLE_IPV6
 | 
			
		||||
      case AF_INET6:
 | 
			
		||||
	sin6 = (struct sockaddr_in6 *) &ss;
 | 
			
		||||
	sin6 = &data_addr.sin6;
 | 
			
		||||
	reply->port = ntohs (sin6->sin6_port);
 | 
			
		||||
	break;
 | 
			
		||||
#endif /* ENABLE_IPV6 */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Ładowanie…
	
		Reference in New Issue