@@ -856,6 +856,7 @@ cifs_demultiplex_thread(void *p)
856856 int length ;
857857 struct TCP_Server_Info * server = p ;
858858 unsigned int pdu_length ;
859+ unsigned int next_offset ;
859860 char * buf = NULL ;
860861 struct task_struct * task_to_wake = NULL ;
861862 struct mid_q_entry * mid_entry ;
@@ -893,17 +894,18 @@ cifs_demultiplex_thread(void *p)
893894 * so we can now interpret the length field.
894895 */
895896 pdu_length = get_rfc1002_length (buf );
896- server -> pdu_size = pdu_length ;
897897
898898 cifs_dbg (FYI , "RFC1002 header 0x%x\n" , pdu_length );
899899 if (!is_smb_response (server , buf [0 ]))
900900 continue ;
901+ next_pdu :
902+ server -> pdu_size = pdu_length ;
901903
902904 /* make sure we have enough to get to the MID */
903- if (pdu_length < HEADER_SIZE (server ) - 1 -
905+ if (server -> pdu_size < HEADER_SIZE (server ) - 1 -
904906 server -> vals -> header_preamble_size ) {
905907 cifs_dbg (VFS , "SMB response too short (%u bytes)\n" ,
906- pdu_length );
908+ server -> pdu_size );
907909 cifs_reconnect (server );
908910 wake_up (& server -> response_q );
909911 continue ;
@@ -918,6 +920,12 @@ cifs_demultiplex_thread(void *p)
918920 continue ;
919921 server -> total_read += length ;
920922
923+ if (server -> ops -> next_header ) {
924+ next_offset = server -> ops -> next_header (buf );
925+ if (next_offset )
926+ server -> pdu_size = next_offset ;
927+ }
928+
921929 if (server -> ops -> is_transform_hdr &&
922930 server -> ops -> receive_transform &&
923931 server -> ops -> is_transform_hdr (buf )) {
@@ -963,7 +971,15 @@ cifs_demultiplex_thread(void *p)
963971 server -> ops -> dump_detail (buf , server );
964972 cifs_dump_mids (server );
965973#endif /* CIFS_DEBUG2 */
966-
974+ }
975+ if (pdu_length > server -> pdu_size ) {
976+ if (!allocate_buffers (server ))
977+ continue ;
978+ pdu_length -= server -> pdu_size ;
979+ server -> total_read = 0 ;
980+ server -> large_buf = false;
981+ buf = server -> smallbuf ;
982+ goto next_pdu ;
967983 }
968984 } /* end while !EXITING */
969985
0 commit comments