string_has_null() fails sometimes in Pike 8.0.28.
Imported from http://bugzilla.roxen.com/bugzilla/show_bug.cgi?id=7826
Reported by @grubba
mkdirhier in the build system fails:
int mkdirhier(string path, int|void mod)
{
werror("mkdirhier(%O, %O)...\n", path, mod);
werror("CWD: %O\n", getcwd());
werror("mkdir: %O [%O]\n", mkdir, function_object(mkdir));
trace(2);
string a = "";
int r = 1;
function m = mkdir;
if(Stdio.is_dir(path))
return query_num_arg() == 1 ? 1 : (chmod(path, mod),1);
foreach(path/"/", string d)
{
a += d + "/";
if(sizeof(d))
if(query_num_arg() == 1) {
werror("mkdir(%O)\n", a);
r = m(a);
} else {
werror("mkdir(%O, %O)\n", a, mod);
r = m(a, mod);
}
int e = errno();
werror("mkdir(%O, %O) ==> %O\n", a, mod, r);
if (!r) {
werror("Errno: %O: %s\n", e, strerror(e));
}
}
trace(0);
werror("get_dir: %O\n", get_dir());
return r || (query_num_arg() == 2 && (chmod(path, mod),1));
}
mkdirhier("#!/bin/sh\n"
"tar xf \"$0\" StmP1217ce1.sh\n"
"exec ./StmP1217ce1.sh \"$0\" \"$@\"\n", 493)...
CWD: "/home/dist/tmp/build/roxen-pkg-rhel6_x86_64"
mkdir: mkdir [0]
- -: 7ab230->is_dir("#!/bin/sh\n"
"tar xf \"$0\" StmP1217ce1.sh\n"
"exec ./StmP1217ce1.sh \"$0\" \"$@\"\n")
- -: 7aaea0->__lambda_65641_1_line_1821("#!/bin/sh\n"
"tar xf \"$0\" StmP1217ce1.sh\n"
"exec ./StmP1217ce1.sh \"$0\" \"$@\...
- module.pmod:2785: 7aaea0->__lambda_65641_1_line_1821() returns: 0
- mkpackage.pike:15: 7ab230->is_dir() returns: 0
- mkpackage.pike:18: program(home/per/src/pike80/src/iterators.cmod:1186)("#!/bin/sh\n"
"tar xf \"$0\" StmP1217ce1.sh\n"
"exec ./StmP1217c...
- -: 7ab5c0->create("#!/bin/sh\n"
"tar xf \"$0\" StmP1217ce1.sh\n"
"exec ./StmP1217ce1.sh \"$0\" \"$@\"\n",47)
- -: 7ab5c0->create() returns: 47
- mkpackage.pike:18: returns: object(home/per/src/pike80/src/iterators.cmod:1186)
- -: 7aad50->write("mkdir(%O, %O)\n","#!/",493)
mkdir("#!/", 493)
- mkpackage.pike:26: 7aad50->write() returns: 18
- mkpackage.pike:27: mkdir("#!/",493)
- mkpackage.pike:27: returns: 0
- -: 7aad50->write("mkdir(%O, %O) ==> %O\n","#!/",493,0)
mkdir("#!/", 493) ==> 0
- mkpackage.pike:30: 7aad50->write() returns: 24
- -: 7aad50->write("Errno: %O: %s\n",22,"Invalid argument")
Errno: 22: Invalid argument
- mkpackage.pike:32: 7aad50->write() returns: 28
- -: 7aad50->write("mkdir(%O, %O)\n","#!/bin/",493)
mkdir("#!/bin/", 493)
- mkpackage.pike:26: 7aad50->write() returns: 22
- mkpackage.pike:27: mkdir("#!/bin/",493)
- mkpackage.pike:27: returns: 0
- -: 7aad50->write("mkdir(%O, %O) ==> %O\n","#!/bin/",493,0)
mkdir("#!/bin/", 493) ==> 0
- mkpackage.pike:30: 7aad50->write() returns: 28
- -: 7aad50->write("Errno: %O: %s\n",2,"No such file or directory")
Errno: 2: No such file or directory
- mkpackage.pike:32: 7aad50->write() returns: 36
- -: 7aad50->write("mkdir(%O, %O)\n","#!/bin/sh\n"
"tar xf \"$0\" StmP1217ce1.sh\n"
"exec ./",493)
mkdir("#!/bin/sh\n"
"tar xf \"$0\" StmP1217ce1.sh\n"
"exec ./", 493)
- mkpackage.pike:26: 7aad50->write() returns: 69
- mkpackage.pike:27: mkdir("#!/bin/sh\n"
"tar xf \"$0\" StmP1217ce1.sh\n"
"exec ./",493)
- mkpackage.pike:27: returns: 0
- -: 7aad50->write("mkdir(%O, %O) ==> %O\n","#!/bin/sh\n"
"tar xf \"$0\" StmP1217ce1.sh\n"
"exec ./",493,0)
mkdir("#!/bin/sh\n"
"tar xf \"$0\" StmP1217ce1.sh\n"
"exec ./", 493) ==> 0
- mkpackage.pike:30: 7aad50->write() returns: 75
- -: 7aad50->write("Errno: %O: %s\n",2,"No such file or directory")
Errno: 2: No such file or directory
- mkpackage.pike:32: 7aad50->write() returns: 36
- -: 7aad50->write("mkdir(%O, %O)\n","#!/bin/sh\n"
"tar xf \"$0\" StmP1217ce1.sh\n"
"exec ./StmP1217ce1.sh \"$0\" \"$@\"\n...
mkdir("#!/bin/sh\n"
"tar xf \"$0\" StmP1217ce1.sh\n"
"exec ./StmP1217ce1.sh \"$0\" \"$@\"\n"
"/", 493)
- mkpackage.pike:26: 7aad50->write() returns: 103
- mkpackage.pike:27: mkdir("#!/bin/sh\n"
"tar xf \"$0\" StmP1217ce1.sh\n"
"exec ./StmP1217ce1.sh \"$0\" \"$@\"\n"
"/",493)
- mkpackage.pike:27: returns: 0
- -: 7aad50->write("mkdir(%O, %O) ==> %O\n","#!/bin/sh\n"
"tar xf \"$0\" StmP1217ce1.sh\n"
"exec ./StmP1217ce1.sh \"$0\" \...
mkdir("#!/bin/sh\n"
"tar xf \"$0\" StmP1217ce1.sh\n"
"exec ./StmP1217ce1.sh \"$0\" \"$@\"\n"
"/", 493) ==> 0
- mkpackage.pike:30: 7aad50->write() returns: 109
- -: 7aad50->write("Errno: %O: %s\n",2,"No such file or directory")
Errno: 2: No such file or directory
- mkpackage.pike:32: 7aad50->write() returns: 36
get_dir: ({ /* 9 elements */
"StmP17a29d9.sh",
"StmP4bdaf62.sh",
"StmP110dd7c.sh",
"StmP41b2c90.sh",
"StmP618f3c0.sh",
"StmP1217ce1.sh",
"StmPa4d952e.sh",
"StmP10191d8.sh",
"StmPd34cb29.sh"
})
chmod(): Failed: File not found
/home/dist/build/devel/archive/mkpackage.pike:38:
/main()->mkdirhier("#!/bin/sh\ntar xf \"$0\" StmP1217ce1.sh\nexec ./StmP12
17ce1.sh \"$0\" \"$@\"\n",493)
mkdir("#!/", 493) failing with errno 22 (EINVAL) indicates that string_has_null() has returned true (from efuns.c):
if (string_has_null(str)) {
/* Filenames with NUL are not supported. */
errno = EINVAL;
pop_n_elems(args);
push_int(0);
return;
}
string_has_null() is defined in stralloc.h as:
static INLINE int ATTRIBUTE((unused)) string_has_null( struct pike_string *x )
{
INT32 min;
if( !x->len ) return 0;
check_string_range(x,0,&min,0);
return min <= 0;
}