The branch, master has been updated
       via  47aa9ed lib/util: skip single hex digit at the end of the input 
sting - fix potential segfault
       via  cb47890 lib/util: fix function header comment to strhex_to_str()
       via  5d91a26 lib/util: untangle assignent from check in strhex_to_str()
       via  196fd14 s3-util: dbwrap_tool: add fetch fuctions for hex and string
       via  140b5d7 s3-util: dbwrap_tool: add store hex function
       via  4874e1f selftest:Samba3: fix signature for check_or_start()
       via  dd6b413 selftest:Samba3: fix a message printed when starting 
winbindd
      from  605d7d9 pdb-interface: Do not use unid_t here

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 47aa9ed82f67758c3b4d9ab46dd8dd65508a10eb
Author: Michael Adam <ob...@samba.org>
Date:   Tue Oct 18 18:10:00 2011 +0200

    lib/util: skip single hex digit at the end of the input sting - fix 
potential segfault
    
    The second of two digits was read without checking for the length of the 
input
    string. For a non-zero-terminated input string, this might have caused a
    segfault.
    
    Autobuild-User: Michael Adam <ob...@samba.org>
    Autobuild-Date: Tue Oct 18 22:32:59 CEST 2011 on sn-devel-104

commit cb47890cf2734afff502cf8b95635ebc75bc5974
Author: Michael Adam <ob...@samba.org>
Date:   Tue Oct 18 18:07:54 2011 +0200

    lib/util: fix function header comment to strhex_to_str()
    
    The description did not match the function's behaviour.

commit 5d91a2680e594d47ed137b45f79738bddb641cea
Author: Michael Adam <ob...@samba.org>
Date:   Tue Oct 18 18:03:10 2011 +0200

    lib/util: untangle assignent from check in strhex_to_str()

commit 196fd147888efec3e1f79efd1e54f5a99e3dd544
Author: Björn Baumbach <b...@sernet.de>
Date:   Mon Oct 17 16:08:38 2011 +0200

    s3-util: dbwrap_tool: add fetch fuctions for hex and string
    
    Signed-off-by: Michael Adam <ob...@samba.org>

commit 140b5d790a8d87eb59e117ad25c7c441f887d6fc
Author: Björn Baumbach <b...@sernet.de>
Date:   Mon Oct 17 16:05:52 2011 +0200

    s3-util: dbwrap_tool: add store hex function
    
    Allows the user to store hex blobs in a tdb.
    
    Signed-off-by: Michael Adam <ob...@samba.org>

commit 4874e1f5b3a4b959050012d5135be7c1df38552b
Author: Michael Adam <ob...@samba.org>
Date:   Tue Oct 18 11:37:25 2011 +0200

    selftest:Samba3: fix signature for check_or_start()

commit dd6b413a57f76abb92110fcce67c957084db80b3
Author: Michael Adam <ob...@samba.org>
Date:   Tue Oct 18 11:34:22 2011 +0200

    selftest:Samba3: fix a message printed when starting winbindd

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

Summary of changes:
 lib/util/util.c             |   28 ++++++-----
 selftest/target/Samba3.pm   |    4 +-
 source3/utils/dbwrap_tool.c |  107 +++++++++++++++++++++++++++++++++++++++++-
 3 files changed, 122 insertions(+), 17 deletions(-)


Changeset truncated at 500 lines:

