Selaa lähdekoodia

Clean smb_session from unused members, extract sub struct definitions

Julien 'Lta' BALLET 11 vuotta sitten
vanhempi
commit
9fc36255f0
3 muutettua tiedostoa jossa 31 lisäystä ja 42 poistoa
  1. 18 18
      include/bdsm/smb_types.h
  2. 6 16
      src/smb_session.c
  3. 7 8
      src/smb_spnego.c

+ 18 - 18
include/bdsm/smb_types.h

@@ -27,6 +27,7 @@
 #include <netinet/ip.h>
 #include <stddef.h>
 #include <libtasn1.h>
+#include <stdbool.h>
 
 #include "bdsm/smb_buffer.h"
 #include "bdsm/smb_packets.h"
@@ -101,7 +102,18 @@ typedef struct {
     char *    domain;
     char *    login;
     char *    password;
-} smb_creds;
+}           smb_creds;
+
+typedef struct {
+  char                name[16];       // The server name
+  uint16_t            dialect;        // The selected dialect
+  uint16_t            security_mode;  // Security mode
+  uint16_t            uid;            // uid attributed by the server.
+  uint32_t            session_key;    // The session key sent by the server on protocol negotiate
+  uint32_t            caps;           // Server caps replyed during negotiate
+  uint64_t            challenge;      // For challenge response security
+  uint64_t            ts;             // It seems Win7 requires it :-/
+}                   smb_srv_info;
 
 /**
  * @brief An opaque data structure to represent a SMB Session.
@@ -109,30 +121,18 @@ typedef struct {
 typedef struct
 {
   int                 state;
-  int                 guest;            // boolean, are we logged as guest ?
+  bool                guest;            // Are we logged as guest ?
 
   // Informations about the smb server we are connected to.
-  struct {
-    char                name[16];       // The server name
-    uint16_t            dialect;        // The selected dialect
-    uint16_t            security_mode;  // Security mode
-    uint16_t            uid;            // uid attributed by the server.
-    uint32_t            session_key;    // The session key sent by the server on protocol negotiate
-    uint32_t            caps;           // Server caps replyed during negotiate
-    uint64_t            challenge;      // For challenge response security
-    uint64_t            ts;             // It seems Win7 requires it :-/
-  }                   srv;
-
-  struct {
-    void                *init;
-    size_t              init_sz;
-    ASN1_TYPE           asn1_def;
-  }                   spnego;           // eXtended SECurity negociation data
+  smb_srv_info        srv;
 
+
+  ASN1_TYPE           spnego_asn1;
   smb_buffer          xsec_target;
 
   smb_creds           creds;
   smb_transport       transport;
+
   struct smb_share_s  *shares;          // shares->files | Map fd <-> smb_file
 }                   smb_session;
 

+ 6 - 16
src/smb_session.c

@@ -38,9 +38,10 @@ smb_session   *smb_session_new()
   assert(s != NULL);
   memset((void *)s, 0, sizeof(smb_session));
 
+  s->guest              = false;
+
   // Explicitly sets pointer to NULL, insted of 0
-  s->spnego.init        = NULL;
-  s->spnego.asn1_def    = NULL;
+  s->spnego_asn1        = NULL;
   s->transport.session  = NULL;
   s->shares             = NULL;
 
@@ -67,9 +68,8 @@ void            smb_session_destroy(smb_session *s)
       s->transport.session = NULL;
     }
 
-    free(s->spnego.init);
-    if (s->spnego.asn1_def != NULL)
-      asn1_delete_structure(&s->spnego.asn1_def);
+    if (s->spnego_asn1 != NULL)
+      asn1_delete_structure(&s->spnego_asn1);
 
     smb_buffer_free(&s->xsec_target);
 
@@ -164,7 +164,6 @@ static int        smb_negotiate(smb_session *s, int xsec)
   smb_message         *msg = NULL;
   smb_message         answer;
   smb_nego_resp       *nego;
-  smb_nego_xsec_resp  *nego_xsec;
 
 
   msg = smb_message_new(SMB_CMD_NEGOTIATE, 128);
@@ -198,16 +197,7 @@ static int        smb_negotiate(smb_session *s, int xsec)
 
   // Copy SPNEGO supported mechanisms  token for later usage (login_gss())
   if (smb_session_supports(s, SMB_SESSION_XSEC))
-  {
     BDSM_dbg("Server is supporting extended security\n");
-
-    nego_xsec             = (smb_nego_xsec_resp *)nego;
-    s->spnego.init_sz     = nego_xsec->bct - 16;
-    s->spnego.init        = malloc(s->spnego.init_sz);
-
-    assert(s->spnego.init != NULL);
-    memcpy(s->spnego.init, nego_xsec->gssapi, s->spnego.init_sz);
-  }
   else
     s->srv.challenge      = nego->challenge;
 
@@ -300,7 +290,7 @@ static int        smb_session_login_ntlm(smb_session *s, const char *domain,
   }
 
   if (r->action & 0x0001)
-    s->guest = 1;
+    s->guest = true;
 
   s->srv.uid  = answer.packet->header.uid;
   s->state    = SMB_STATE_SESSION_OK;

+ 7 - 8
src/smb_spnego.c

@@ -41,10 +41,10 @@ static int      init_asn1(smb_session *s)
 
   assert (s != NULL);
 
-  if (s->spnego.asn1_def != NULL)
+  if (s->spnego_asn1 != NULL)
     return (1);
 
-  res = asn1_array2tree(spnego_asn1_conf, &s->spnego.asn1_def, NULL);
+  res = asn1_array2tree(spnego_asn1_conf, &s->spnego_asn1, NULL);
   if (res != ASN1_SUCCESS)
   {
     asn1_display_error("init_asn1", res);
@@ -61,8 +61,8 @@ static void     clean_asn1(smb_session *s)
 {
   assert (s != NULL);
 
-  if (s->spnego.asn1_def != NULL)
-    asn1_delete_structure(&s->spnego.asn1_def);
+  if (s->spnego_asn1 != NULL)
+    asn1_delete_structure(&s->spnego_asn1);
 }
 
 static int      negotiate(smb_session *s, const char *domain)
@@ -89,7 +89,7 @@ static int      negotiate(smb_session *s, const char *domain)
   smb_message_advance(msg, sizeof(smb_session_xsec_req));
 
 
-  asn1_create_element(s->spnego.asn1_def, "SPNEGO.GSSAPIContextToken", &token);
+  asn1_create_element(s->spnego_asn1, "SPNEGO.GSSAPIContextToken", &token);
 
   res = asn1_write_value(token, "thisMech", spnego_oid, 1);
   if (res != ASN1_SUCCESS) goto error;
@@ -173,8 +173,7 @@ static int      challenge(smb_session *s)
 
   resp = (smb_session_xsec_resp *)msg.packet->payload;
 
-  asn1_create_element(s->spnego.asn1_def, "SPNEGO.NegotiationToken",
-                      &token);
+  asn1_create_element(s->spnego_asn1, "SPNEGO.NegotiationToken", &token);
   res = asn1_der_decoding(&token, resp->payload, resp->xsec_blob_size,
                           err_desc);
   if (res != ASN1_SUCCESS)
@@ -234,7 +233,7 @@ static int      auth(smb_session *s, const char *domain, const char *user,
   smb_message_advance(msg, sizeof(smb_session_xsec_req));
 
 
-  asn1_create_element(s->spnego.asn1_def, "SPNEGO.NegotiationToken", &token);
+  asn1_create_element(s->spnego_asn1, "SPNEGO.NegotiationToken", &token);
 
   // Select a response message type
   res = asn1_write_value(token, "", "negTokenResp", 1);