# \`Socket#unpack\_sockaddr\_un': sockaddr\_un size differs - 15 r

**URL:** <https://www.ruby-forum.com/t/socket-unpack-sockaddr-un-sockaddr-un-size-differs-15-r/62234>\
**Category:** Development\
**Created:** [June 1, 2006, 7:48pm UTC](https://www.ruby-forum.com/t/socket-unpack-sockaddr-un-sockaddr-un-size-differs-15-r/62234 "2006-06-01T19:48:02Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![Tanaka\_A](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@Tanaka\_A](https://www.ruby-forum.com/u/Tanaka_A)\
**Post date:** [June 1, 2006, 7:48pm UTC](https://www.ruby-forum.com/t/socket-unpack-sockaddr-un-sockaddr-un-size-differs-15-r/62234/1 "2006-06-01T19:48:02Z")

</div>

e$B$U$H5$$,$D$$$?$N$G$9$,!“e(BSocket.unpack\_sockaddr\_un e$B$Ke(B  
UNIXServer#getsockname e$B$GF@$?%”%I%l%9$rEO$9$H%(%i!\<$K$J$j$^e(B  
e$B$9!#e(B

% ./ruby -v -rsocket -e ’  
File.unlink("/tmp/tmpsock") rescue nil  
s = UNIXServer.new("/tmp/tmpsock")  
p s.getsockname  
p Socket.unpack\_sockaddr\_un(s.getsockname)’  
ruby 1.9.0 (2006-06-01) [i686-linux]  
“\001\000/tmp/tmpsock\000”  
-e:5:in `Socket#unpack\_sockaddr\_un’: sockaddr\_un size differs - 15  
required; 110 given (TypeError)  
from -e:5

getsockname e$B$GF@$?$b$N$r$&$^$/07$($J$$$N$OJQ$8$c$J$$$G$7$g$&e(B  
e$B$+!#e(B

---

<div class="post-metadata">

**Author:** ![Tanaka\_A](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@Tanaka\_A](https://www.ruby-forum.com/u/Tanaka_A)\
**Post date:** [June 3, 2006, 6:50am UTC](https://www.ruby-forum.com/t/socket-unpack-sockaddr-un-sockaddr-un-size-differs-15-r/62234/2 "2006-06-03T06:50:57Z")

</div>

In article [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid),  
Tanaka A. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) writes:

> “\001\000/tmp/tmpsock\000”  
> -e:5:in `Socket#unpack\_sockaddr\_un’: sockaddr\_un size differs - 15 required; 110 given (TypeError)  
> from -e:5
> 
> getsockname e$B$GF@$?$b$N$r$&$^$/07$($J$$$N$OJQ$8$c$J$$$G$7$g$&e(B  
> e$B$+!#e(B

e$B$3$NB\>!"L5L\>$Ne(B UNIX e$B%=%1%C%H$Ne(B addr, peeraddr, path  
e$B$,JQ$@$H$+!"e(B

% ruby -v -rsocket -e ’  
s1, s2 = UNIXSocket.pair  
p s1.addr  
p s1.peeraddr  
p s1.path  
’  
ruby 1.9.0 (2006-06-02) [i686-linux]  
[“AF\_UNIX”, “\224\272\332\267\2408\356\267\241j\341\267HZ\364\267”]  
[“AF\_UNIX”, “\374 \332\267\034)\332\267\200v\024\010\034)\332\267\001”]  
“\034)\332\267\200v\024\010\034)\332\267\001”

UNIXSocket#path e$B$,@\B3@h$N%Q%9$rJV$9$H$+!"e(B

% ruby -v -rsocket -e ’  
UNIXServer.open(“/tmp/s”) {|serv|  
p UNIXSocket.open(“/tmp/s”).path  
}’  
ruby 1.9.0 (2006-06-02) [i686-linux]  
“/tmp/s”

UNIXServer.open e$B$G:n$C$?$O$:$N$H$3$m$K%=%1%C%H$,$J$$$H$+!"e(B

% ruby -v -rsocket -e ’  
path = “/tmp/” + “s” \* 120  
UNIXServer.open(path) {|serv|  
p File.stat(path)  
}’  
ruby 1.9.0 (2006-06-02) [i686-linux]  
-e:4:in `File#stat’: No such file or directory -  
/tmp/ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss  
(Errno::ENOENT)  
from -e:4  
from -e:3

e$B$H$$$C$?LdBj$rD\>$9$K$O$3$&$G$9$+$M!#e(B

# Index: ext/socket/socket.c

RCS file: /src/ruby/ext/socket/socket.c,v  
retrieving revision 1.167  
diff -u -p -r1.167 socket.c  
— ext/socket/socket.c 2 Jun 2006 12:06:09 -0000 1.167  
+++ ext/socket/socket.c 3 Jun 2006 04:38:24 -0000  
@@ -543,7 +543,7 @@ bsock\_do\_not\_reverse\_lookup\_set(sock, st

static VALUE ipaddr \_((struct sockaddr\*, int));  
#ifdef HAVE\_SYS\_UN\_H  
-static VALUE unixaddr \_((struct sockaddr\_un\*));  
+static VALUE unixaddr \_((struct sockaddr\_un\*, socklen\_t));  
#endif

enum sock\_recv\_type {  
@@ -620,10 +620,7 @@ s\_recvfrom(sock, argc, argv, from)

#ifdef HAVE\_SYS\_UN\_H  
case RECV\_UNIX:

- 

```
   if (alen) /* connection-oriented socket may not return a from 

```

result \*/

- 

```
       return rb_assoc_new(str, unixaddr((struct 

```

sockaddr\_un\*)buf));

