@@ -13,6 +13,7 @@ with CoAP_SPARK.Log;
1313
1414with RFLX.CoAP ;
1515with RFLX.CoAP.CoAP_Message ;
16+ with RFLX.RFLX_Types ;
1617
1718package body RFLX.CoAP_Server.Main_Loop
1819 with SPARK_Mode
7778 else
7879 Handle_Request :
7980 declare
81+ use type RFLX.RFLX_Types.Length;
8082 Opt_Payload_Length : constant RFLX_Types.Length :=
8183 RFLX_Types.To_Length
8284 (RFLX.CoAP.CoAP_Message.Field_Size
8385 (Context, RFLX.CoAP.CoAP_Message.F_Options_And_Payload));
8486 Opt_Payload_Buffer : RFLX_Types.Bytes
8587 (1 .. RFLX.RFLX_Types.Index'Base (Opt_Payload_Length));
88+ Encoded_Length : RFLX.RFLX_Types.Length;
8689 begin
8790 RFLX.CoAP.CoAP_Message.Get_Options_And_Payload
8891 (Context, Opt_Payload_Buffer);
121124 Status => State.Current_Status,
122125 Encoded_Data =>
123126 RFLX_Result.Options_And_Payload_Options_And_Payload,
124- Encoded_Length =>
125- RFLX.CoAP.Length_16
126- (RFLX_Result.Options_And_Payload_Length));
127+ Encoded_Length => Encoded_Length);
128+
129+ if Encoded_Length > RFLX.RFLX_Types.Length (RFLX.CoAP.Length_16'Last) then
130+ State.Current_Status := CoAP_SPARK.Capacity_Error;
131+ RFLX_Result.Options_And_Payload_Length := 0 ;
132+ else
133+ RFLX_Result.Options_And_Payload_Length :=
134+ RFLX.CoAP.Length_16 (Encoded_Length);
135+ end if ;
127136
128137 RFLX_Result.Success_Code := RFLX.CoAP.Success_Response'Last;
129138 RFLX_Result.Client_Error_Code :=
187196 RFLX_Result : out RFLX.CoAP_Server.Options_And_Payload_Data.Structure)
188197 is
189198 use type CoAP_SPARK.Status_Type;
199+ use type RFLX.RFLX_Types.Length;
190200
191201 Status_Image : constant String :=
192202 CoAP_SPARK.Status_Type'Image (State.Current_Status);
195205 Context : RFLX.CoAP.CoAP_Message.Context;
196206
197207 Response_Content : CoAP_SPARK.Messages.Content;
198-
208+ Encoded_Length : RFLX.RFLX_Types.Length;
199209 begin
200210 RFLX.CoAP.CoAP_Message.Initialize
201211 (Ctx => Context,
220230 (Options_And_Payload => Response_Content,
221231 Status => State.Current_Status,
222232 Encoded_Data => RFLX_Result.Options_And_Payload,
223- Encoded_Length => RFLX.CoAP.Length_16
224- (RFLX_Result.Length));
233+ Encoded_Length => Encoded_Length);
234+
235+ if Encoded_Length > RFLX.RFLX_Types.Length (RFLX.CoAP.Length_16'Last) then
236+ State.Current_Status := CoAP_SPARK.Capacity_Error;
237+ RFLX_Result.Length := 0 ;
238+ else
239+ RFLX_Result.Length :=
240+ RFLX.CoAP.Length_16 (Encoded_Length);
241+ end if ;
225242
226243 CoAP_SPARK.Messages.Finalize (Response_Content);
227244 pragma Assert (CoAP_SPARK.Messages.Is_Empty (Response_Content));
0 commit comments