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 00:57:50 PST 2009


On Fri, Jan 16, 2009 at 10:47 AM, Jacques Fourie
<jacques.fourie at gmail.com> wrote:
> 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.
>

Sorry, I only scanned through the code without reading the whole
message before replying :) Please ignore...


More information about the freebsd-hackers mailing list