Skip to content
Advertisement

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: %dn", file_fd);

uint32_t DskSize;

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

printf("File descriptor after: %dn", 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.

Advertisement

Answer

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.

Advertisement