5

I was trying to understand how Linux system calls return error codes. I bumped into times() system call. This simple system call copies some data to user space and if that operation was not successful returns -EFAULT:

SYSCALL_DEFINE1(times, struct tms __user *, tbuf)
{
    if (tbuf) {
        struct tms tmp;

        do_sys_times(&tmp);
        if (copy_to_user(tbuf, &tmp, sizeof(struct tms)))
            return -EFAULT;
    }
    force_successful_syscall_return();
    return (long) jiffies_64_to_clock_t(get_jiffies_64());
}

My questions are:

  1. Why -EFAULT? Shouldn't it be EFAULT without minus?
  2. Is it a common to return negative error codes?
Sam Protsenko
  • 14,045
  • 4
  • 59
  • 75
Aidin.T
  • 731
  • 3
  • 10
  • 25

1 Answers1

5

From man 2 syscalls:

Note: system calls indicate a failure by returning a negative error number to the caller; when this happens, the wrapper function negates the returned error number (to make it positive), copies it to errno, and returns -1 to the caller of the wrapper.

See also next answers:

Community
  • 1
  • 1
Sam Protsenko
  • 14,045
  • 4
  • 59
  • 75