NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: lib/44807: something broken in stat(2)
On Mar 30, 6:15pm, jruohonen%iki.fi@localhost (Jukka Ruohonen) wrote:
-- Subject: lib/44807: something broken in stat(2)
| >Number: 44807
| >Category: lib
| >Synopsis: something broken in stat(2)
| >Confidential: no
| >Severity: serious
| >Priority: high
| >Responsible: lib-bug-people
| >State: open
| >Class: sw-bug
| >Submitter-Id: net
| >Arrival-Date: Wed Mar 30 18:15:00 +0000 2011
| >Originator: Jukka Ruohonen
| >Release: 5.1 - 5.99.48
| >Organization:
| -
| >Description:
|
| Another one caught by automated tests.
|
| Something related to stat(2) is seriously broken somewhere. For instance,
| opening "/dev/bpf" and stat'ing it either fails or reports odd results.
|
| While I haven't done any analysis, it seems that this might be related to
| the old, closed, bugs:
|
| PR kern/37550: fstat(1) not reporting open descriptors properly
| PR kern/37878: fdclone(9) suspected of not working well with fstat(1)
|
| Given that those were fixed, it seems that this is again a regression.
|
| >How-To-Repeat:
|
| To add more weirdness, the following program prints a value 0 on 5.99.48,
| but the fstat(2) fails on 5.1.
It works as expected. /dev/bpf is a cloner, so you get a new instance each
time you run. The instance does not have a place in the filesystem, so you
get the "right" information as far as that is concerned.
$ ./a.out
dev=[23, 12761] # major 23 always
mode=0 # correct
ino=0 # correct
nlink=0 # correct
uid=0 # correct
gid=0 # correct
rdev=[0, 0] # irrelevant
a=[1301510133, 111864879] Wed Mar 30 14:35:33 2011 # correct times
m=[1301510133, 111864879] Wed Mar 30 14:35:33 2011 # correct times
c=[1301510133, 111864879] Wed Mar 30 14:35:33 2011 # correct times
birth=[1301510133, 111864879] Wed Mar 30 14:35:33 2011 # correct times
size=0 # correct
blocks=0 # correct
blksize=0 # correct
flags=0 # correct
gen=0 # correct
Now fchown on the fd does not work, so :-)
christos
----
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <fcntl.h>
#include <stdlib.h>
int
main(void)
{
struct stat st;
int fd, rv;
(void)memset(&st, 0, sizeof(struct stat));
fd = open("/dev/bpf", O_RDONLY);
if (fd < 0)
return EXIT_FAILURE;
rv = fstat(fd, &st);
(void)close(fd);
if (rv < 0)
return EXIT_FAILURE;
#define PR(t,f) printf(#f "=%ll" #t "\n", \
(long long)st.st_ ## f)
#define PRT(f) printf(#f "=[%llu, %llu] %s", \
(long long)st.st_ ## f ## timespec.tv_sec, \
(long long)st.st_ ## f ## timespec.tv_nsec, \
ctime(&st.st_ ## f ## timespec.tv_sec))
#define PRD(f) printf(#f "=[%llu, %llu]\n", \
(long long)major(st.st_ ## f), \
(long long)minor(st.st_ ## f))
PRD(dev);
PR(o,mode);
PR(d,ino);
PR(d,nlink);
PR(u,uid);
PR(u,gid);
PRD(rdev);
PRT(a);
PRT(m);
PRT(c);
PRT(birth);
PR(u,size);
PR(u,blocks);
PR(u,blksize);
PR(x,flags);
PR(u,gen);
return EXIT_SUCCESS;
}
Home |
Main Index |
Thread Index |
Old Index