* Jason A. Donenfeld: > Hi Florian, > > On Wed, Nov 23, 2022 at 11:48:06AM +0100, Florian Weimer wrote: >> * Jason A. Donenfeld: >> >> > static void *vgetrandom_alloc(size_t *num, size_t *size_per_each, unsigned int flags) >> > { >> > unsigned long ret = syscall(__NR_vgetrandom_alloc, num, size_per_each, flags); >> > return ret > -4096UL ? NULL : (void *)ret; >> > } >> >> The traditional syscall function returns -1 on error and set errors, so >> using unsing long and the 4096 is quite misleading. > > Not sure I have any idea at all whatsoever about what you're talking > about. Firstly, the function you quoted is from the "sample userspace > code" in the commit message, so it might not be code for the context you > have in mind. I'm talking about the syscall function that is available through userspace via <sys/syscall.h>. > Secondly, it's just doing the thing to figure out if the return value is > an error value or a pointer. Were we in glibc, we'd write this as: > > return INTERNAL_SYSCALL_ERROR_P(r) ? NULL : (void *) r; > > Right? And if you look at the expansion of that glibc macro, it's just: > > #define INTERNAL_SYSCALL_ERROR_P(val) \ > ((unsigned long int) (val) > -4096UL) > > So it looks like the same exact thing? syscall already does internally (with a translation to -1, not NULL), so the caller shouldn't do it again. The userspace syscall function does *not* return an error code. Thanks, Florian