@@ -150,41 +150,6 @@ func (c *transport) ExportSMBSecurity(o *Security) {
150150 o .SetAttribute (gssapi .AttributeSMBEffectiveSessionKey , pipe .SessionKey ())
151151 }
152152 }
153-
154- }
155-
156- // writePacketFragmentedAuth writes the packet with fragmented authentication data.
157- func (c * transport ) writePacketFragmentedAuth (ctx context.Context , call Call , pkt * Packet ) error {
158-
159- authData , maxSize := pkt .AuthData , c .settings .MaxXmitFrag - pkt .PDUHeaderSize ()
160-
161- // https://pubs.opengroup.org/onlinepubs/9629399/chap12.htm:
162- //
163- // If pfc_flags does not have PFC_LAST_FRAG set and rpc_vers_minor is 1,
164- // then the PDU has fragmented auth_verifier data. The server will assemble
165- // the data concatenating sequentially each auth_verifier field until a
166- // PDU is sent with PFC_LAST_FRAG flag set. This completed buffer is then
167- // used as auth_verifier data.
168-
169- for {
170-
171- if pkt .Set (PacketFlagLastFrag ); len (authData ) > maxSize {
172- pkt .AuthData , authData = authData [:maxSize ], authData [maxSize :]
173- pkt .Header .RPCVersionMinor = 1
174- pkt .Unset (PacketFlagLastFrag )
175- }
176-
177- // write bind pdu.
178- if err := c .WritePacket (ctx , call , pkt ); err != nil {
179- return fmt .Errorf ("alter context: write packet: %w" , err )
180- }
181-
182- if pkt .Unset (PacketFlagFirstFrag ); len (pkt .AuthData ) <= maxSize {
183- break
184- }
185- }
186-
187- return nil
188153}
189154
190155// AlterContext function establishes new presentation or security (or both) context(s).
@@ -229,7 +194,7 @@ func (c *transport) AlterContext(ctx context.Context, opts ...Option) (Conn, err
229194 }
230195
231196 // write alter-context pdu.
232- if err := c .writePacketFragmentedAuth (ctx , call , pkt ); err != nil {
197+ if err := c .WritePacket (ctx , call , pkt ); err != nil {
233198 return nil , err
234199 }
235200
@@ -279,14 +244,14 @@ func (c *transport) AlterContext(ctx context.Context, opts ...Option) (Conn, err
279244 // replace type with auth3.
280245 pkt .PDU = & Auth3 {}
281246 // write auth3 pdu.
282- if err = c .writePacketFragmentedAuth (ctx , call , pkt ); err != nil {
247+ if err = c .WritePacket (ctx , call , pkt ); err != nil {
283248 return nil , fmt .Errorf ("alter context: auth3: write packet: %w" , err )
284249 }
285250 // no response is assumed.
286251 break
287252 }
288253 // write alter_context request.
289- if err = c .writePacketFragmentedAuth (ctx , call , pkt ); err != nil {
254+ if err = c .WritePacket (ctx , call , pkt ); err != nil {
290255 return nil , fmt .Errorf ("alter context: write packet: %w" , err )
291256 }
292257 // read alter_context response.
@@ -420,8 +385,19 @@ func (c *transport) Bind(ctx context.Context, opts ...Option) (Conn, error) {
420385 if pkt .AuthData , err = o .Security .Init (ctx , nil ); err != nil {
421386 return nil , fmt .Errorf ("bind: %w" , err )
422387 }
388+
389+ // XXX: adjust max xmit frag size if auth data is too large.
390+ if len (pkt .AuthData ) > c .settings .MaxXmitFrag - pkt .PDUHeaderSize () {
391+ c .logger .Warn ().Int ("auth_data_size" , len (pkt .AuthData )).
392+ Int ("previous_max_xmit_frag" , c .settings .MaxXmitFrag ).
393+ Msg ("adjusting max xmit frag size to fit auth data" )
394+ c .settings .MaxXmitFrag = len (pkt .AuthData ) + pkt .PDUHeaderSize ()
395+ // reset buffered connector.
396+ c .cc = c .cc .Resized (c .settings .FragmentSize ())
397+ }
398+
423399 // write bind pdu.
424- if err = c .writePacketFragmentedAuth (ctx , call , pkt ); err != nil {
400+ if err = c .WritePacket (ctx , call , pkt ); err != nil {
425401 return nil , fmt .Errorf ("bind: write packet: %w" , err )
426402 }
427403 // read bind response (bind-ack, bind-nak).
@@ -499,14 +475,14 @@ func (c *transport) Bind(ctx context.Context, opts ...Option) (Conn, error) {
499475 // replace type with auth3.
500476 pkt .PDU = & Auth3 {}
501477 // write auth3 pdu.
502- if err = c .writePacketFragmentedAuth (ctx , call , pkt ); err != nil {
478+ if err = c .WritePacket (ctx , call , pkt ); err != nil {
503479 return nil , fmt .Errorf ("bind: alter context: auth3: write packet: %w" , err )
504480 }
505481 // no response is assumed.
506482 break
507483 }
508484 // write alter_context request.
509- if err = c .writePacketFragmentedAuth (ctx , call , pkt ); err != nil {
485+ if err = c .WritePacket (ctx , call , pkt ); err != nil {
510486 return nil , fmt .Errorf ("bind: alter context: write packet: %w" , err )
511487 }
512488 // read alter_context response.
0 commit comments