diff --git a/lib/util/util.c b/lib/util/util.c
index b700f37..133bd0d 100644
--- a/lib/util/util.c
+++ b/lib/util/util.c
@@ -689,15 +689,15 @@ _PUBLIC_ _PURE_ size_t count_chars(const char *s, char c)
 }
 
 /**
- Routine to get hex characters and turn them into a 16 byte array.
- the array can be variable length, and any non-hex-numeric
- characters are skipped.  "0xnn" or "0Xnn" is specially catered
- for.
-
- valid examples: "0A5D15"; "0x15, 0x49, 0xa2"; "59\ta9\te3\n"
-
-
-**/
+ * Routine to get hex characters and turn them into a byte array.
+ * the array can be variable length.
+ * -  "0xnn" or "0Xnn" is specially catered for.
+ * - The first non-hex-digit character (apart from possibly leading "0x"
+ *   finishes the conversion and skips the rest of the input.
+ * - A single hex-digit character at the end of the string is skipped.
+ *
+ * valid examples: "0A5D15"; "0x123456"
+ */
 _PUBLIC_ size_t strhex_to_str(char *p, size_t p_len, const char *strhex, 
size_t strhex_len)
 {
        size_t i = 0;
@@ -711,14 +711,18 @@ _PUBLIC_ size_t strhex_to_str(char *p, size_t p_len, 
const char *strhex, size_t
                i += 2; /* skip two chars */
        }
 
-       for (; i < strhex_len && strhex[i] != 0; i++) {
-               if (!(p1 = strchr(hexchars, toupper((unsigned char)strhex[i]))))
+       for (; i+1 < strhex_len && strhex[i] != 0 && strhex[i+1] != 0; i++) {
+               p1 = strchr(hexchars, toupper((unsigned char)strhex[i]));
+               if (p1 == NULL) {
                        break;
+               }
 
                i++; /* next hex digit */
 
-               if (!(p2 = strchr(hexchars, toupper((unsigned char)strhex[i]))))
+               p2 = strchr(hexchars, toupper((unsigned char)strhex[i]));
+               if (p2 == NULL) {
                        break;
+               }
 
                /* get the two nybbles */
                hinybble = PTR_DIFF(p1, hexchars);
diff --git a/selftest/target/Samba3.pm b/selftest/target/Samba3.pm
index c17455d..2f23ae3 100755
--- a/selftest/target/Samba3.pm
+++ b/selftest/target/Samba3.pm
@@ -556,7 +556,7 @@ sub read_pid($$)
        return $pid;
 }
 
-sub check_or_start($$$$) {
+sub check_or_start($$$$$) {
        my ($self, $env_vars, $nmbd, $winbindd, $smbd) = @_;
 
        unlink($env_vars->{NMBD_TEST_LOG});
@@ -646,7 +646,7 @@ sub check_or_start($$$$) {
                        @preargs = split(/ /, $ENV{WINBINDD_VALGRIND});
                }
 
-               print "Starting winbindd with config 
$env_vars->{SERVERCONFFILE})\n";
+               print "Starting winbindd with config 
$env_vars->{SERVERCONFFILE}\n";
 
                exec(@preargs, Samba::bindir_path($self, "winbindd"), "-F", 
"--no-process-group", "--stdout", "-s", $env_vars->{SERVERCONFFILE}, @optargs) 
or die("Unable to start winbindd: $!");
        }
diff --git a/source3/utils/dbwrap_tool.c b/source3/utils/dbwrap_tool.c
index 5d30c93..84ff3a1 100644
--- a/source3/utils/dbwrap_tool.c
+++ b/source3/utils/dbwrap_tool.c
@@ -30,7 +30,7 @@
 
 typedef enum { OP_FETCH, OP_STORE, OP_DELETE, OP_ERASE, OP_LISTKEYS } 
dbwrap_op;
 
-typedef enum { TYPE_INT32, TYPE_UINT32, TYPE_STRING } dbwrap_type;
+typedef enum { TYPE_INT32, TYPE_UINT32, TYPE_STRING, TYPE_HEX } dbwrap_type;
 
 static int dbwrap_tool_fetch_int32(struct db_context *db,
                                   const char *keyname,
@@ -68,6 +68,65 @@ static int dbwrap_tool_fetch_uint32(struct db_context *db,
        }
 }
 
+static int dbwrap_tool_fetch_string(struct db_context *db,
+                                   const char *keyname,
+                                   const char *data)
+{
+       TDB_DATA tdbdata;
+       NTSTATUS status;
+       TALLOC_CTX *tmp_ctx = talloc_stackframe();
+       int ret;
+
+       status = dbwrap_fetch_bystring(db, tmp_ctx, keyname, &tdbdata);
+       if (NT_STATUS_IS_OK(status)) {
+               d_printf("%*.*s\n", (int)tdbdata.dsize-1, (int)tdbdata.dsize-1,
+                        tdbdata.dptr);
+               ret = 0;
+       } else {
+               d_fprintf(stderr, "ERROR: could not fetch string key '%s': "
+                         "%s\n", nt_errstr(status), keyname);
+               ret = -1;
+       }
+
+       talloc_free(tmp_ctx);
+       return ret;
+}
+
+static int dbwrap_tool_fetch_hex(struct db_context *db,
+                                const char *keyname,
+                                const char *data)
+{
+       TDB_DATA tdbdata;
+       DATA_BLOB datablob;
+       NTSTATUS status;
+       TALLOC_CTX *tmp_ctx = talloc_stackframe();
+       char *hex_string;
+       int ret;
+
+       status = dbwrap_fetch_bystring(db, tmp_ctx, keyname, &tdbdata);
+       if (NT_STATUS_IS_OK(status)) {
+               datablob.data = tdbdata.dptr;
+               datablob.length = tdbdata.dsize;
+
+               hex_string = data_blob_hex_string_upper(tmp_ctx, &datablob);
+               if (hex_string == NULL) {
+                       d_fprintf(stderr, "ERROR: could not get hex string "
+                                 "from data blob\n");
+                       ret = -1;
+               } else {
+                       d_printf("%s\n", hex_string);
+                       ret =  0;
+               }
+       } else {
+               d_fprintf(stderr, "ERROR: could not fetch hex key '%s': "
+                         "%s\n", nt_errstr(status), keyname);
+               ret = -1;
+       }
+
+       talloc_free(tmp_ctx);
+       return ret;
+}
+
 static int dbwrap_tool_store_int32(struct db_context *db,
                                   const char *keyname,
                                   const char *data)
@@ -124,6 +183,42 @@ static int dbwrap_tool_store_string(struct db_context *db,
        return 0;
 }
 
+static int dbwrap_tool_store_hex(struct db_context *db,
+                                   const char *keyname,
+                                   const char *data)
+{
+       NTSTATUS status;
+       DATA_BLOB datablob;
+       TDB_DATA tdbdata;
+       TALLOC_CTX *tmp_ctx = talloc_stackframe();
+
+       datablob = strhex_to_data_blob(tmp_ctx, data);
+       if(strlen(data) > 0 && datablob.length == 0) {
+               d_fprintf(stderr,
+                         "ERROR: could not convert hex string to data blob\n"
+                         "       Not a valid hex string?\n");
+               talloc_free(tmp_ctx);
+               return -1;
+       }
+
+       tdbdata.dptr = (unsigned char *)datablob.data;
+       tdbdata.dsize = datablob.length;
+
+       status = dbwrap_trans_store_bystring(db, keyname,
+                                            tdbdata,
+                                            TDB_REPLACE);
+       if (!NT_STATUS_IS_OK(status)) {
+               d_fprintf(stderr,
+                         "ERROR: could not store string key '%s': %s\n",
+                         keyname, nt_errstr(status));
+               talloc_free(tmp_ctx);
+               return -1;
+       }
+
+       talloc_free(tmp_ctx);
+       return 0;
+}
+
 static int dbwrap_tool_delete(struct db_context *db,
                              const char *keyname,
                              const char *data)
@@ -213,9 +308,12 @@ struct dbwrap_op_dispatch_table {
 struct dbwrap_op_dispatch_table dispatch_table[] = {
        { OP_FETCH,  TYPE_INT32,  dbwrap_tool_fetch_int32 },
        { OP_FETCH,  TYPE_UINT32, dbwrap_tool_fetch_uint32 },
+       { OP_FETCH,  TYPE_STRING, dbwrap_tool_fetch_string },
+       { OP_FETCH,  TYPE_HEX,    dbwrap_tool_fetch_hex },
        { OP_STORE,  TYPE_INT32,  dbwrap_tool_store_int32 },
        { OP_STORE,  TYPE_UINT32, dbwrap_tool_store_uint32 },
        { OP_STORE,  TYPE_STRING, dbwrap_tool_store_string },
+       { OP_STORE,  TYPE_HEX,    dbwrap_tool_store_hex },
        { OP_DELETE, TYPE_INT32,  dbwrap_tool_delete },
        { OP_ERASE,  TYPE_INT32,  dbwrap_tool_erase },
        { OP_LISTKEYS, TYPE_INT32, dbwrap_tool_listkeys },
@@ -280,7 +378,7 @@ int main(int argc, const char **argv)
                d_fprintf(stderr,
                          "USAGE: %s <database> <op> [<key> [<type> 
[<value>]]]\n"
                          "       ops: fetch, store, delete, erase, listkeys\n"
-                         "       types: int32, uint32, string\n",
+                         "       types: int32, uint32, string, hex\n",
                         argv[0]);
                goto done;
        }
@@ -343,9 +441,12 @@ int main(int argc, const char **argv)
                type = TYPE_UINT32;
        } else if (strcmp(keytype, "string") == 0) {
                type = TYPE_STRING;
+       } else if (strcmp(keytype, "hex") == 0) {
+               type = TYPE_HEX;
        } else {
                d_fprintf(stderr, "ERROR: invalid type '%s' specified.\n"
-                                 "       supported types: int32, uint32, 
string\n",
+                                 "       supported types: int32, uint32, "
+                                 "string, hex\n",
                                  keytype);
                goto done;
        }


-- 
Samba Shared Repository

Reply via email to