@@ -274,14 +274,25 @@ handle_data(Type, ChannelId, Data0, State = #state{pending = Pending}) ->
274
274
handle_data (Type , ChannelId , Data , State # state {pending = <<>>})
275
275
end .
276
276
277
+ % % From draft-ietf-secsh-filexfer-02 "The file handle strings MUST NOT be longer than 256 bytes."
278
+ handle_op (Request , ReqId , <<? UINT32 (HLen ), _ /binary >>, State = # state {xf = XF })
279
+ when (Request == ? SSH_FXP_CLOSE orelse
280
+ Request == ? SSH_FXP_FSETSTAT orelse
281
+ Request == ? SSH_FXP_FSTAT orelse
282
+ Request == ? SSH_FXP_READ orelse
283
+ Request == ? SSH_FXP_READDIR orelse
284
+ Request == ? SSH_FXP_WRITE ),
285
+ HLen > 256 ->
286
+ ssh_xfer :xf_send_status (XF , ReqId , ? SSH_FX_INVALID_HANDLE , " Invalid handle" ),
287
+ State ;
277
288
handle_op (? SSH_FXP_INIT , Version , B , State ) when is_binary (B ) ->
278
289
XF = State # state .xf ,
279
290
Vsn = lists :min ([XF # ssh_xfer .vsn , Version ]),
280
291
XF1 = XF # ssh_xfer {vsn = Vsn },
281
292
ssh_xfer :xf_send_reply (XF1 , ? SSH_FXP_VERSION , <<? UINT32 (Vsn )>>),
282
293
State # state {xf = XF1 };
283
294
handle_op (? SSH_FXP_REALPATH , ReqId ,
284
- <<? UINT32 (Rlen ), RPath :Rlen /binary >>,
295
+ <<? UINT32 (RLen ), RPath :RLen /binary >>,
285
296
State0 ) ->
286
297
RelPath = relate_file_name (RPath , State0 , _Canonicalize = false ),
287
298
{Res , State } = resolve_symlinks (RelPath , State0 ),
@@ -456,14 +467,12 @@ handle_op(?SSH_FXP_RMDIR, ReqId, <<?UINT32(PLen), BPath:PLen/binary>>,
456
467
send_status (Status , ReqId , State1 );
457
468
458
469
handle_op (? SSH_FXP_RENAME , ReqId ,
459
- Bin = <<? UINT32 (PLen ), _ :PLen /binary , ? UINT32 (PLen2 ),
460
- _ :PLen2 /binary >>,
470
+ Bin = <<? UINT32 (PLen ), _ :PLen /binary , ? UINT32 (PLen2 ), _ :PLen2 /binary >>,
461
471
State = # state {xf = # ssh_xfer {vsn = Vsn }}) when Vsn == 3 ; Vsn == 4 ->
462
472
handle_op (? SSH_FXP_RENAME , ReqId , <<Bin /binary , 0 :32 >>, State );
463
473
464
474
handle_op (? SSH_FXP_RENAME , ReqId ,
465
- <<? UINT32 (PLen ), BPath :PLen /binary , ? UINT32 (PLen2 ),
466
- BPath2 :PLen2 /binary , ? UINT32 (Flags )>>,
475
+ <<? UINT32 (PLen ), BPath :PLen /binary , ? UINT32 (PLen2 ), BPath2 :PLen2 /binary , ? UINT32 (Flags )>>,
467
476
State0 = # state {file_handler = FileMod , file_state = FS0 }) ->
468
477
Path = relate_file_name (BPath , State0 ),
469
478
Path2 = relate_file_name (BPath2 , State0 ),
0 commit comments