The branch, v3-2-test has been updated
       via  7722a7d2c63f84b8105aa775b39f0ceedd4ed513 (commit)
      from  98d86dcbd898f48748bbfbe1066a7014d25392d1 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-2-test


- Log -----------------------------------------------------------------
commit 7722a7d2c63f84b8105aa775b39f0ceedd4ed513
Author: Jeremy Allison <[EMAIL PROTECTED]>
Date:   Mon Dec 3 14:54:06 2007 -0800

    Change tdb_unpack "P" to return a malloc'ed string rather
    than expect a pstring space to put data into.
    Fix the (few) callers.
    Jeremy.

-----------------------------------------------------------------------

Summary of changes:
 source/lib/util_tdb.c         |   19 +++++++++----------
 source/passdb/secrets.c       |    7 ++++++-
 source/printing/nt_printing.c |    8 +++++++-
 source/printing/printing.c    |   10 +++++++---
 4 files changed, 29 insertions(+), 15 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source/lib/util_tdb.c b/source/lib/util_tdb.c
index 35c1a92..ce2cb42 100644
--- a/source/lib/util_tdb.c
+++ b/source/lib/util_tdb.c
@@ -561,14 +561,14 @@ int tdb_unpack(const uint8 *buf, int bufsize, const char 
*fmt, ...)
        int len;
        int *i;
        void **p;
-       char *s, **b;
+       char *s, **b, **ps;
        char c;
        const uint8 *buf0 = buf;
        const char *fmt0 = fmt;
        int bufsize0 = bufsize;
 
        va_start(ap, fmt);
