Hi, I have a program that constantly stalls on reading /etc/spwd.db with SHA256File() (from sha2.h). Here is the program flow:
--------> sha256file: Operation not permitted on file: /etc/spwd.db 2f6574632f737077642e6462 ^C beta$ stat /etc/spwd.db 1024 78977 -rw-r----- 1 root _shadow 327856 57344 "Oct 23 14:58:27 2017" "Oct 17 13:54:38 2017" "Oct 17 13:54:38 2017" 16384 112 0 /etc/spwd.db beta$ id uid=0(root) gid=0(wheel) groups=0(wheel), 2(kmem), 3(sys), 4(tty), 5(operator), 20(staff), 31(guest) <-------- I don't know what's up but my research led me to create a patch for this function, it basically completes there what was started before because close() can rewrite errno afaik. If anyone has a hint as to why my SHA256File() returns with NULL and sets errno to 0 that would really interest me. My program does no setuid or seteuid at all! If you'd like to see the program, I can provide that but I wanted to put preference to the patch here. Patch (against 6.2) below signature. -peter Index: helper.c =================================================================== RCS file: /cvs/src/lib/libc/hash/helper.c,v retrieving revision 1.16 diff -u -p -u -r1.16 helper.c --- helper.c 21 Sep 2016 04:38:57 -0000 1.16 +++ helper.c 23 Oct 2017 13:06:46 -0000 @@ -71,13 +71,17 @@ HASHFileChunk(const char *filename, char return (NULL); if (len == 0) { if (fstat(fd, &sb) == -1) { + save_errno = errno; close(fd); + errno = save_errno; return (NULL); } len = sb.st_size; } if (off > 0 && lseek(fd, off, SEEK_SET) < 0) { + save_errno = errno; close(fd); + errno = save_errno; return (NULL); }