- 

```
   else

```

- 

```
       return rb_assoc_new(str, Qnil);

```

- 

```
   return rb_assoc_new(str, unixaddr((struct sockaddr_un*)buf, 

```

alen));  
#endif  
case RECV\_SOCKET:  
return rb\_assoc\_new(str, rb\_str\_new(buf, alen));  
@@ -685,8 +682,7 @@ s\_recvfrom\_nonblock(int argc, VALUE \*arg

#ifdef HAVE\_SYS\_UN\_H  
case RECV\_UNIX:

- 

```
   if (alen) /* connection-oriented socket may not return a from 

```

result \*/

- 

```
       addr = unixaddr((struct sockaddr_un*)buf);

```

- 

```
   addr = unixaddr((struct sockaddr_un*)buf, alen);
   break;

```

#endif

@@ -1607,8 +1603,11 @@ init\_unixsock(sock, path, server)

```
 MEMZERO(&sockaddr, struct sockaddr_un, 1);
 sockaddr.sun_family = AF_UNIX;

```

- strncpy(sockaddr.sun\_path, RSTRING(path)-\>ptr,  
sizeof(sockaddr.sun\_path)-1);
- sockaddr.sun\_path[sizeof(sockaddr.sun\_path)-1] = ‘\0’;

- if (sizeof(sockaddr.sun\_path) \<= RSTRING(path)-\>len) {
- 

```
   rb_raise(rb_eArgError, "too long unix socket path (max: 

```

%dbytes)",

- 

```
       (int)sizeof(sockaddr.sun_path)-1);

```

- }

- strcpy(sockaddr.sun\_path, StringValueCStr(path));

- fptr-\>path = strdup(RSTRING(path)-\>ptr);

- if (server) {

- 

```
   fptr->path = strdup(RSTRING(path)->ptr);

```

- }

+static char \*  
+unixpath(struct sockaddr\_un \*sockaddr, socklen\_t len)  
+{

- if (sockaddr-\>sun\_path \< (char\*)sockaddr + len)
- 

```
   return sockaddr->sun_path;

```

- else
- 

```
   return "";

```

+}  
+  
static VALUE  
unix\_path(sock)  
VALUE sock;  
@@ -1878,7 +1888,7 @@ unix\_path(sock)  
socklen\_t len = sizeof(addr);  
if (getsockname(fptr-\>fd, (struct sockaddr\*)&addr, &len) \< 0)  
rb\_sys\_fail(0);

- fptr-\>path = strdup(addr.sun\_path);

- fptr-\>path = strdup(unixpath(&addr, len));  
}  
return rb\_str\_new2(fptr-\>path);  
}  
@@ -2201,11 +2211,12 @@ unix\_sysaccept(sock)

#ifdef HAVE\_SYS\_UN\_H  
static VALUE  
-unixaddr(sockaddr)  
+unixaddr(sockaddr, len)  
struct sockaddr\_un \*sockaddr;

- socklen\_t len;  
{  
return rb\_assoc\_new(rb\_str\_new2(“AF\_UNIX”),

- 

```
  	rb_str_new2(sockaddr->sun_path));

```

- 

```
                   rb_str_new2(unixpath(sockaddr, len)));

```

}  
#endif

@@ -2221,9 +2232,7 @@ unix\_addr(sock)

```
 if (getsockname(fptr->fd, (struct sockaddr*)&addr, &len) < 0)
rb_sys_fail("getsockname(2)");

```

- if (len == 0)
- 

```
   addr.sun_path[0] = '\0';

```

- return unixaddr(&addr);

- return unixaddr(&addr, len);  
}

static VALUE  
@@ -2238,9 +2247,7 @@ unix\_peeraddr(sock)

