ljz%fxgrp.fx.com@ames.arc.nasa.gov (Lloyd Zusman) (10/21/88)
Here are the context diffs for a bug fix for the APM library, which was posted to comp.sources.misc a couple weeks ago. When converting APM values to ASCII and right justifying, a segment violation could occur due to a byte copy overflow. Go to the directory where the APM source code is stored, make sure that misc.c is writable, and then type 'patch <thisfile'. If you don't have Larry Wall's "patch" program, you can apply these diffs by hand ... they aren't all that extensive. Good luck. -- Lloyd Zusman Internet: ljz@fx.com Master Byte Software or ljz%fx.com@ames.arc.nasa.gov Los Gatos, California or fxgrp!ljz@ames.arc.nasa.gov "We take things well in hand." uucp: ...!ames!fxgrp!ljz [ our Internet connection is down: use uucp or mail to the entry above it ] --------------------------------- cut here ------------------------------------ *** /tmp/,RCSt1a10696 Thu Oct 20 12:10:37 1988 --- misc.c Thu Oct 20 12:09:18 1988 *************** *** 2,13 **** * Miscellaneous routines for the APM library. * * $Log: misc.c,v $ * Revision 1.0 88/10/05 12:38:14 ljz * Initial release. * */ #ifndef lint ! static char rcsid[] = "$Header: misc.c,v 1.0 88/10/05 12:38:14 ljz Exp $"; #endif /* ! lint */ #include <stdio.h> --- 2,16 ---- * Miscellaneous routines for the APM library. * * $Log: misc.c,v $ + * Revision 1.1 88/10/20 10:45:15 ljz + * Fixed byte copy overflow in apm_convert. + * * Revision 1.0 88/10/05 12:38:14 ljz * Initial release. * */ #ifndef lint ! static char rcsid[] = "$Header: misc.c,v 1.1 88/10/20 10:45:15 ljz Exp $"; #endif /* ! lint */ #include <stdio.h> *************** *** 192,197 **** --- 195,201 ---- static int localLen = 0; int roffset; int loffset; + int copylength; int stringlen; int dpos = -1; int n; *************** *** 315,334 **** roffset = 0; loffset = 0; if (length > stringlen) { ! length = stringlen; } } else if (stringlen >= length) { roffset = 0; loffset = stringlen - length; } else { roffset = length - stringlen; loffset = 0; } ! APM_copy_bytes(result + roffset, localString + loffset, length); ! result[length] = '\0'; while (roffset-- > 0) { result[roffset] = ' '; } --- 319,343 ---- roffset = 0; loffset = 0; if (length > stringlen) { ! copylength = stringlen; } + else { + copylength = length; + } } else if (stringlen >= length) { roffset = 0; loffset = stringlen - length; + copylength = length; } else { roffset = length - stringlen; loffset = 0; + copylength = stringlen; } ! APM_copy_bytes(result + roffset, localString + loffset, copylength); ! result[copylength] = '\0'; while (roffset-- > 0) { result[roffset] = ' '; }