Skip to content

Commit 45ccd2d

Browse files
authored
Merge pull request neutrinolabs#3509 from matt335672/devel_sps_investigations
Refactor static channel name handling
2 parents 44acc46 + 554515e commit 45ccd2d

File tree

7 files changed

+27
-32
lines changed

7 files changed

+27
-32
lines changed

libxrdp/libxrdp.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1297,7 +1297,7 @@ libxrdp_query_channel(struct xrdp_session *session, int channel_id,
12971297

12981298
if (channel_name != 0)
12991299
{
1300-
g_strncpy(channel_name, channel_item->name, 8);
1300+
strlcpy(channel_name, channel_item->name, CHANNEL_NAME_LEN + 1);
13011301
LOG(LOG_LEVEL_DEBUG, "libxrdp_query_channel - Channel %d name %s",
13021302
channel_id, channel_name);
13031303
}

libxrdp/libxrdp.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ struct xrdp_iso
5050
/* used in mcs */
5151
struct mcs_channel_item
5252
{
53-
char name[16];
53+
char name[CHANNEL_NAME_LEN + 1];
5454
int flags;
5555
int chanid;
5656
int disabled;

libxrdp/xrdp_sec.c

Lines changed: 11 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1924,31 +1924,19 @@ xrdp_sec_process_mcs_data_channels(struct xrdp_sec *self, struct stream *s)
19241924
g_free(channel_item);
19251925
return 1;
19261926
}
1927-
in_uint8a(s, channel_item->name, 8);
1927+
1928+
in_uint8a(s, channel_item->name, CHANNEL_NAME_LEN + 1);
1929+
// The channel name *should* be null-terminated. Add a back-stop
1930+
// terminator in case it isn't.
1931+
channel_item->name[CHANNEL_NAME_LEN] = '\0';
19281932
in_uint32_le(s, channel_item->flags);
19291933

1930-
if (g_strlen(channel_item->name) > 0 && g_strlen(channel_item->name) < 8)
1931-
{
1932-
LOG_DEVEL(LOG_LEVEL_TRACE, "Received [MS-RDPBCGR] "
1933-
"TS_UD_CS_NET.CHANNEL_DEF %d, name %s, options 0x%8.8x",
1934-
index, channel_item->name, channel_item->flags);
1935-
channel_item->chanid = next_mcs_channel_id++;
1936-
list_add_item(self->mcs_layer->channel_list,
1937-
(intptr_t) channel_item);
1938-
LOG(LOG_LEVEL_DEBUG,
1939-
"Adding channel: name %s, channel id %d, flags 0x%8.8x",
1940-
channel_item->name, channel_item->chanid, channel_item->flags);
1941-
}
1942-
else
1943-
{
1944-
LOG_DEVEL(LOG_LEVEL_WARNING, "Received [MS-RDPBCGR] "
1945-
"TS_UD_CS_NET.CHANNEL_DEF %d, skipped because of "
1946-
"malformed channel name.", index);
1947-
LOG_DEVEL_HEXDUMP(LOG_LEVEL_WARNING,
1948-
"[MS-RDPBCGR] TS_UD_CS_NET.CHANNEL_DEF name",
1949-
channel_item->name, 8);
1950-
g_free(channel_item);
1951-
}
1934+
channel_item->chanid = next_mcs_channel_id++;
1935+
list_add_item(self->mcs_layer->channel_list,
1936+
(intptr_t) channel_item);
1937+
LOG(LOG_LEVEL_DEBUG,
1938+
"Adding channel: name %s, channel id %d, flags 0x%8.8x",
1939+
channel_item->name, channel_item->chanid, channel_item->flags);
19521940
}
19531941

19541942
/* Set the user channel as well */

neutrinordp/xrdp-neutrinordp.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1800,7 +1800,7 @@ lfreerdp_pre_connect(freerdp *instance)
18001800
int num_chans;
18011801
int target_chan;
18021802
int ch_flags;
1803-
char ch_name[256];
1803+
char ch_name[CHANNEL_NAME_LEN + 1];
18041804
const char *ch_names[MAX_FREERDP_CHANNELS];
18051805
char *dst_ch_name;
18061806

sesman/chansrv/chansrv.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -371,7 +371,7 @@ process_message_channel_setup(struct stream *s)
371371
{
372372
ci = &(g_chan_items[g_num_chan_items]);
373373
g_memset(ci->name, 0, sizeof(ci->name));
374-
in_uint8a(s, ci->name, 8);
374+
in_uint8a(s, ci->name, CHANNEL_NAME_LEN + 1);
375375
in_uint16_le(s, ci->id);
376376
in_uint16_le(s, ci->flags);
377377
LOG_DEVEL(LOG_LEVEL_DEBUG, "process_message_channel_setup: chan name '%s' "

xrdp/xrdp_mm.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -634,9 +634,7 @@ xrdp_mm_trans_send_channel_setup(struct xrdp_mm *self, struct trans *trans)
634634
int chan_flags;
635635
int size;
636636
struct stream *s;
637-
char chan_name[256];
638-
639-
g_memset(chan_name, 0, sizeof(char) * 256);
637+
char chan_name[CHANNEL_NAME_LEN + 1];
640638

641639
s = trans_get_out_s(trans, 8192);
642640

@@ -656,7 +654,7 @@ xrdp_mm_trans_send_channel_setup(struct xrdp_mm *self, struct trans *trans)
656654
if (libxrdp_query_channel(self->wm->session, chan_id, chan_name,
657655
&chan_flags) == 0)
658656
{
659-
out_uint8a(s, chan_name, 8);
657+
out_uint8a(s, chan_name, CHANNEL_NAME_LEN + 1);
660658
out_uint16_le(s, chan_id);
661659
out_uint16_le(s, chan_flags);
662660
++output_chan_count;

xrdp/xrdp_wm.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,12 @@ xrdp_wm_load_channel_config(struct xrdp_wm *self)
4848

4949
for (chan_id = 0 ; chan_id < chan_count ; ++chan_id)
5050
{
51-
char chan_name[16];
51+
char chan_name[CHANNEL_NAME_LEN + 1];
5252
if (libxrdp_query_channel(self->session, chan_id, chan_name,
5353
NULL) == 0)
5454
{
5555
int disabled = 1; /* Channels disabled if not found */
56+
int found = 0;
5657
int index;
5758

5859
for (index = 0; index < names->count; index++)
@@ -61,10 +62,18 @@ xrdp_wm_load_channel_config(struct xrdp_wm *self)
6162
const char *r = (const char *)list_get_item(values, index);
6263
if (g_strcasecmp(q, chan_name) == 0)
6364
{
65+
found = 1;
6466
disabled = !g_text2bool(r);
6567
break;
6668
}
6769
}
70+
if (!found)
71+
{
72+
LOG(LOG_LEVEL_WARNING,
73+
"Static channel '%s' from the client"
74+
" is not named in the [Channels] section",
75+
chan_name);
76+
}
6877
disabled_str = (disabled) ? "disabled" : "enabled";
6978
LOG(LOG_LEVEL_DEBUG, "xrdp_wm_load_channel_config: "
7079
"channel %s channel id %d is %s",

0 commit comments

Comments
 (0)