Skip to content

Commit 2951c6c

Browse files
committed
Fix SChannel pointer mismatches and SCRAM fallback
* Fix `tls_schannel.c` passing `tls_t*` instead of `struct conn_interface*` * Prevent "Memory allocation error" in `auth.c` by gracefully falling back * Query if tls backend supports channel binding before indicating support
1 parent 8992211 commit 2951c6c

2 files changed

Lines changed: 19 additions & 8 deletions

File tree

src/auth.c

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -602,8 +602,17 @@ static int _make_scram_init_msg(struct scram_user_data *scram)
602602
l = strophe_snprintf(message, message_len, "p=%s,,n=%s,r=%s",
603603
binding_type, node, buf);
604604
} else {
605+
char cb_flag = 'n';
606+
const char *dummy_type;
607+
size_t dummy_len;
608+
609+
/* determine if channel binding is supported before advertising it */
610+
if (is_secured && tls_init_channel_binding(conn->tls, &dummy_type, &dummy_len) == 0) {
611+
cb_flag = 'y';
612+
}
613+
605614
l = strophe_snprintf(message, message_len, "%c,,n=%s,r=%s",
606-
is_secured ? 'y' : 'n', node, buf);
615+
cb_flag, node, buf);
607616
}
608617
if (l < 0 || (size_t)l >= message_len) {
609618
goto err_msg;
@@ -820,9 +829,11 @@ static void _auth(xmpp_conn_t *conn)
820829
scram_ctx->sasl_plus =
821830
scram_ctx->alg->mask & SASL_MASK_SCRAM_PLUS ? 1 : 0;
822831
if (_make_scram_init_msg(scram_ctx)) {
832+
/* Gracefully drop the unsupported mechanism and try the next */
833+
conn->sasl_support &= ~scram_ctx->alg->mask;
823834
strophe_free(conn->ctx, scram_ctx);
824835
xmpp_stanza_release(auth);
825-
disconnect_mem_error(conn);
836+
_auth(conn);
826837
return;
827838
}
828839

src/tls_schannel.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -479,7 +479,7 @@ int tls_read(struct conn_interface *intf, void *buff, size_t len)
479479
int read;
480480
tls->readybufferpos += bytes;
481481
newbuff += bytes;
482-
read = tls_read(tls, newbuff, len - bytes);
482+
read = tls_read(intf, newbuff, len - bytes);
483483

484484
if (read == -1) {
485485
if (tls_is_recoverable(intf, tls->lasterror)) {
@@ -553,7 +553,7 @@ int tls_read(struct conn_interface *intf, void *buff, size_t len)
553553
tls->recvbufferpos = 0;
554554
}
555555

556-
return tls_read(tls, buff, len);
556+
return tls_read(intf, buff, len);
557557
} else if (ret == SEC_E_INCOMPLETE_MESSAGE) {
558558
tls->lasterror = SEC_E_INCOMPLETE_MESSAGE;
559559
return -1;
@@ -611,7 +611,7 @@ int tls_write(struct conn_interface *intf, const void *buff, size_t len)
611611
int sent = 0, ret, remain = len;
612612
tls_t *tls = intf->conn->tls;
613613

614-
ret = tls_clear_pending_write(tls);
614+
ret = tls_clear_pending_write(intf);
615615
if (ret <= 0) {
616616
return ret;
617617
}
@@ -667,9 +667,9 @@ int tls_write(struct conn_interface *intf, const void *buff, size_t len)
667667

668668
tls->sendbufferpos = 0;
669669

670-
ret = tls_clear_pending_write(tls);
670+
ret = tls_clear_pending_write(intf);
671671

672-
if (ret == -1 && !tls_is_recoverable(intf, tls_error(tls))) {
672+
if (ret == -1 && !tls_is_recoverable(intf, tls_error(intf))) {
673673
return -1;
674674
}
675675

@@ -682,7 +682,7 @@ int tls_write(struct conn_interface *intf, const void *buff, size_t len)
682682
}
683683

684684
if (ret == 0 ||
685-
(ret == -1 && tls_is_recoverable(intf, tls_error(tls)))) {
685+
(ret == -1 && tls_is_recoverable(intf, tls_error(intf)))) {
686686
return sent;
687687
}
688688
}

0 commit comments

Comments
 (0)