Reputation: 18127
I am trying to use pjsip library to decode the following SIP
byte stream but I am getting segmentation fault. What's wrong with my code?
#include <pjsip.h>
int main()
{
char __MSG[] = {
0x49, 0x4e, 0x56, 0x49, 0x54, 0x45, 0x20, 0x73, 0x69, 0x70,
0x3a, 0x40, 0x31, 0x32, 0x37, 0x2e, 0x30, 0x2e, 0x30, 0x2e,
0x31, 0x20, 0x53, 0x49, 0x50, 0x2f, 0x32, 0x2e, 0x30, 0x0d,
0x0a, 0x54, 0x6f, 0x3a, 0x20, 0x3c, 0x73, 0x69, 0x70, 0x3a,
0x31, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x2e, 0x34, 0x35, 0x3e,
0x0d, 0x0a, 0x56, 0x69, 0x61, 0x3a, 0x20, 0x53, 0x49, 0x50,
0x2f, 0x32, 0x2e, 0x30, 0x2f, 0x55, 0x44, 0x50, 0x20, 0x31,
0x30, 0x2e, 0x30, 0x2e, 0x31, 0x2e, 0x34, 0x35, 0x0d, 0x0a,
0x46, 0x72, 0x6f, 0x6d, 0x3a, 0x20, 0x22, 0x74, 0x65, 0x73,
0x74, 0x74, 0x65, 0x73, 0x74, 0x22, 0x3c, 0x73, 0x69, 0x70,
0x3a, 0x31, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x2e, 0x31, 0x39,
0x39, 0x3e, 0x0d, 0x0a, 0x43, 0x61, 0x6c, 0x6c, 0x2d, 0x49,
0x44, 0x3a, 0x20, 0x31, 0x34, 0x38, 0x31, 0x30, 0x2e, 0x30,
0x2e, 0x31, 0x2e, 0x34, 0x35, 0x0d, 0x0a, 0x43, 0x53, 0x65,
0x71, 0x3a, 0x20, 0x31, 0x20, 0x49, 0x4e, 0x56, 0x49, 0x54,
0x45, 0x0d, 0x0a, 0x4d, 0x61, 0x78, 0x2d, 0x46, 0x6f, 0x72,
0x77, 0x61, 0x72, 0x64, 0x73, 0x3a, 0x20, 0x32, 0x30, 0x0d,
0x0a, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x3a, 0x20,
0x3c, 0x73, 0x69, 0x70, 0x3a, 0x31, 0x32, 0x37, 0x2e, 0x30,
0x2e, 0x30, 0x2e, 0x31, 0x3e, 0x0d, 0x0a, 0x0d, 0x0a, NULL
};
char *testmsg = __MSG;
pj_size_t msgsize;
pj_status_t status;
// INIT
status = pj_init();
PJ_ASSERT_RETURN(status == PJ_SUCCESS, 1);
status = pjlib_util_init();
PJ_ASSERT_RETURN(status == PJ_SUCCESS, 1);
// PARSING
pj_caching_pool cp;
pj_caching_pool_init(&cp, NULL, 1024*1024);
pj_pool_t *pool = pj_pool_create(&cp.factory, "parser_pool", 4000, 4000, NULL);
pjsip_parser_err_report err;
int len = strlen(testmsg);
pjsip_msg *msg = pjsip_parse_msg(pool, __MSG, len, &err);
printf("The end...");
return 0;
}
Program terminated with signal 11, Segmentation fault.
#0 0x0805befb in pj_scan_peek () (gdb) bt
#0 0x0805befb in pj_scan_peek ()
#1 0x080507f6 in int_parse_msg ()
#2 0x080523a2 in pjsip_parse_msg ()
#3 0x0804fa89 in main () (gdb)
Upvotes: 5
Views: 1149
Reputation: 7738
You need to use a SIP Endpoint instance. From the doc:
SIP Endpoint instance (pjsip_endpoint) can be viewed as the master/owner of all SIP objects in an application. It performs the following roles:
- it manages the allocation/deallocation of memory pools for all objects.
- it manages listeners and transports, and how they are used by transactions.
- it receives incoming messages from transport layer and automatically dispatches them to the correct transaction (or create a new one).
- it has a single instance of timer management (timer heap).
- it manages modules, which is the primary means of extending the library.
- it provides single polling function for all objects and distributes events.
- it automatically handles incoming requests which can not be handled by existing modules (such as when incoming request has unsupported method).
- and so on..
Application should only instantiate one SIP endpoint instance for every process.
You'll need to call pjsip_endpt_create to create an endpoint.
Take a look at Stateless SIP Endpoint sample to get a feel for the general structure of the library calls that need to be made for initializing and setting up an endpoint.
Other items of note:
I believe it should look something like this (but have not tested this):
// INIT
status = pj_init();
PJ_ASSERT_RETURN(status == PJ_SUCCESS, 1);
status = pjlib_util_init();
PJ_ASSERT_RETURN(status == PJ_SUCCESS, 1);
// Create pool factory (for memory allocations)
pj_caching_pool cp;
pj_caching_pool_init(&cp, &pj_pool_factory_default_policy, 1024*1024);
// Create global endpoint
static pjsip_endpoint *sip_endpt;
status = pjsip_endpt_create(&cp.factory, "uniquesipendpointname", &sip_endpt);
PJ_ASSERT_RETURN(status == PJ_SUCCESS, 1);
// PARSING
pj_pool_t *pool = pj_pool_create(&cp.factory, "parser_pool", 4000, 4000, NULL);
pjsip_parser_err_report err;
int len = strlen(testmsg);
pj_list_init(&err);
pjsip_msg *msg = pjsip_parse_msg(pool, __MSG, len, &err);
Upvotes: 1