-       
+
        while (*fmt) {
                switch ((c=*fmt++)) {
                case 'b':
@@ -597,7 +597,7 @@ int tdb_unpack(const uint8 *buf, int bufsize, const char 
*fmt, ...)
                        p = va_arg(ap, void **);
                        if (bufsize < len)
                                goto no_space;
-                       /* 
+                       /*
                         * This isn't a real pointer - only a token (1 or 0)
                         * to mark the fact a pointer is present.
                         */
@@ -605,11 +605,10 @@ int tdb_unpack(const uint8 *buf, int bufsize, const char 
*fmt, ...)
                        *p = (void *)(IVAL(buf, 0) ? (void *)1 : NULL);
                        break;
                case 'P':
-                       s = va_arg(ap,char *);
+                       /* Return malloc'ed string. */
+                       ps = va_arg(ap,char **);
                        len = strlen((const char *)buf) + 1;
-                       if (bufsize < len || len > sizeof(pstring))
-                               goto no_space;
-                       memcpy(s, buf, len);
+                       *ps = SMB_STRDUP((const char *)buf);
                        break;
                case 'f':
                        s = va_arg(ap,char *);
@@ -638,7 +637,7 @@ int tdb_unpack(const uint8 *buf, int bufsize, const char 
*fmt, ...)
                        memcpy(*b, buf+4, *i);
                        break;
                default:
-                       DEBUG(0,("Unknown tdb_unpack format %c in %s\n", 
+                       DEBUG(0,("Unknown tdb_unpack format %c in %s\n",
                                 c, fmt));
 
                        len = 0;
@@ -651,7 +650,7 @@ int tdb_unpack(const uint8 *buf, int bufsize, const char 
*fmt, ...)
 
        va_end(ap);
 
-       DEBUG(18,("tdb_unpack(%s, %d) -> %d\n", 
+       DEBUG(18,("tdb_unpack(%s, %d) -> %d\n",
                 fmt0, bufsize0, (int)PTR_DIFF(buf, buf0)));
 
        return PTR_DIFF(buf, buf0);
@@ -673,7 +672,7 @@ static void tdb_log(TDB_CONTEXT *tdb, enum tdb_debug_level 
level, const char *fo
        va_start(ap, format);
        vasprintf(&ptr, format, ap);
        va_end(ap);
-       
+
        if (!ptr || !*ptr)
                return;
 
diff --git a/source/passdb/secrets.c b/source/passdb/secrets.c
index c760198..eee8aae 100644
--- a/source/passdb/secrets.c
+++ b/source/passdb/secrets.c
@@ -484,6 +484,7 @@ static size_t tdb_trusted_dom_pass_unpack(uint8 *pack_buf, 
int bufsize,
                                          TRUSTED_DOM_PASS* pass)
 {
        int idx, len = 0;
+       char *passp = NULL;
 
        if (!pack_buf || !pass) return -1;
 
@@ -495,7 +496,11 @@ static size_t tdb_trusted_dom_pass_unpack(uint8 *pack_buf, 
int bufsize,
                                   &pass->uni_name[idx]);
 
        len += tdb_unpack(pack_buf + len, bufsize - len, "dPd",
-                         &pass->pass_len, &pass->pass, &pass->mod_time);
+                         &pass->pass_len, &passp, &pass->mod_time);
+       if (passp) {
+               fstrcpy(pass->pass, passp);
+       }
+       SAFE_FREE(passp);
 
        /* unpack domain sid */
        len += tdb_sid_unpack(pack_buf + len, bufsize - len,
diff --git a/source/printing/nt_printing.c b/source/printing/nt_printing.c
index c55f9f1..afa4bc2 100644
--- a/source/printing/nt_printing.c
+++ b/source/printing/nt_printing.c
@@ -4017,6 +4017,7 @@ static WERROR get_a_printer_2(NT_PRINTER_INFO_LEVEL_2 
*info, const char *servern
        TDB_DATA kbuf, dbuf;
        fstring printername;
        char adevice[MAXDEVICENAME];
+       char *comment = NULL;
 
        kbuf = make_printer_tdbkey(talloc_tos(), sharename);
 
@@ -4042,13 +4043,18 @@ static WERROR get_a_printer_2(NT_PRINTER_INFO_LEVEL_2 
*info, const char *servern
                        info->sharename,
                        info->portname,
                        info->drivername,
-                       info->comment,
+                       &comment,
                        info->location,
                        info->sepfile,
                        info->printprocessor,
                        info->datatype,
                        info->parameters);
 
+       if (comment) {
+               strlcpy(info->comment, comment, sizeof(info->comment));
+               SAFE_FREE(comment);
+       }
+
        /* Samba has to have shared raw drivers. */
        info->attributes |= PRINTER_ATTRIBUTE_SAMBA;
        info->attributes &= ~PRINTER_ATTRIBUTE_NOT_SAMBA;
diff --git a/source/printing/printing.c b/source/printing/printing.c
index d331e89..1613828 100644
--- a/source/printing/printing.c
+++ b/source/printing/printing.c
@@ -1352,17 +1352,19 @@ static void print_queue_receive(struct 
messaging_context *msg,
                                DATA_BLOB *data)
 {
        fstring sharename;
-       pstring lpqcommand, lprmcommand;
+       char *lpqcommand = NULL, *lprmcommand = NULL;
        int printing_type;
        size_t len;
 
        len = tdb_unpack( (uint8 *)data->data, data->length, "fdPP",
                sharename,
                &printing_type,
-               lpqcommand,
-               lprmcommand );
+               &lpqcommand,
+               &lprmcommand );
 
        if ( len == -1 ) {
+               SAFE_FREE(lpqcommand);
+               SAFE_FREE(lprmcommand);
                DEBUG(0,("print_queue_receive: Got invalid print queue update 
message\n"));
                return;
        }
@@ -1371,6 +1373,8 @@ static void print_queue_receive(struct messaging_context 
*msg,
                get_printer_fns_from_type((enum printing_types)printing_type),
                lpqcommand, lprmcommand );
 
+       SAFE_FREE(lpqcommand);
+       SAFE_FREE(lprmcommand);
        return;
 }
 


-- 
Samba Shared Repository

Reply via email to