FreeRDP
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Modules Pages
tpkt.c
1
20#include <freerdp/config.h>
21
22#include "tpdu.h"
23
24#include "tpkt.h"
25
26#include <winpr/wlog.h>
27
28#define TAG FREERDP_TAG("core.tpkt")
29
70int tpkt_verify_header(wStream* s)
71{
72 BYTE version = 0;
73
74 if (!Stream_CheckAndLogRequiredLength(TAG, s, 1))
75 return -1;
76
77 Stream_Peek_UINT8(s, version);
78
79 if (version == 3)
80 return 1;
81 else
82 return 0;
83}
84
94BOOL tpkt_read_header(wStream* s, UINT16* length)
95{
96 BYTE version = 0;
97
98 if (!Stream_CheckAndLogRequiredLength(TAG, s, 1))
99 return FALSE;
100
101 Stream_Peek_UINT8(s, version);
102
103 if (version == 3)
104 {
105 UINT16 len = 0;
106 if (!Stream_CheckAndLogRequiredLength(TAG, s, 4))
107 return FALSE;
108
109 Stream_Seek(s, 2);
110 Stream_Read_UINT16_BE(s, len);
111
112 /* ITU-T Rec. T.123 8 Packet header to delimit data units in an octet stream */
113 if (len < 7)
114 {
115 WLog_ERR(TAG, "TPKT header too short, require minimum of 7 bytes, got %" PRId16, len);
116 return FALSE;
117 }
118
119 if (!Stream_CheckAndLogRequiredLength(TAG, s, len - 4))
120 {
121 WLog_ERR(TAG, "TPKT header length %" PRIu16 ", but received less", len);
122 return FALSE;
123 }
124 *length = len;
125 }
126 else
127 {
128 /* not a TPKT header */
129 *length = 0;
130 }
131
132 return TRUE;
133}
134
135BOOL tpkt_ensure_stream_consumed_(wLog* log, wStream* s, size_t length, const char* fkt)
136{
137 if (length > UINT16_MAX)
138 {
139 WLog_Print(log, WLOG_ERROR, "[%s] length %" PRIuz " > %" PRIu16, fkt, length, UINT16_MAX);
140 return FALSE;
141 }
142
143 size_t rem = Stream_GetRemainingLength(s);
144 if (rem > 0)
145 {
146 WLog_Print(log, WLOG_ERROR,
147 "[%s] Received invalid TPKT header length %" PRIu16 ", %" PRIdz
148 " bytes too long!",
149 fkt, length, rem);
150 return FALSE;
151 }
152 return TRUE;
153}
154
164BOOL tpkt_write_header(wStream* s, size_t length)
165{
166 if (!Stream_CheckAndLogRequiredCapacity(TAG, (s), 4))
167 return FALSE;
168 Stream_Write_UINT8(s, 3); /* version */
169 Stream_Write_UINT8(s, 0); /* reserved */
170
171 WINPR_ASSERT(length <= UINT16_MAX);
172 Stream_Write_UINT16_BE(s, (UINT16)length); /* length */
173 return TRUE;
174}