mirror of
https://gitlab.uni-freiburg.de/opensourcevdi/spice
synced 2026-08-07 01:27:12 +00:00
red-stream: Handle properly endianness in SASL code
All SPICE protocol is little endian, there's no agreement on other endian and currently we support only little endian so make sure this will work even possibly running on a big endian machine. Signed-off-by: Frediano Ziglio <fziglio@redhat.com> Acked-by: Christophe Fergeau <cfergeau@redhat.com>
This commit is contained in:
parent
5c438510cd
commit
5c516a6e42
@ -580,8 +580,9 @@ static bool red_stream_write_u8(RedStream *s, uint8_t n)
|
||||
return red_stream_write_all(s, &n, sizeof(uint8_t));
|
||||
}
|
||||
|
||||
static bool red_stream_write_u32(RedStream *s, uint32_t n)
|
||||
static bool red_stream_write_u32_le(RedStream *s, uint32_t n)
|
||||
{
|
||||
n = GUINT32_TO_LE(n);
|
||||
return red_stream_write_all(s, &n, sizeof(uint32_t));
|
||||
}
|
||||
|
||||
@ -822,10 +823,10 @@ static void red_sasl_handle_auth_step(void *opaque)
|
||||
|
||||
if (serveroutlen) {
|
||||
serveroutlen += 1;
|
||||
red_stream_write_all(stream, &serveroutlen, sizeof(uint32_t));
|
||||
red_stream_write_u32_le(stream, serveroutlen);
|
||||
red_stream_write_all(stream, serverout, serveroutlen);
|
||||
} else {
|
||||
red_stream_write_all(stream, &serveroutlen, sizeof(uint32_t));
|
||||
red_stream_write_u32_le(stream, serveroutlen);
|
||||
}
|
||||
|
||||
/* Whether auth is complete */
|
||||
@ -846,7 +847,7 @@ static void red_sasl_handle_auth_step(void *opaque)
|
||||
}
|
||||
|
||||
spice_debug("Authentication successful");
|
||||
red_stream_write_u32(stream, SPICE_LINK_ERR_OK); /* Accept auth */
|
||||
red_stream_write_u32_le(stream, SPICE_LINK_ERR_OK); /* Accept auth */
|
||||
|
||||
/*
|
||||
* Delay writing in SSF encoded until now
|
||||
@ -858,8 +859,8 @@ static void red_sasl_handle_auth_step(void *opaque)
|
||||
}
|
||||
|
||||
authreject:
|
||||
red_stream_write_u32(stream, 1); /* Reject auth */
|
||||
red_stream_write_u32(stream, sizeof("Authentication failed"));
|
||||
red_stream_write_u32_le(stream, 1); /* Reject auth */
|
||||
red_stream_write_u32_le(stream, sizeof("Authentication failed"));
|
||||
red_stream_write_all(stream, "Authentication failed", sizeof("Authentication failed"));
|
||||
|
||||
red_sasl_async_result(opaque, RED_SASL_ERROR_AUTH_FAILED);
|
||||
@ -870,6 +871,7 @@ static void red_sasl_handle_auth_steplen(void *opaque)
|
||||
RedStream *stream = ((RedSASLAuth *)opaque)->stream;
|
||||
RedSASL *sasl = &stream->priv->sasl;
|
||||
|
||||
sasl->len = GUINT32_FROM_LE(sasl->len);
|
||||
spice_debug("Got steplen %d", sasl->len);
|
||||
if (sasl->len > SASL_DATA_MAX_LEN) {
|
||||
spice_warning("Too much SASL data %d", sasl->len);
|
||||
@ -942,10 +944,10 @@ static void red_sasl_handle_auth_start(void *opaque)
|
||||
|
||||
if (serveroutlen) {
|
||||
serveroutlen += 1;
|
||||
red_stream_write_all(stream, &serveroutlen, sizeof(uint32_t));
|
||||
red_stream_write_u32_le(stream, serveroutlen);
|
||||
red_stream_write_all(stream, serverout, serveroutlen);
|
||||
} else {
|
||||
red_stream_write_all(stream, &serveroutlen, sizeof(uint32_t));
|
||||
red_stream_write_u32_le(stream, serveroutlen);
|
||||
}
|
||||
|
||||
/* Whether auth is complete */
|
||||
@ -966,7 +968,7 @@ static void red_sasl_handle_auth_start(void *opaque)
|
||||
}
|
||||
|
||||
spice_debug("Authentication successful");
|
||||
red_stream_write_u32(stream, SPICE_LINK_ERR_OK); /* Accept auth */
|
||||
red_stream_write_u32_le(stream, SPICE_LINK_ERR_OK); /* Accept auth */
|
||||
|
||||
/*
|
||||
* Delay writing in SSF encoded until now
|
||||
@ -978,8 +980,8 @@ static void red_sasl_handle_auth_start(void *opaque)
|
||||
}
|
||||
|
||||
authreject:
|
||||
red_stream_write_u32(stream, 1); /* Reject auth */
|
||||
red_stream_write_u32(stream, sizeof("Authentication failed"));
|
||||
red_stream_write_u32_le(stream, 1); /* Reject auth */
|
||||
red_stream_write_u32_le(stream, sizeof("Authentication failed"));
|
||||
red_stream_write_all(stream, "Authentication failed", sizeof("Authentication failed"));
|
||||
|
||||
red_sasl_async_result(opaque, RED_SASL_ERROR_AUTH_FAILED);
|
||||
@ -990,6 +992,7 @@ static void red_sasl_handle_auth_startlen(void *opaque)
|
||||
RedStream *stream = ((RedSASLAuth *)opaque)->stream;
|
||||
RedSASL *sasl = &stream->priv->sasl;
|
||||
|
||||
sasl->len = GUINT32_FROM_LE(sasl->len);
|
||||
spice_debug("Got client start len %d", sasl->len);
|
||||
if (sasl->len > SASL_DATA_MAX_LEN) {
|
||||
spice_warning("Too much SASL data %d", sasl->len);
|
||||
@ -1032,6 +1035,7 @@ static void red_sasl_handle_auth_mechlen(void *opaque)
|
||||
RedStream *stream = ((RedSASLAuth *)opaque)->stream;
|
||||
RedSASL *sasl = &stream->priv->sasl;
|
||||
|
||||
sasl->len = GUINT32_FROM_LE(sasl->len);
|
||||
if (sasl->len < 1 || sasl->len > SASL_MAX_MECHNAME_LEN) {
|
||||
spice_warning("Got bad client mechname len %d", sasl->len);
|
||||
return red_sasl_async_result(opaque, RED_SASL_ERROR_GENERIC);
|
||||
@ -1141,7 +1145,7 @@ bool red_sasl_start_auth(RedStream *stream, RedSaslResult result_cb, void *resul
|
||||
sasl->mechlist = g_strdup(mechlist);
|
||||
|
||||
mechlistlen = strlen(mechlist);
|
||||
if (!red_stream_write_all(stream, &mechlistlen, sizeof(uint32_t))
|
||||
if (!red_stream_write_u32_le(stream, mechlistlen)
|
||||
|| !red_stream_write_all(stream, sasl->mechlist, mechlistlen)) {
|
||||
spice_warning("SASL mechanisms write error");
|
||||
goto error;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user