scanimage -L crashes almost every time I run it on my system.
The patch below fixes this. OK?

Starting program: /usr/local/bin/scanimage -L

Program received signal SIGSEGV, Segmentation fault.
0x000013d0496b84b4 in memcpy (dst0=<optimized out>, src0=<optimized out>,
length=256) at /usr/src/lib/libc/string/memcpy.c:103
103             TLOOP(*(word *)dst = *(word *)src; src += wsize; dst += wsize);
(gdb) up
#1  0x000013d072201e05 in prepare_socket (if_name=0x13d0395e0ff1 "pflog0",
  local_sa=0x13d0395e0f18, broadcast_sa=0x0, dest_sa=<optimized out>)
  at pixma/pixma_bjnp.c:1032
(gdb) p *local_sa
Cannot access memory at address 0x13d0395e1000
(gdb) up
#2  sanei_bjnp_find_devices (conf_devices=<optimized out>,
  attach_bjnp=0x13d0721f3ab0 <attach_bjnp>,
  pixma_devices=0x13d072209850 <pixma_devices>) at pixma/pixma_bjnp.c:2082
(gdb) list
2077        interface = interfaces;
2078        while ((no_sockets < BJNP_SOCK_MAX) && (interface != NULL))
2079          {
2080            if ( ! (interface -> ifa_flags & IFF_POINTOPOINT) &&
2081                ( (socket_fd[no_sockets] =
2082                          prepare_socket( interface -> ifa_name,
2083                                          (bjnp_sockaddr_t *) interface -> 
ifa_addr,
2084                                          (bjnp_sockaddr_t *) interface -> 
ifa_broadaddr,
2085                                          &broadcast_addr[no_sockets] ) ) 
!= -1 ) )
2086              {
(gdb) down
#1  0x000013d072201e05 in prepare_socket (if_name=0x13d0395e0ff1 "pflog0",
  local_sa=0x13d0395e0f18, broadcast_sa=0x0, dest_sa=<optimized out>)
at pixma/pixma_bjnp.c:1032
1032      memcpy( &local_sa_copy, local_sa, sa_size(local_sa) );
(gdb) list
1027                           if_name));
1028          return -1;
1029        }
1030
1031      memset( &local_sa_copy, 0, sizeof(local_sa_copy) );
1032      memcpy( &local_sa_copy, local_sa, sa_size(local_sa) );
1033
1034      switch( local_sa_copy.addr.sa_family )
1035        {
1036          case AF_INET:
(gdb) p local_sa
$3 = (const bjnp_sockaddr_t *) 0x13d0395e0f18
(gdb) p *local_sa
Cannot access memory at address 0x13d0395e1000
(gdb) up
#2  sanei_bjnp_find_devices (conf_devices=<optimized out>,
  attach_bjnp=0x13d0721f3ab0 <attach_bjnp>,
  pixma_devices=0x13d072209850 <pixma_devices>)
  at pixma/pixma_bjnp.c:2082
2082                          prepare_socket( interface -> ifa_name,
(gdb) p *interface
$5 = {ifa_next = 0x0, ifa_name = 0x13d0395e0ff1 "pflog0", ifa_flags = 321,
  ifa_addr = 0x13d0395e0f18, ifa_netmask = 0x0, ifa_dstaddr = 0x0,
  ifa_data = 0x13d0395e0f38}
(gdb) p *interface->ifa_addr
$7 = {sa_len = 32 ' ', sa_family = 18 '\022',
  sa_data = "\004\000\365\006\000\000pflog0\000"}


diff 9c884dd8fa25c3442e8327800da7fa8752722013 /usr/ports
blob - e002fba14c4824b7b8ace48f938ddfbf3204cb1a
file + graphics/sane-backends/Makefile
--- graphics/sane-backends/Makefile
+++ graphics/sane-backends/Makefile
@@ -5,6 +5,7 @@ BROKEN-alpha=           ICE hp5590.c:1141: error: unrecognizabl
 COMMENT=               API for accessing scanners, backends
 
 DISTNAME=              sane-backends-1.0.30
+REVISION=              0
 
 SHARED_LIBS +=  sane                 2.1      # unknown
 
blob - /dev/null
file + graphics/sane-backends/patches/patch-backend_pixma_pixma_bjnp_c
--- graphics/sane-backends/patches/patch-backend_pixma_pixma_bjnp_c
+++ graphics/sane-backends/patches/patch-backend_pixma_pixma_bjnp_c
@@ -0,0 +1,20 @@
+$OpenBSD$
+Fix segfault during 'scanimage -L' if e.g. a "pflog0" interface exists.
+Address family AF_LINK is not expected by prepare_socket() and sa_size().
+Crashes during memcpy( &local_sa_copy, local_sa, sa_size(local_sa) );
+because sa_size() returns a fallback value that doesn't match the actual size.
+Index: backend/pixma/pixma_bjnp.c
+--- backend/pixma/pixma_bjnp.c.orig
++++ backend/pixma/pixma_bjnp.c
+@@ -2078,6 +2078,11 @@ sanei_bjnp_find_devices (const char **conf_devices,
+     while ((no_sockets < BJNP_SOCK_MAX) && (interface != NULL))
+       {
+         if ( ! (interface -> ifa_flags & IFF_POINTOPOINT) &&
++            ( interface -> ifa_addr -> sa_family == AF_INET
++#ifdef ENABLE_IPV6
++            || interface -> ifa_addr -> sa_family == AF_INET6
++#endif
++            ) &&
+             ( (socket_fd[no_sockets] =
+                       prepare_socket( interface -> ifa_name,
+                                       (bjnp_sockaddr_t *) interface -> 
ifa_addr,

Reply via email to