Gala Gala - 1 year ago 133
Linux Question

ioctl() call resets file descriptor to 0

Consider the following code:

file_fd = open(device, O_RDWR);

if (file_fd < 0) {
perror("open");
return -1;
}

printf("File descriptor: %d\n", file_fd);

uint32_t DskSize;

if (ioctl(file_fd, BLKGETSIZE, &DskSize) < 0) {
perror("ioctl");
return -1;
}

printf("File descriptor after: %d\n", file_fd);


This snippet yields this:

File descriptor: 3
File descriptor after: 0


Why does my file descriptor get reset to 0? The program writes the stuff out to
stdout
instead of my block device.

This should not happen. I expect my
file_fd
to be non-zero and retain its value.

Answer Source

Looks like you smash your stack.

Since there are only two stack variables file_fd and DskSize and changing DskSize changes file_fd suggests that DiskSize must be unsigned long or size_t (a 64-bit value), not uint32_t.

Looking at BLKGETSIZE implementation confirms that the value type is unsigned long.

You may like to run your applications under valgrind, it reports this kind of errors.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download