Segmentation error from a function that is not called at all

Well, that really excites me. I have the following function that just reads the input and returns a string

unsigned char* readFromIn() { unsigned char* text = malloc(1024); if (fgets(text, 1024, stdin) != NULL) { <--This is what causing segmentation fault int textLen = strlen(text); if (textLen > 0 && text[textLen - 1] == '\n') text[textLen - 1] = '\0'; // getting rid of newline character return text; } else { free(text); return NULL; } } 

The fact is that this function is not called anywhere and just for confirmation, I changed the name of the function to something crazy like 9rawiohawr90awrhiokawrioawr and put the printf statement at the top of the function.

I'm really not sure why an unconfirmed function can cause a segmentation error.

I am using gcc 4.6.3 on ubuntu.

Edit: I know the string

 if (fgets(text, 1024, stdin) != NULL) { 

is violating the code because, as soon as I comment on this conditional, segmentation errors do not occur.

I know that the NOT function is called because I do not see the output from the debug printf statement that I put.

Edit2: I tried changing the type from unsigned char to char. Another segmentation error. I will try to get gdb output.

Edit3: backdrace gdb created the following

 #0 0xb7fa5ac2 in _IO_2_1_stdin_ () from /lib/i386-linux-gnu/libc.so.6 #1 0xb7faf2fb in libwebsocket_create_context (info=0xbffff280) at libwebsockets.c:2125 #2 0x0804a5bb in main() 

The execution of the frame 0,1,2 does not display anything interesting in particular.

Edit4: I tried all the sentences in the comment, but to no avail, I still get the same segmentation error.

So, I installed a new copy of Ubuntu on the virtual OS and recompiled my code. However, the same problem occurs. It seems to me that the problem is that there is some kind of ambiguity in my code or in the library itself. I created a minimal example demonstrating the problem:

 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <libwebsockets.h> unsigned char* readFromIn() { unsigned char* text = malloc(1024); if (fgets(text, 1024, stdin) != NULL) { <--SEGMENTATION FAULT HERE int textLen = strlen(text); if (textLen > 0 && text[textLen - 1] == '\n') text[textLen - 1] = '\0'; return text; } else { free(text); return NULL; } } int callback_http(struct libwebsocket_context *context, struct libwebsocket *wsi, enum libwebsocket_callback_reasons reason, void *user, void *in, size_t len) { return 0; } static struct libwebsocket_protocols protocols[] = { /* first protocol must always be HTTP handler */ { "http-only", // name callback_http, // callback 0 // per_session_data_size } }; int main(void) { printf("Initializing Web Server\n"); // server url will be http://localhost:8081 int port = 8081; const char *interface = NULL; struct libwebsocket_context *context; // we're not using ssl const char *cert_path = NULL; const char *key_path = NULL; // no special options int opts = 0; struct lws_context_creation_info info; memset(&info, 0, sizeof info); info.port = port; info.iface = interface; info.protocols = protocols; info.extensions = libwebsocket_get_internal_extensions(); info.ssl_cert_filepath = NULL; info.ssl_private_key_filepath = NULL; info.gid = -1; info.uid = -1; info.options = opts; context = libwebsocket_create_context(&info); if (context == NULL) { fprintf(stderr, "libwebsocket init failed\n"); return 0; } printf("starting server...\n"); while (1) { libwebsocket_service(context, 50); } printf("Shutting server down...\n"); libwebsocket_context_destroy(context); return 0; } 

And this is how I compiled my code

 gcc -g testbug.c -o test -lwebsockets 

Here is the library that I use

http://git.libwebsockets.org/cgi-bin/cgit/libwebsockets/tag/?id=v1.23-chrome32-firefox24

You will see that I do not call the readFromIn () function, but a segmentation error occurs as soon as you try to run the executable.

I restarted gdb and this time backtrace and frames tell me a bit more information.

 (gdb) run Starting program: /home/l46kok/Desktop/websocketserver/test Initializing Web Server [1384002761:2270] NOTICE: Initial logging level 7 [1384002761:2270] NOTICE: Library version: 1.3 unknown-build-hash [1384002761:2271] NOTICE: Started with daemon pid 0 [1384002761:2271] NOTICE: static allocation: 4448 + (12 x 1024 fds) = 16736 bytes [1384002761:2271] NOTICE: canonical_hostname = ubuntu [1384002761:2271] NOTICE: Compiled with OpenSSL support [1384002761:2271] NOTICE: Using non-SSL mode [1384002761:2271] NOTICE: per-conn mem: 124 + 1360 headers + protocol rx buf [1384002761:2294] NOTICE: Listening on port 8081 Program received signal SIGSEGV, Segmentation fault. 0xb7fb1ac0 in _IO_2_1_stdin_ () from /lib/i386-linux-gnu/libc.so.6 (gdb) backtrace #0 0xb7fb1ac0 in _IO_2_1_stdin_ () from /lib/i386-linux-gnu/libc.so.6 #1 0xb7fcc2c6 in libwebsocket_create_context () from /usr/local/lib/libwebsockets.so.4.0.0 #2 0x080488c4 in main () at testbug.c:483 (gdb) frame 1 #1 0xb7fcc2c6 in libwebsocket_create_context () from /usr/local/lib/libwebsockets.so.4.0.0 (gdb) frame 2 #2 0x080488c4 in main () at testbug.c:483 483 context = libwebsocket_create_context(&info); 

So yes .. I think I gave all the information at hand. But I'm really not sure what the problem is. The program causes a segmentation error on line 483, but the problem disappeared when I comment on the calling function that is not being called.

+6
source share
1 answer

You are probably missing something when initializing libwebsockets.

Indeed, recompiling libwebsockets using debug shows that:

 GNU gdb (GDB) 7.6.1 (Debian 7.6.1-1) Copyright (C) 2013 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-linux-gnu". For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>... Reading symbols from /home/vili/x...done. (gdb) r Starting program: /home/vili/./x warning: Could not load shared library symbols for linux-vdso.so.1. Do you need "set solib-search-path" or "set sysroot"? Initializing Web Server [1384020141:5692] NOTICE: Initial logging level 7 [1384020141:5692] NOTICE: Library version: 1.2 [1384020141:5693] NOTICE: Started with daemon pid 0 [1384020141:5693] NOTICE: static allocation: 5512 + (16 x 1024 fds) = 21896 bytes [1384020141:5693] NOTICE: canonical_hostname = x220 [1384020141:5693] NOTICE: Compiled with OpenSSL support [1384020141:5693] NOTICE: Using non-SSL mode [1384020141:5693] NOTICE: per-conn mem: 248 + 1328 headers + protocol rx buf [1384020141:5713] NOTICE: Listening on port 8081 Program received signal SIGSEGV, Segmentation fault. 0x00007ffff7bc2080 in _IO_2_1_stderr_ () from /lib/x86_64-linux-gnu/libc.so.6 (gdb) bt #0 0x00007ffff7bc2080 in _IO_2_1_stderr_ () from /lib/x86_64-linux-gnu/libc.so.6 #1 0x00007ffff7bcd83c in libwebsocket_create_context (info=0x7fffffffe580) at libwebsockets.c:2093 #2 0x0000000000400918 in main () at xc:66 (gdb) up #1 0x00007ffff7bcd83c in libwebsocket_create_context (info=0x7fffffffe580) at libwebsockets.c:2093 2093 info->protocols[context->count_protocols].callback(context, (gdb) p context->count_protocols $1 = 1 (gdb) p info->protocols[1] $2 = { name = 0x7ffff7bc2240 <_IO_2_1_stdin_> "\210 \255", <incomplete sequence \373>, callback = 0x7ffff7bc2080 <_IO_2_1_stderr_>, per_session_data_size = 140737349689696, rx_buffer_size = 0, owning_server = 0x602010, protocol_index = 1} (gdb) 

Most likely, you need to close the libwebsocket_protocols array with a special entry (NULL) so that lib knows how many records it received through info-> protocols.

Edit: yep, check docs: http://jsk.pp.ua/knowledge/libwebsocket.html

An array of structures containing supported protocols and a callback for each specific protocol. The list ends with an entry that has a NULL callback pointer.

+10
source

Source: https://habr.com/ru/post/957564/


All Articles