@@ -0,0 +1,74 @@
+--- ./MsgHdr.pm.orig 2003-11-12 07:25:10.000000000 +0000
++++ ./MsgHdr.pm 2006-06-01 10:44:08.000000000 +0000
+@@ -26,6 +26,10 @@ INIT {
+ no strict 'refs';
+ *{$attr . "len"} = sub {
+ my $self = shift;
++ if (!defined($self->{$attr})) {
++ return 0 unless @_;
++ $self->{$attr} = '';
++ }
+ my $olen = length($self->{$attr});
+ return $olen unless @_;
+ my $nlen = shift;
+--- ./MsgHdr.xs.orig 2003-11-12 07:25:10.000000000 +0000
++++ ./MsgHdr.xs 2006-06-01 10:44:08.000000000 +0000
+@@ -38,22 +38,22 @@ hv_2msghdr(struct Socket__MsgHdr *mh, SV
+ mh->m.msg_iov = &mh->io;
+ mh->m.msg_iovlen = 1;
+
+- if (svp = hv_fetch(hash, "name", 4, FALSE)) {
++ if ((svp = hv_fetch(hash, "name", 4, FALSE)) && SvOK(*svp)) {
+ mh->m.msg_name = SvPV_force(*svp, dlen);
+ mh->m.msg_namelen = dlen;
+ }
+
+- if (svp = hv_fetch(hash, "buf", 3, FALSE)) {
++ if ((svp = hv_fetch(hash, "buf", 3, FALSE)) && SvOK(*svp)) {
+ mh->io.iov_base = SvPV_force(*svp, dlen);
+ mh->io.iov_len = dlen;
+ }
+
+- if (svp = hv_fetch(hash, "control", 7, FALSE)) {
++ if ((svp = hv_fetch(hash, "control", 7, FALSE)) && SvOK(*svp)) {
+ mh->m.msg_control = SvPV_force(*svp, dlen);
+ mh->m.msg_controllen = dlen;
+ }
+
+- if (svp = hv_fetch(hash, "flags", 5, FALSE)) {
++ if ((svp = hv_fetch(hash, "flags", 5, FALSE)) && SvOK(*svp)) {
+ mh->m.msg_flags = SvIV(*svp);
+ }
+ }
+@@ -109,7 +109,7 @@ smh_unpack_cmsghdr(cmsv)
+ for (; cm; cm = CMSG_NXTHDR(&dummy, cm)) {
+ XPUSHs(sv_2mortal(newSViv(cm->cmsg_level)));
+ XPUSHs(sv_2mortal(newSViv(cm->cmsg_type)));
+- XPUSHs(sv_2mortal(newSVpvn(CMSG_DATA(cm),
++ XPUSHs(sv_2mortal(newSVpvn((char *)CMSG_DATA(cm),
+ (cm->cmsg_len - aligned_cmsghdr_sz))));
+ }
+
+@@ -137,7 +137,6 @@ smh_recvmsg(s, msg_hdr, flags = 0)
+ PROTOTYPE: $$;$
+ PREINIT:
+ struct Socket__MsgHdr mh;
+- struct cmsghdr *cm;
+
+ CODE:
+ hv_2msghdr(&mh, msg_hdr);
+@@ -147,11 +146,11 @@ smh_recvmsg(s, msg_hdr, flags = 0)
+
+ hsh = (HV*) SvRV(msg_hdr);
+
+- if (svp = hv_fetch(hsh, "name", 7, FALSE))
++ if ((svp = hv_fetch(hsh, "name", 7, FALSE)) && SvOK(*svp))
+ SvCUR_set(*svp, mh.m.msg_namelen);
+- if (svp = hv_fetch(hsh, "buf", 3, FALSE))
++ if ((svp = hv_fetch(hsh, "buf", 3, FALSE)) && SvOK(*svp))
+ SvCUR_set(*svp, RETVAL);
+- if (svp = hv_fetch(hsh, "control", 7, FALSE))
++ if ((svp = hv_fetch(hsh, "control", 7, FALSE)) && SvOK(*svp))
+ SvCUR_set(*svp, mh.m.msg_controllen);
+ }
+ OUTPUT:
|