Changeset 745 for trunk/server/source3/smbd/signing.c
- Timestamp:
- Nov 27, 2012, 4:43:17 PM (13 years ago)
- Location:
- trunk/server
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/server
- Property svn:mergeinfo changed
/vendor/current merged: 581,587,591,594,597,600,615,618,740
- Property svn:mergeinfo changed
-
trunk/server/source3/smbd/signing.c
r414 r745 21 21 22 22 #include "includes.h" 23 #include "smbd/smbd.h" 23 24 #include "smbd/globals.h" 24 25 #include "smb_signing.h" 25 26 26 27 /*********************************************************** … … 29 30 30 31 bool srv_check_sign_mac(struct smbd_server_connection *conn, 31 const char *inbuf, uint32_t *seqnum) 32 const char *inbuf, uint32_t *seqnum, 33 bool trusted_channel) 32 34 { 33 35 /* Check if it's a non-session message. */ 34 36 if(CVAL(inbuf,0)) { 37 return true; 38 } 39 40 if (trusted_channel) { 41 NTSTATUS status; 42 43 if (smb_len(inbuf) < (smb_ss_field + 8 - 4)) { 44 DEBUG(1,("smb_signing_check_pdu: Can't check signature " 45 "on short packet! smb_len = %u\n", 46 smb_len(inbuf))); 47 return false; 48 } 49 50 status = NT_STATUS(IVAL(inbuf, smb_ss_field + 4)); 51 if (!NT_STATUS_IS_OK(status)) { 52 DEBUG(1,("smb_signing_check_pdu: trusted channel passed %s\n", 53 nt_errstr(status))); 54 return false; 55 } 56 57 *seqnum = IVAL(inbuf, smb_ss_field); 35 58 return true; 36 59 } … … 66 89 } 67 90 91 struct smbd_shm_signing { 92 size_t shm_size; 93 uint8_t *shm_pointer; 94 95 /* we know the signing engine will only allocate 2 chunks */ 96 uint8_t *ptr1; 97 size_t len1; 98 uint8_t *ptr2; 99 size_t len2; 100 }; 101 102 static int smbd_shm_signing_destructor(struct smbd_shm_signing *s) 103 { 104 anonymous_shared_free(s->shm_pointer); 105 return 0; 106 } 107 108 static void *smbd_shm_signing_alloc(TALLOC_CTX *mem_ctx, size_t len) 109 { 110 struct smbd_shm_signing *s = talloc_get_type_abort(mem_ctx, 111 struct smbd_shm_signing); 112 113 if (s->ptr1 == NULL) { 114 s->len1 = len; 115 if (len % 8) { 116 s->len1 += (8 - (len % 8)); 117 } 118 if (s->len1 > s->shm_size) { 119 s->len1 = 0; 120 errno = ENOMEM; 121 return NULL; 122 } 123 s->ptr1 = s->shm_pointer; 124 return s->ptr1; 125 } 126 127 if (s->ptr2 == NULL) { 128 s->len2 = len; 129 if (s->len2 > (s->shm_size - s->len1)) { 130 s->len2 = 0; 131 errno = ENOMEM; 132 return NULL; 133 } 134 s->ptr2 = s->shm_pointer + s->len1; 135 return s->ptr2; 136 } 137 138 errno = ENOMEM; 139 return NULL; 140 } 141 142 static void smbd_shm_signing_free(TALLOC_CTX *mem_ctx, void *ptr) 143 { 144 struct smbd_shm_signing *s = talloc_get_type_abort(mem_ctx, 145 struct smbd_shm_signing); 146 147 if (s->ptr2 == ptr) { 148 s->ptr2 = NULL; 149 s->len2 = 0; 150 } 151 } 152 68 153 /*********************************************************** 69 154 Called by server negprot when signing has been negotiated. … … 86 171 allowed = false; 87 172 break; 173 } 174 175 if (lp_async_smb_echo_handler()) { 176 struct smbd_shm_signing *s; 177 178 /* setup the signing state in shared memory */ 179 s = talloc_zero(smbd_event_context(), struct smbd_shm_signing); 180 if (s == NULL) { 181 return false; 182 } 183 s->shm_size = 4096; 184 s->shm_pointer = 185 (uint8_t *)anonymous_shared_allocate(s->shm_size); 186 if (s->shm_pointer == NULL) { 187 talloc_free(s); 188 return false; 189 } 190 talloc_set_destructor(s, smbd_shm_signing_destructor); 191 conn->smb1.signing_state = smb_signing_init_ex(s, 192 allowed, mandatory, 193 smbd_shm_signing_alloc, 194 smbd_shm_signing_free); 195 if (!conn->smb1.signing_state) { 196 return false; 197 } 198 return true; 88 199 } 89 200
Note:
See TracChangeset
for help on using the changeset viewer.