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:44 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-hackers mailing list