```
 if (getpeername(fptr->fd, (struct sockaddr*)&addr, &len) < 0)
rb_sys_fail("getsockname(2)");

```

- if (len == 0)
- 

```
   addr.sun_path[0] = '\0';

```

- return unixaddr(&addr);

- return unixaddr(&addr, len);  
}  
#endif

@@ -3516,11 +3523,17 @@ sock\_s\_pack\_sockaddr\_un(self, path)  
VALUE self, path;  
{  
struct sockaddr\_un sockaddr;

- char \*sun\_path;  
VALUE addr;

- strncpy(sockaddr.sun\_path, StringValuePtr(path),  
sizeof(sockaddr.sun\_path)-1);

- sun\_path = StringValueCStr(path);
- if (sizeof(sockaddr.sun\_path) \<= strlen(sun\_path)) {
- 

```
   rb_raise(rb_eArgError, "too long unix socket path (max: 

```

%dbytes)",

- 

```
       (int)sizeof(sockaddr.sun_path)-1);

```

- }
- strncpy(sockaddr.sun\_path, sun\_path, sizeof(sockaddr.sun\_path)-1);  
addr = rb\_str\_new((char\*)&sockaddr, sizeof(sockaddr));  
OBJ\_INFECT(addr, path);

@@ -3532,15 +3545,21 @@ sock\_s\_unpack\_sockaddr\_un(self, addr)  
VALUE self, addr;  
{  
struct sockaddr\_un \* sockaddr;

- char \*sun\_path;  
VALUE path;

- if (RSTRING(addr)-\>len != sizeof(struct sockaddr\_un)) {
- rb\_raise(rb\_eTypeError, “sockaddr\_un size differs - %ld required; %d  
given”,

- if (sizeof(struct sockaddr\_un) \< RSTRING(addr)-\>len) {
- rb\_raise(rb\_eTypeError, “too long sockaddr\_un - %ld longer than %d”,  
RSTRING(addr)-\>len, sizeof(struct sockaddr\_un));  
}

- /\* xxx: should I check against sun\_path size? \*/
- path = rb\_str\_new2(sockaddr-\>sun\_path);

- sun\_path = unixpath(sockaddr, RSTRING(addr)-\>len);
- if (sizeof(struct sockaddr\_un) == RSTRING(addr)-\>len &&
- 

```
   sun_path == sockaddr->sun_path &&

```

- 

```
   sun_path + strlen(sun_path) == RSTRING(addr)->ptr + 

```

RSTRING(addr)-\>len) {

- 

```
   rb_raise(rb_eArgError, "sockaddr_un.sun_path not NUL 

```

terminated");

- }
- path = rb\_str\_new2(sun\_path);  
OBJ\_INFECT(path, addr);  
return path;  
}

---

<div class="post-metadata">

**Author:** ![Tanaka\_A](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@Tanaka\_A](https://www.ruby-forum.com/u/Tanaka_A)\
**Post date:** [June 4, 2006, 1:27pm UTC](https://www.ruby-forum.com/t/socket-unpack-sockaddr-un-sockaddr-un-size-differs-15-r/62234/3 "2006-06-04T13:27:49Z")

</div>

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

In message “Re: [ruby-dev:28683] Re: `Socket#unpack\_sockaddr\_un’:  
sockaddr\_un size differs - 15 required; 110 given (TypeError)”  
on Sat, 3 Jun 2006 13:49:29 +0900, Tanaka A. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
writes:

|In article [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid),  
| Tanaka A. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) writes:  
|  
|\> e$B$U$H5$$,$D$$$?$N$G$9$,!“e(BSocket.unpack\_sockaddr\_un e$B$Ke(B  
|\> UNIXServer#getsockname e$B$GF@$?%”%I%l%9$rEO$9$H%(%i!\<$K$J$j$^e(B  
|\> e$B$9!#e(B

|\> getsockname e$B$GF@$?$b$N$r$&$^$/07$($J$$$N$OJQ$8$c$J$$$G$7$g$&e(B  
|\> e$B$+!#e(B  
|  
|e$B$3$NB\>!"L5L\>$Ne(B UNIX e$B%=%1%C%H$Ne(B addr, peeraddr, path e$B$,JQ$@$H$+!"e(B  
|UNIXSocket#path e$B$,@\B3@h$N%Q%9$rJV$9$H$+!"e(B  
|UNIXServer.open e$B$G:n$C$?$O$:$N$H$3$m$K%=%1%C%H$,$J$$$H$+!"e(B  
|e$B$H$$$C$?LdBj$rD\>$9$K$O$3$&$G$9$+$M!#e(B

e$B%3%\_%C%H$7$F$$$?$@$1$^$;$s$+!)e(B
