diff --git a/res/res_pjsip_session.c b/res/res_pjsip_session.c
index 163c2b8681e0dd5b2f2bb08b724d86f5cc028260..b5874574e2bdf3e1d93d4e69fd951f1249fb2378 100644
--- a/res/res_pjsip_session.c
+++ b/res/res_pjsip_session.c
@@ -277,7 +277,11 @@ int ast_sip_session_is_pending_stream_default(const struct ast_sip_session *sess
 {
 	int index;
 
-	ast_assert(session->pending_media_state->topology != NULL);
+	if (!session->pending_media_state->topology) {
+		ast_log(LOG_WARNING, "Pending topology was NULL for channel '%s'\n",
+			session->channel ? ast_channel_name(session->channel) : "unknown");
+		return 0;
+	}
 
 	if (ast_stream_get_state(stream) == AST_STREAM_STATE_REMOVED) {
 		return 0;
@@ -767,6 +771,30 @@ static int handle_negotiated_sdp(struct ast_sip_session *session, const pjmedia_
 	struct ast_stream_topology *topology;
 	unsigned int changed = 0;
 
+	/* This situation can legitimately happen when an SDP is received in a
+	 * 183 Session Progress message.  In that case, everything's been done
+	 * by the time this function is called and there are no more pending
+	 * streams.
+	 */
+	if (!session->pending_media_state->topology) {
+		ast_debug(1, "Pending topology was NULL for channel '%s'\n",
+			session->channel ? ast_channel_name(session->channel) : "unknown");
+		return 0;
+	}
+
+	/* If we're handling negotiated streams, then we should already have set
+	 * up session media instances (and Asterisk streams) that correspond to
+	 * the local SDP, and there should be the same number of session medias
+	 * and streams as there are local SDP streams
+	 */
+	if (ast_stream_topology_get_count(session->pending_media_state->topology) != local->media_count
+		|| AST_VECTOR_SIZE(&session->pending_media_state->sessions) != local->media_count) {
+		ast_log(LOG_WARNING, "Local SDP for channel '%s' contains %d media streams while we expected it to contain %u\n",
+			session->channel ? ast_channel_name(session->channel) : "unknown",
+			ast_stream_topology_get_count(session->pending_media_state->topology), local->media_count);
+		return -1;
+	}
+
 	for (i = 0; i < local->media_count; ++i) {
 		struct ast_sip_session_media *session_media;
 		struct ast_stream *stream;
@@ -775,14 +803,6 @@ static int handle_negotiated_sdp(struct ast_sip_session *session, const pjmedia_
 			continue;
 		}
 
-		/* If we're handling negotiated streams, then we should already have set
-		 * up session media instances (and Asterisk streams) that correspond to
-		 * the local SDP, and there should be the same number of session medias
-		 * and streams as there are local SDP streams
-		 */
-		ast_assert(i < AST_VECTOR_SIZE(&session->pending_media_state->sessions));
-		ast_assert(i < ast_stream_topology_get_count(session->pending_media_state->topology));
-
 		session_media = AST_VECTOR_GET(&session->pending_media_state->sessions, i);
 		stream = ast_stream_topology_get_stream(session->pending_media_state->topology, i);
 
@@ -820,9 +840,6 @@ static int handle_negotiated_sdp(struct ast_sip_session *session, const pjmedia_
 			continue;
 		}
 
-		ast_assert(i < AST_VECTOR_SIZE(&session->pending_media_state->sessions));
-		ast_assert(i < ast_stream_topology_get_count(session->pending_media_state->topology));
-
 		session_media = AST_VECTOR_GET(&session->pending_media_state->sessions, i);
 		stream = ast_stream_topology_get_stream(session->pending_media_state->topology, i);