Handshake crashes while trying to work with cursor

I am using community edition 4.2.8 (installed via brew) and libmongoc 1.16.2 compiled on my OSX Catalina.

I have setup a DB, few collections and indexes using the mongo shell (no data added though).

Built my app following the tutorials/documentation for libmongoc and libbson.

I’m getting a crash while trying to use the cursor obtained for a find operation. The crash is similar to https://groups.google.com/g/mongodb-user/c/TqC185jDfAA/m/oxgko4PiDgAJ. However; I could not use the thread to solve my issue. The user having reported that seems to have some memory allocation issues, which I don’t see to be the case about my implementation.

This is the stack trace I see in Xcode.

|#0|0x00007fff68e78e52 in _platform_strlen ()|
|---|---|
|#1|0x00000001003cb97f in _mongoc_handshake_build_doc_with_application at /Users/reeteshranjan/dev/mongo-c-driver-1.16.2/src/libmongoc/src/mongoc/mongoc-handshake.c:525|
|#2|0x00000001003e6186 in _build_ismaster_with_handshake [inlined] at /Users/reeteshranjan/dev/mongo-c-driver-1.16.2/src/libmongoc/src/mongoc/mongoc-topology-scanner.c:125|
|#3|0x00000001003e613f in _mongoc_topology_scanner_get_ismaster at /Users/reeteshranjan/dev/mongo-c-driver-1.16.2/src/libmongoc/src/mongoc/mongoc-topology-scanner.c:156|
|#4|0x00000001003e6c7c in _begin_ismaster_cmd at /Users/reeteshranjan/dev/mongo-c-driver-1.16.2/src/libmongoc/src/mongoc/mongoc-topology-scanner.c:184|
|#5|0x00000001003e6bc2 in mongoc_topology_scanner_node_setup_tcp at /Users/reeteshranjan/dev/mongo-c-driver-1.16.2/src/libmongoc/src/mongoc/mongoc-topology-scanner.c:703|
|#6|0x00000001003e67b6 in mongoc_topology_scanner_node_setup at /Users/reeteshranjan/dev/mongo-c-driver-1.16.2/src/libmongoc/src/mongoc/mongoc-topology-scanner.c:823|
|#7|0x00000001003e710c in mongoc_topology_scanner_start at /Users/reeteshranjan/dev/mongo-c-driver-1.16.2/src/libmongoc/src/mongoc/mongoc-topology-scanner.c:947|
|#8|0x00000001003e2c01 in mongoc_topology_scan_once at /Users/reeteshranjan/dev/mongo-c-driver-1.16.2/src/libmongoc/src/mongoc/mongoc-topology.c:587|
|#9|0x00000001003e2f15 in _mongoc_topology_do_blocking_scan [inlined] at /Users/reeteshranjan/dev/mongo-c-driver-1.16.2/src/libmongoc/src/mongoc/mongoc-topology.c:621|
|#10|0x00000001003e2ef0 in mongoc_topology_select_server_id at /Users/reeteshranjan/dev/mongo-c-driver-1.16.2/src/libmongoc/src/mongoc/mongoc-topology.c:854|
|#11|0x00000001003b6465 in _mongoc_cluster_stream_for_optype at /Users/reeteshranjan/dev/mongo-c-driver-1.16.2/src/libmongoc/src/mongoc/mongoc-cluster.c:2282|
|#12|0x00000001003bfc1e in _mongoc_cursor_fetch_stream at /Users/reeteshranjan/dev/mongo-c-driver-1.16.2/src/libmongoc/src/mongoc/mongoc-cursor.c:662|
|#13|0x00000001003c2c1a in _prime at /Users/reeteshranjan/dev/mongo-c-driver-1.16.2/src/libmongoc/src/mongoc/mongoc-cursor-find.c:40|
|#14|0x00000001003c1038 in _call_transition [inlined] at /Users/reeteshranjan/dev/mongo-c-driver-1.16.2/src/libmongoc/src/mongoc/mongoc-cursor.c:1199|
|#15|0x00000001003c102b in mongoc_cursor_next at /Users/reeteshranjan/dev/mongo-c-driver-1.16.2/src/libmongoc/src/mongoc/mongoc-cursor.c:1275|

