papa%USC-CSE@USC-ECL.ARPA (06/16/84)
From: Marco Papa <papa%USC-CSE@USC-ECL.ARPA>
While using the exec() routines which are included in the INFO-IBMPC
library (EXEC2.ASM and EXEC3.ASM) I run into an unexpected problem.
DOS Function 4B clobbers some data into the caller's user area.
For example, try to link the following Lattice "C" program with EXEC3.ASM:
#include <stdio.h>
#include <conio.h>
main(argc,argv)
int argc;
char *argv[];
{
int i;
char *p;
char *malloc();
p = malloc ((unsigned) 256);
strcpy(p, argv[1]);
printf("Now executing a command\n\r");
i = exec(p);
switch (i) {
case 0:
printf("return successful\n\r");
break;
case -1:
printf("Insufficient memory\n\r");
break;
case -2:
printf("access denied\n\r");
break;
case -3:
printf("No such command\n\r");
break;
case -4:
printf("Invalid command format\n\r");
break;
case -5:
printf("Memory control blocks destroyed\n\r");
break;
case -6:
printf("Invalid memory block address\n\r");
break;
default:
printf("You should never get here!\n\r");
break;
}
}
Then, run it as follows:
A>newexec dir
As a result, the DOS DIR command will be properly executed, but the
subsequent printf will show that the data area has been overwritten by
function 4B.
I tested the same program (and other programs that use function 4B, and that
have their data overwritten) under DOS 2.1 and they work perfectly.
The bottom line is: if you use DOS function 4B under DOS 2.0, you do it at
your own risk. Did Microsoft report this DOS 2.1 bug fix to anyone on the net?
Marco Papa