Confused by segfault with legitimate call to strerror(3) on
amd64 / sysctl(3) setting `odd' errno's
Jacques Fourie
jacques.fourie at gmail.com
Fri Jan 16 01:15:36 PST 2009
On Fri, Jan 16, 2009 at 10:44 AM, Garrett Cooper <yanefbsd at gmail.com> wrote:
> On Fri, Jan 16, 2009 at 12:41 AM, Garrett Cooper <yanefbsd at gmail.com> wrote:
>> Hi amd64 and Hackers,
>> Uh, I'm really confused why 1) this error (errno => ENOMEM) would
>> occur when I have more than enough free memory (both on x86 and amd64)
>> and 2) why strerror would segfault in the call to errx in the attached
>> sourcefile on amd64 only. Not initializing len causes the second
>> output sample (errno => 14, which is EFAULT).
>> Any ideas?
>> Please CC me if mailing on amd64@ as I'm not subscribed to the list.
>> Thanks,
>> -Garrett
>>
>> /* Program */
>> #include <err.h>
>> #include <errno.h>
>> #include <stdio.h>
>> #include <sys/types.h>
>> #include <sys/sysctl.h>
>>
>> int
>> main() {
>>
>> int mib[4];
>>
>> size_t len;
>>
>> if (sysctlnametomib("kern.ipc.shmmax", mib, &len) != 0) {
>> printf("Errno: %d\n", errno);
>> errx(errno, "Error: %s", strerror(errno));
>> }
>>
>> printf("%lu\n", len);
>>
>> return 0;
>>
>> }
>>
>> # output for len preset to 0:
>> [gcooper at optimus ~]$ ./test2
>> Errno: 12
>> test2: Segmentation fault: 11 (core dumped)
>> [gcooper at optimus ~]$ uname -a
>> FreeBSD optimus.gateway.2wire.net 8.0-CURRENT FreeBSD 8.0-CURRENT #4:
>> Sun Jan 11 12:30:31 PST 2009
>> root at optimus.gateway.2wire.net:/usr/obj/usr/src/sys/OPTIMUS amd64
>>
>> [gcooper at orangebox /usr/home/gcooper]$ ./test
>> Errno: 12
>> test: Error: Cannot allocate memory
>> [gcooper at orangebox /usr/home/gcooper]$ uname -a
>> FreeBSD orangebox.gateway.2wire.net 8.0-CURRENT FreeBSD 8.0-CURRENT
>> #4: Sat Jan 3 22:54:52 PST 2009
>> gcooper at orangebox.gateway.2wire.net:/usr/obj/usr/src/sys/ORANGEBOX
>> i386
>>
>> # output for len not preset to 0:
>> [gcooper at optimus ~]$ ./test2
>> Errno: 14
>> test2: Segmentation fault: 11 (core dumped)
>
> Almost forgot -- here are the actual values reported by sysctl(1),
> just for reference:
>
> [gcooper at optimus ~]$ sysctl kern.ipc.shmall kern.ipc.shmmin kern.ipc.shmmax
> kern.ipc.shmall: 8192
> kern.ipc.shmmin: 1
> kern.ipc.shmmax: 33554432
>
> [gcooper at orangebox /usr/src/sys]$ sysctl kern.ipc.shmall
> kern.ipc.shmmin kern.ipc.shmmax
> kern.ipc.shmall: 8192
> kern.ipc.shmmin: 1
> kern.ipc.shmmax: 33554432
>
> Thanks,
> -Garrett
> _______________________________________________
> freebsd-hackers at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
> To unsubscribe, send any mail to "freebsd-hackers-unsubscribe at freebsd.org"
>
You need to initialize len to the number of entries in the mib array.
Try adding 'len = 4' before calling sysctlnametomib() and see if your
issues go away.
More information about the freebsd-amd64
mailing list