Removed version number from file header.
[samba.git] / source3 / rpc_parse / parse_prs.c
index d34465e8b4bbae6c36a6362b94e0fe80eb41b7d3..2deefd362a2fdf2ab72d96051eab9a3cbc078af7 100644 (file)
@@ -1,6 +1,5 @@
 /* 
-   Unix SMB/Netbios implementation.
-   Version 1.9.
+   Unix SMB/CIFS implementation.
    Samba memory buffer functions
    Copyright (C) Andrew Tridgell              1992-1997
    Copyright (C) Luke Kenneth Casson Leighton 1996-1997
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */
 
-extern int DEBUGLEVEL;
-
 #include "includes.h"
 
-
-/*******************************************************************
-dump a prs to a file
- ********************************************************************/
+/**
+ * Dump a prs to a file: from the current location through to the end.
+ **/
 void prs_dump(char *name, int v, prs_struct *ps)
+{
+       prs_dump_region(name, v, ps, ps->data_offset, ps->buffer_size);
+}
+
+
+/**
+ * Dump from the start of the prs to the current location.
+ **/
+void prs_dump_before(char *name, int v, prs_struct *ps)
+{
+       prs_dump_region(name, v, ps, 0, ps->data_offset);
+}
+
+
+/**
+ * Dump everything from the start of the prs up to the current location.
+ **/
+void prs_dump_region(char *name, int v, prs_struct *ps,
+                    int from_off, int to_off)
 {
        int fd, i;
        pstring fname;
@@ -44,7 +59,7 @@ void prs_dump(char *name, int v, prs_struct *ps)
                if (fd != -1 || errno != EEXIST) break;
        }
        if (fd != -1) {
-               write(fd, ps->data_p + ps->data_offset, ps->buffer_size - ps->data_offset);
+               write(fd, ps->data_p + from_off, to_off - from_off);
                close(fd);
                DEBUG(0,("created %s\n", fname));
        }
@@ -64,9 +79,14 @@ void prs_debug(prs_struct *ps, int depth, char *desc, char *fn_name)
 }
 
 
-/*******************************************************************
- Initialise a parse structure - malloc the data if requested.
- ********************************************************************/
+/**
+ * Initialise an expandable parse structure.
+ *
+ * @param size Initial buffer size.  If >0, a new buffer will be
+ * created with malloc().
+ *
+ * @return False if allocation fails, otherwise True.
+ **/
 BOOL prs_init(prs_struct *ps, uint32 size, TALLOC_CTX *ctx, BOOL io)
 {
        ZERO_STRUCTP(ps);
@@ -85,6 +105,7 @@ BOOL prs_init(prs_struct *ps, uint32 size, TALLOC_CTX *ctx, BOOL io)
                        DEBUG(0,("prs_init: malloc fail for %u bytes.\n", (unsigned int)size));
                        return False;
                }
+               memset(ps->data_p, '\0', (size_t)size);
                ps->is_dynamic = True; /* We own this memory. */
        }
 
@@ -116,14 +137,22 @@ BOOL prs_read(prs_struct *ps, int fd, size_t len, int timeout)
 
 void prs_mem_free(prs_struct *ps)
 {
-       if(ps->is_dynamic && (ps->data_p != NULL))
-               free(ps->data_p);
+       if(ps->is_dynamic)
+               SAFE_FREE(ps->data_p);
        ps->is_dynamic = False;
-       ps->data_p = NULL;
        ps->buffer_size = 0;
        ps->data_offset = 0;
 }
 
+/*******************************************************************
+ Clear the memory in a parse structure.
+ ********************************************************************/
+
+void prs_mem_clear(prs_struct *ps)
+{
+       memset(ps->data_p, '\0', (size_t)ps->buffer_size);
+}
+
 /*******************************************************************
  Allocate memory when unmarshalling... Always zero clears.
  ********************************************************************/
@@ -240,7 +269,7 @@ BOOL prs_grow(prs_struct *ps, uint32 extra_space)
                        DEBUG(0,("prs_grow: Malloc failure for size %u.\n", (unsigned int)new_size));
                        return False;
                }
-               memset(new_data, '\0', new_size );
+               memset(new_data, '\0', (size_t)new_size );
        } else {
                /*
                 * If the current buffer size is bigger than the space needed, just 
@@ -254,7 +283,7 @@ BOOL prs_grow(prs_struct *ps, uint32 extra_space)
                        return False;
                }
 
-               memset(&new_data[ps->buffer_size], '\0', new_size - ps->buffer_size);
+               memset(&new_data[ps->buffer_size], '\0', (size_t)(new_size - ps->buffer_size));
        }
        ps->buffer_size = new_size;
        ps->data_p = new_data;
@@ -285,7 +314,7 @@ BOOL prs_force_grow(prs_struct *ps, uint32 extra_space)
                return False;
        }
 
-       memset(&new_data[ps->buffer_size], '\0', new_size - ps->buffer_size);
+       memset(&new_data[ps->buffer_size], '\0', (size_t)(new_size - ps->buffer_size));
 
        ps->buffer_size = new_size;
        ps->data_p = new_data;
@@ -850,12 +879,12 @@ BOOL prs_buffer2(BOOL charmode, char *name, prs_struct *ps, int depth, BUFFER2 *
 BOOL prs_string2(BOOL charmode, char *name, prs_struct *ps, int depth, STRING2 *str)
 {
        int i;
-       char *q = prs_mem_get(ps, str->str_str_len);
+       char *q = prs_mem_get(ps, str->str_max_len);
        if (q == NULL)
                return False;
 
        if (UNMARSHALLING(ps)) {
-               str->buffer = (unsigned char *)prs_alloc_mem(ps,str->str_str_len);
+               str->buffer = (unsigned char *)prs_alloc_mem(ps,str->str_max_len);
                if (str->buffer == NULL)
                        return False;
        }