Print this page
1575 untangle libmlrpc ... (libmlrpc)
        
*** 19,28 ****
--- 19,30 ----
   * CDDL HEADER END
   */
  /*
   * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
   * Use is subject to license terms.
+  *
+  * Copyright 2013 Nexenta Systems, Inc.  All rights reserved.
   */
  
  /*
   * NDR heap management. The heap is used for temporary storage by
   * both the client and server side library routines.  In order to
*** 44,56 ****
  #include <stdlib.h>
  #include <string.h>
  #include <strings.h>
  #include <sys/uio.h>
  
! #include <smbsrv/libsmb.h>
! #include <smbsrv/libmlrpc.h>
! #include <smbsrv/smb_sid.h>
  
  /*
   * Allocate a heap structure and the first heap block.  For many RPC
   * operations this will be the only time we need to malloc memory
   * in this instance of the heap.  The only point of note here is that
--- 46,57 ----
  #include <stdlib.h>
  #include <string.h>
  #include <strings.h>
  #include <sys/uio.h>
  
! #include <libmlrpc.h>
! #include <ndr_wchar.h>
  
  /*
   * Allocate a heap structure and the first heap block.  For many RPC
   * operations this will be the only time we need to malloc memory
   * in this instance of the heap.  The only point of note here is that
*** 152,161 ****
--- 153,179 ----
          heap->iov->iov_len += size;
          return ((void *)p);
  }
  
  /*
+  * Convenience function to copy some memory into the heap.
+  */
+ void *
+ ndr_heap_dupmem(ndr_heap_t *heap, const void *mem, size_t len)
+ {
+         void *p;
+ 
+         if (mem == NULL)
+                 return (NULL);
+ 
+         if ((p = ndr_heap_malloc(heap, len)) != NULL)
+                 (void) memcpy(p, mem, len);
+ 
+         return (p);
+ }
+ 
+ /*
   * Convenience function to do heap strdup.
   */
  void *
  ndr_heap_strdup(ndr_heap_t *heap, const char *s)
  {
*** 169,180 ****
           * We don't need to clutter the heap with empty strings.
           */
          if ((len = strlen(s)) == 0)
                  return ("");
  
!         if ((p = ndr_heap_malloc(heap, len+1)) != NULL)
!                 (void) strcpy((char *)p, s);
  
          return (p);
  }
  
  /*
--- 187,197 ----
           * We don't need to clutter the heap with empty strings.
           */
          if ((len = strlen(s)) == 0)
                  return ("");
  
!         p = ndr_heap_dupmem(heap, s, len+1);
  
          return (p);
  }
  
  /*
*** 181,196 ****
   * Make an ndr_mstring_t from a regular string.
   */
  int
  ndr_heap_mstring(ndr_heap_t *heap, const char *s, ndr_mstring_t *out)
  {
          if (s == NULL || out == NULL)
                  return (-1);
  
!         out->length = smb_wcequiv_strlen(s);
!         out->allosize = out->length + sizeof (smb_wchar_t);
  
          if ((out->str = ndr_heap_strdup(heap, s)) == NULL)
                  return (-1);
  
          return (0);
  }
--- 198,223 ----
   * Make an ndr_mstring_t from a regular string.
   */
  int
  ndr_heap_mstring(ndr_heap_t *heap, const char *s, ndr_mstring_t *out)
  {
+         size_t slen;
+ 
          if (s == NULL || out == NULL)
                  return (-1);
  
!         /*
!          * Determine the WC strlen of s
!          * Was ndr__wcequiv_strlen(s)
!          */
!         slen = ndr__mbstowcs(NULL, s, NDR_STRING_MAX);
!         if (slen == (size_t)-1)
!                 return (-1);
  
+         out->length = slen * sizeof (ndr_wchar_t);
+         out->allosize = out->length + sizeof (ndr_wchar_t);
+ 
          if ((out->str = ndr_heap_strdup(heap, s)) == NULL)
                  return (-1);
  
          return (0);
  }
*** 205,228 ****
   * aware that this is really a string.
   */
  void
  ndr_heap_mkvcs(ndr_heap_t *heap, char *s, ndr_vcstr_t *vc)
  {
          int mlen;
  
!         vc->wclen = smb_wcequiv_strlen(s);
          vc->wcsize = vc->wclen;
  
!         mlen = sizeof (ndr_vcs_t) + vc->wcsize + sizeof (smb_wchar_t);
! 
          vc->vcs = ndr_heap_malloc(heap, mlen);
  
          if (vc->vcs) {
                  vc->vcs->vc_first_is = 0;
!                 vc->vcs->vc_length_is = vc->wclen / sizeof (smb_wchar_t);
!                 (void) smb_mbstowcs((smb_wchar_t *)vc->vcs->buffer, s,
!                     vc->vcs->vc_length_is);
          }
  }
  
  void
  ndr_heap_mkvcb(ndr_heap_t *heap, uint8_t *data, uint32_t datalen,
--- 232,266 ----
   * aware that this is really a string.
   */
  void
  ndr_heap_mkvcs(ndr_heap_t *heap, char *s, ndr_vcstr_t *vc)
  {
+         size_t slen;
          int mlen;
  
!         /*
!          * Determine the WC strlen of s
!          * Was ndr__wcequiv_strlen(s)
!          */
!         slen = ndr__mbstowcs(NULL, s, NDR_STRING_MAX);
!         if (slen == (size_t)-1)
!                 slen = 0;
! 
!         vc->wclen = slen * sizeof (ndr_wchar_t);
          vc->wcsize = vc->wclen;
  
!         /*
!          * alloc one extra wchar for a null
!          * See slen + 1 arg for mbstowcs
!          */
!         mlen = sizeof (ndr_vcs_t) + vc->wcsize + sizeof (ndr_wchar_t);
          vc->vcs = ndr_heap_malloc(heap, mlen);
  
          if (vc->vcs) {
                  vc->vcs->vc_first_is = 0;
!                 vc->vcs->vc_length_is = slen;
!                 (void) ndr__mbstowcs(vc->vcs->buffer, s, slen + 1);
          }
  }
  
  void
  ndr_heap_mkvcb(ndr_heap_t *heap, uint8_t *data, uint32_t datalen,
*** 248,277 ****
                  bcopy(data, vcbuf->vcb->buffer, datalen);
          }
  }
  
  /*
!  * Duplcate a SID in the heap.
   */
- smb_sid_t *
- ndr_heap_siddup(ndr_heap_t *heap, smb_sid_t *sid)
- {
-         smb_sid_t *new_sid;
-         unsigned size;
  
-         if (sid == NULL)
-                 return (NULL);
- 
-         size = smb_sid_len(sid);
- 
-         if ((new_sid = ndr_heap_malloc(heap, size)) == NULL)
-                 return (NULL);
- 
-         bcopy(sid, new_sid, size);
-         return (new_sid);
- }
- 
  int
  ndr_heap_used(ndr_heap_t *heap)
  {
          int used = 0;
          int i;
--- 286,298 ----
                  bcopy(data, vcbuf->vcb->buffer, datalen);
          }
  }
  
  /*
!  * Removed ndr_heap_siddup(), now using ndr_heap_dupmem().
   */
  
  int
  ndr_heap_used(ndr_heap_t *heap)
  {
          int used = 0;
          int i;