@@ -120,6 +120,12 @@ static const struct nla_policy ksmbd_nl_policy[KSMBD_EVENT_MAX + 1] = {
120120 },
121121 [KSMBD_EVENT_SPNEGO_AUTHEN_RESPONSE ] = {
122122 },
123+ [KSMBD_EVENT_LOGIN_REQUEST_EXT ] = {
124+ .len = sizeof (struct ksmbd_login_request ),
125+ },
126+ [KSMBD_EVENT_LOGIN_RESPONSE_EXT ] = {
127+ .len = sizeof (struct ksmbd_login_response_ext ),
128+ },
123129};
124130
125131static struct genl_ops ksmbd_genl_ops [] = {
@@ -187,6 +193,14 @@ static struct genl_ops ksmbd_genl_ops[] = {
187193 .cmd = KSMBD_EVENT_SPNEGO_AUTHEN_RESPONSE ,
188194 .doit = handle_generic_event ,
189195 },
196+ {
197+ .cmd = KSMBD_EVENT_LOGIN_REQUEST_EXT ,
198+ .doit = handle_unsupported_event ,
199+ },
200+ {
201+ .cmd = KSMBD_EVENT_LOGIN_RESPONSE_EXT ,
202+ .doit = handle_generic_event ,
203+ },
190204};
191205
192206static struct genl_family ksmbd_genl_family = {
@@ -198,7 +212,7 @@ static struct genl_family ksmbd_genl_family = {
198212 .module = THIS_MODULE ,
199213 .ops = ksmbd_genl_ops ,
200214 .n_ops = ARRAY_SIZE (ksmbd_genl_ops ),
201- .resv_start_op = KSMBD_EVENT_SPNEGO_AUTHEN_RESPONSE + 1 ,
215+ .resv_start_op = KSMBD_EVENT_LOGIN_RESPONSE_EXT + 1 ,
202216};
203217
204218static void ksmbd_nl_init_fixup (void )
@@ -459,16 +473,24 @@ static int ipc_validate_msg(struct ipc_msg_table_entry *entry)
459473{
460474 unsigned int msg_sz = entry -> msg_sz ;
461475
462- if (entry -> type == KSMBD_EVENT_RPC_REQUEST ) {
476+ switch (entry -> type ) {
477+ case KSMBD_EVENT_RPC_REQUEST :
478+ {
463479 struct ksmbd_rpc_command * resp = entry -> response ;
464480
465481 msg_sz = sizeof (struct ksmbd_rpc_command ) + resp -> payload_sz ;
466- } else if (entry -> type == KSMBD_EVENT_SPNEGO_AUTHEN_REQUEST ) {
482+ break ;
483+ }
484+ case KSMBD_EVENT_SPNEGO_AUTHEN_REQUEST :
485+ {
467486 struct ksmbd_spnego_authen_response * resp = entry -> response ;
468487
469488 msg_sz = sizeof (struct ksmbd_spnego_authen_response ) +
470489 resp -> session_key_len + resp -> spnego_blob_len ;
471- } else if (entry -> type == KSMBD_EVENT_SHARE_CONFIG_REQUEST ) {
490+ break ;
491+ }
492+ case KSMBD_EVENT_SHARE_CONFIG_REQUEST :
493+ {
472494 struct ksmbd_share_config_response * resp = entry -> response ;
473495
474496 if (resp -> payload_sz ) {
@@ -478,6 +500,17 @@ static int ipc_validate_msg(struct ipc_msg_table_entry *entry)
478500 msg_sz = sizeof (struct ksmbd_share_config_response ) +
479501 resp -> payload_sz ;
480502 }
503+ break ;
504+ }
505+ case KSMBD_EVENT_LOGIN_REQUEST_EXT :
506+ {
507+ struct ksmbd_login_response_ext * resp = entry -> response ;
508+
509+ if (resp -> ngroups ) {
510+ msg_sz = sizeof (struct ksmbd_login_response_ext ) +
511+ resp -> ngroups * sizeof (gid_t );
512+ }
513+ }
481514 }
482515
483516 return entry -> msg_sz != msg_sz ? - EINVAL : 0 ;
@@ -560,6 +593,29 @@ struct ksmbd_login_response *ksmbd_ipc_login_request(const char *account)
560593 return resp ;
561594}
562595
596+ struct ksmbd_login_response_ext * ksmbd_ipc_login_request_ext (const char * account )
597+ {
598+ struct ksmbd_ipc_msg * msg ;
599+ struct ksmbd_login_request * req ;
600+ struct ksmbd_login_response_ext * resp ;
601+
602+ if (strlen (account ) >= KSMBD_REQ_MAX_ACCOUNT_NAME_SZ )
603+ return NULL ;
604+
605+ msg = ipc_msg_alloc (sizeof (struct ksmbd_login_request ));
606+ if (!msg )
607+ return NULL ;
608+
609+ msg -> type = KSMBD_EVENT_LOGIN_REQUEST_EXT ;
610+ req = (struct ksmbd_login_request * )msg -> payload ;
611+ req -> handle = ksmbd_acquire_id (& ipc_ida );
612+ strscpy (req -> account , account , KSMBD_REQ_MAX_ACCOUNT_NAME_SZ );
613+ resp = ipc_msg_send_request (msg , req -> handle );
614+ ipc_msg_handle_free (req -> handle );
615+ ipc_msg_free (msg );
616+ return resp ;
617+ }
618+
563619struct ksmbd_spnego_authen_response *
564620ksmbd_ipc_spnego_authen_request (const char * spnego_blob , int blob_len )
565621{
0 commit comments