I got this trace log after compiling with tracing on:

2020/07/16 01:46:50.0873: [77295]:    TRACE:       mongoc: ENTRY: mongoc_topology_description_init():75
2020/07/16 01:46:50.0874: [77295]:    TRACE:       mongoc:  EXIT: mongoc_topology_description_init():94
2020/07/16 01:46:50.0874: [77295]:    TRACE:       mongoc: ENTRY: mongoc_server_description_init():115
2020/07/16 01:46:50.0874: [77295]:    TRACE:       mongoc:  EXIT: mongoc_server_description_init():139
2020/07/16 01:46:50.0874: [77295]:    TRACE:      cluster: ENTRY: mongoc_cluster_init():2147
2020/07/16 01:46:50.0874: [77295]:    TRACE:      cluster:  EXIT: mongoc_cluster_init():2174
2020/07/16 01:46:50.0874: [77295]:    TRACE:     database: ENTRY: _mongoc_database_new():66
2020/07/16 01:46:50.0874: [77295]:    TRACE:     database:  EXIT: _mongoc_database_new():82
2020/07/16 01:46:50.0874: [77295]:    TRACE:   collection: ENTRY: _mongoc_collection_new():172
2020/07/16 01:46:50.0874: [77295]:    TRACE:   collection:  EXIT: _mongoc_collection_new():197
2020/07/16 01:46:50.0874: [77295]:    TRACE:   collection: ENTRY: _mongoc_collection_new():172
2020/07/16 01:46:50.0880: [77295]:    TRACE:   collection:  EXIT: _mongoc_collection_new():197
2020/07/16 01:46:50.0880: [77295]:    TRACE:   collection: ENTRY: _mongoc_collection_new():172
2020/07/16 01:46:50.0880: [77295]:    TRACE:   collection:  EXIT: _mongoc_collection_new():197
2020/07/16 01:46:53.0744: [77295]:    TRACE:       cursor: ENTRY: _mongoc_cursor_new_with_opts():245
2020/07/16 01:46:53.0744: [77295]:    TRACE:       cursor:  EXIT: _mongoc_cursor_new_with_opts():388
2020/07/16 01:46:53.0744: [77295]:    TRACE:       cursor: ENTRY: mongoc_cursor_error():1139
2020/07/16 01:46:53.0744: [77295]:    TRACE:       cursor:  EXIT: mongoc_cursor_error():1141
2020/07/16 01:46:53.0744: [77295]:    TRACE:       cursor: ENTRY: mongoc_cursor_error_document():1150
2020/07/16 01:46:53.0744: [77295]:    TRACE:       cursor:  EXIT: mongoc_cursor_error_document():1172
2020/07/16 01:46:53.0744: [77295]:    TRACE:       cursor: ENTRY: mongoc_cursor_next():1213
2020/07/16 01:46:53.0744: [77295]:    TRACE:       cursor: TRACE: mongoc_cursor_next():1218 cursor_id(0)
2020/07/16 01:46:53.0744: [77295]:    TRACE:       cursor: ENTRY: _mongoc_cursor_fetch_stream():651
2020/07/16 01:46:53.0752: [77295]:    TRACE:      cluster: ENTRY: _mongoc_cluster_stream_for_optype():2278
2020/07/16 01:46:53.0752: [77295]:    TRACE: topology_scanner: ENTRY: mongoc_topology_scanner_node_setup_tcp():661

The attached screenshot shows the bad access reported by Xcode.

Has anyone seen this and knows what causes this?

Hi @Reetesh_Ranjan, the stack trace looks similar to the one reported here: https://jira.mongodb.org/browse/CDRIVER-3674

In that case, the application was calling mongoc_cleanup() before the application terminated. mongoc_cleanup cleans up global state and can only be called once. After it is called, it is invalid to call other C driver functions. Is it possible mongoc_cleanup() is getting called before your application terminates? Perhaps in a separate thread?

2 Likes