A bug in perl3 (mkdir). A quick fix.
Michael Greim
greim at sbsvax.UUCP
Tue Sep 12 23:08:17 AEST 1989
This is a bug report and quick fix to help people fix perl until
Larry Wall issues an official patch. I have sent this also to Larry
Wall.
-mg
Bug in perl3.
Priority: medium
Symptoms:
The test op.mkdir fails.
If perl tries to "mkdir" a directory which already exists, it thinks
the operation did succeed, although it failed.
Diagnosis:
The machine has no library function (system call) mkdir. So perl
tries to emulate the call by forking off the program /bin/mkdir.
It then reads the output from this command and decides whether
it succeeded or not by :
- if there is no text, it succeeded
- if there is text, examine it. What error message was it? Set
errno accordingly.
On the machine on which I found this bug, mkdir returns status 1 and
a text which is not a valid error message. Thus the error message
was not found, and the return-value for mkdir was not set.
Below is the relevant code from eval.c
Add the line marked by "mg".
(Sorry: no context diffs, I have changed the lines by adding test output)
-------- cut here ---------
case O_MKDIR:
tmps = str_get(st[1]);
anum = (int)str_gnum(st[2]);
#ifdef TAINT
taintproper("Insecure dependency in mkdir");
#endif
#ifdef MKDIR
value = (double)(mkdir(tmps,anum) >= 0);
#else
(void)sprintf(buf,"mkdir %s 2>&1",tmps);
one_liner:
rsfp = mypopen(buf,"r");
if (rsfp) {
*buf = '\0';
tmps2 = fgets(buf,sizeof buf,rsfp);
(void)mypclose(rsfp);
if (tmps2 != Nullch) {
for (errno = 1; errno <= sys_nerr; errno++) {
if (instr(buf,sys_errlist[errno])) /* you don't see this */
goto say_zero;
}
errno = 0;
goto say_zero; /* mg, 11-sep-89 Note: errno is not set correctly */
}
else
value = 1.0;
}
else
goto say_zero;
#endif
goto donumset;
case O_RMDIR:
-------- cut here ---------
The value of errno is not set correctly. What should the
correct value be ???
Absorb, apply and enjoy,
-mg
--
Michael Greim Email : greim at sbsvax.informatik.uni-saarland.dbp.de
or : ...!uunet!unido!sbsvax!greim
[.signature removed by the board of censors for electronic mail's main
executive computer because it contained a four letter word ("word")]
More information about the Comp.sources.bugs
mailing list