home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume23 / sps2 / part03 / BUG-libkvm next >
Text File  |  1991-01-08  |  2KB  |  49 lines

  1. There is a bug in kvm_getcmd(3) which occurs when the arguments for a command
  2. contain an '=', or if an '=' in the environment is removed.  In user space,
  3. command arguments are laid out like this:
  4.  
  5. a r g 0 '\0' a r g 1 '\0' ... e n v 1 = e n v '\0' e n v 2 = e n v ...
  6.  
  7. The only way to tell where the arguments end and the environment begins is to
  8. look for arguments which contain '=', or environment strings which don't.  Most
  9. programs used to use the first approach.  The libkvm library uses the latter,
  10. and gets it wrong if it sees a '=' in any strings before the last string
  11. which doesn't have one.  The korn shell nulls out some '=' in it's environment,
  12. and if you have it, it's the most noticable tickler of this bug.  But even if
  13. you don't, you can tickle it with "vi a=b c".
  14.  
  15. Here's the fix.  You could probably patch the binary to ignore the
  16. "&& (argd.cnt == 0)" test, which will cause slightly incorrect results,
  17. but ones a bit closer to the truth.  Just search for "\0=" in the
  18. library, and look past it a bit.
  19.  
  20. *** /tmp/,RCSt1a01687    Wed Sep 28 01:50:36 1988
  21. --- kvmgetcmd.c    Mon Aug 29 23:23:43 1988
  22. ***************
  23. *** 141,150 ****
  24.               if (*cp == '=')
  25.                   eqseen++;
  26.               if (*cp-- == '\0') {
  27. !                 if (eqseen && (argd.cnt == 0)) {
  28.                       envd.cnt++;
  29.                       envd.sp = Uvaddr(cp+2);
  30.                       eqseen = 0;
  31.                   } else {
  32.                       argd.cnt++;
  33.                   }
  34. --- 141,154 ----
  35.               if (*cp == '=')
  36.                   eqseen++;
  37.               if (*cp-- == '\0') {
  38. !                 if (eqseen) {
  39.                       envd.cnt++;
  40.                       envd.sp = Uvaddr(cp+2);
  41.                       eqseen = 0;
  42. +                     if (argd.cnt != 0) {
  43. +                         envd.cnt += argd.cnt;
  44. +                         argd.cnt = 0;
  45. +                     }
  46.                   } else {
  47.                       argd.cnt++;
  48.                   }
  49.