phillips@cs.ubc.ca (George Phillips) (03/05/90)
This bug applies to perl 3.0 up to patchlevel 12. When dealing with
ascii strings ("a" or "A"), pack will call str_ncat with a -ve length
if the source string is longer than the length specified by the
template. To fix this, just don't call str_ncat with a -ve length.
Here's a patch to "doarg.c" which takes one way around the problem:
*** doarg.c.larry Sun Mar 4 14:39:03 1990
--- doarg.c Sun Mar 4 14:51:53 1990
***************
*** 395,416 ****
aptr = str_get(fromstr);
if (fromstr->str_cur > len)
str_ncat(str,aptr,len);
! else
str_ncat(str,aptr,fromstr->str_cur);
! len -= fromstr->str_cur;
! if (datumtype == 'A') {
! while (len >= 10) {
! str_ncat(str,space10,10);
! len -= 10;
}
! str_ncat(str,space10,len);
! }
! else {
! while (len >= 10) {
! str_ncat(str,null10,10);
! len -= 10;
}
- str_ncat(str,null10,len);
}
break;
case 'C':
--- 395,417 ----
aptr = str_get(fromstr);
if (fromstr->str_cur > len)
str_ncat(str,aptr,len);
! else {
str_ncat(str,aptr,fromstr->str_cur);
! len -= fromstr->str_cur;
! if (datumtype == 'A') {
! while (len >= 10) {
! str_ncat(str,space10,10);
! len -= 10;
! }
! str_ncat(str,space10,len);
}
! else {
! while (len >= 10) {
! str_ncat(str,null10,10);
! len -= 10;
! }
! str_ncat(str,null10,len);
}
}
break;
case 'C':
print pack("a24", "Just another Perl hacker and sometimes patcher") . "\n";
George Phillips phillips@cs.ubc.ca {alberta,uw-beaver,uunet}!ubc-cs!phillips