Ignore:
Timestamp:
Nov 14, 2012, 12:59:34 PM (13 years ago)
Author:
Silvan Scherrer
Message:

Samba Server: update vendor to 3.6.0

File:
1 edited

Legend:

Unmodified
Added
Removed
  • vendor/current/source3/smbd/signing.c

    r414 r740  
    2121
    2222#include "includes.h"
     23#include "smbd/smbd.h"
    2324#include "smbd/globals.h"
    24 
     25#include "smb_signing.h"
    2526
    2627/***********************************************************
     
    2930
    3031bool 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)
    3234{
    3335        /* Check if it's a non-session message. */
    3436        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);
    3558                return true;
    3659        }
     
    6689}
    6790
     91struct 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
     102static int smbd_shm_signing_destructor(struct smbd_shm_signing *s)
     103{
     104        anonymous_shared_free(s->shm_pointer);
     105        return 0;
     106}
     107
     108static 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
     142static 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
    68153/***********************************************************
    69154 Called by server negprot when signing has been negotiated.
     
    86171                allowed = false;
    87172                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;
    88199        }
    89200
Note: See TracChangeset for help on using the changeset viewer.