Made request tracing more robust against bogus lengths.

diff --git a/server/registry.c b/server/registry.c
index ef5ccad..f31237a 100644
--- a/server/registry.c
+++ b/server/registry.c
@@ -308,10 +308,10 @@
 }
 
 /* duplicate a Unicode string from the request buffer */
-static WCHAR *req_strdupW( const WCHAR *str )
+static WCHAR *req_strdupW( const void *req, const WCHAR *str )
 {
     WCHAR *name;
-    size_t len = get_req_strlenW( str );
+    size_t len = get_req_strlenW( req, str );
     if ((name = mem_alloc( (len + 1) * sizeof(WCHAR) )) != NULL)
     {
         memcpy( name, str, len * sizeof(WCHAR) );
@@ -741,7 +741,6 @@
     else
     {
         *type = -1;
-        *len = 0;
         set_error( STATUS_OBJECT_NAME_NOT_FOUND );
     }
 }
@@ -751,12 +750,7 @@
 {
     struct key_value *value;
 
-    if (i < 0 || i > key->last_value)
-    {
-        name[0] = 0;
-        *len = 0;
-        set_error( STATUS_NO_MORE_ENTRIES );
-    }
+    if (i < 0 || i > key->last_value) set_error( STATUS_NO_MORE_ENTRIES );
     else
     {
         value = &key->values[i];
@@ -1378,7 +1372,7 @@
     req->hkey = -1;
     if ((parent = get_hkey_obj( req->parent, KEY_CREATE_SUB_KEY )))
     {
-        if ((class = req_strdupW( req->class )))
+        if ((class = req_strdupW( req, req->class )))
         {
             if ((key = create_key( parent, req->name, sizeof(req->name), class, req->options,
                                    req->modif, &req->created )))
@@ -1436,6 +1430,7 @@
 {
     struct key *key;
 
+    req->name[0] = req->class[0] = 0;
     if ((key = get_hkey_obj( req->hkey, KEY_ENUMERATE_SUB_KEYS )))
     {
         enum_key( key, req->index, req->name, req->class, &req->modif );
@@ -1448,6 +1443,7 @@
 {
     struct key *key;
 
+    req->name[0] = req->class[0] = 0;
     if ((key = get_hkey_obj( req->hkey, KEY_QUERY_VALUE )))
     {
         query_key( key, req );
@@ -1459,7 +1455,7 @@
 DECL_HANDLER(set_key_value)
 {
     struct key *key;
-    int max = get_req_size( req->data, sizeof(req->data[0]) );
+    int max = get_req_size( req, req->data, sizeof(req->data[0]) );
     int datalen = req->len;
     if (datalen > max)
     {
@@ -1478,6 +1474,7 @@
 {
     struct key *key;
 
+    req->len = 0;
     if ((key = get_hkey_obj( req->hkey, KEY_QUERY_VALUE )))
     {
         get_value( key, copy_path( req->name ), &req->type, &req->len, req->data );
@@ -1490,6 +1487,8 @@
 {
     struct key *key;
 
+    req->len = 0;
+    req->name[0] = 0;
     if ((key = get_hkey_obj( req->hkey, KEY_QUERY_VALUE )))
     {
         enum_value( key, req->index, req->name, &req->type, &req->len, req->data );
@@ -1505,7 +1504,7 @@
 
     if ((key = get_hkey_obj( req->hkey, KEY_SET_VALUE )))
     {
-        if ((name = req_strdupW( req->name )))
+        if ((name = req_strdupW( req, req->name )))
         {
             delete_value( key, name );
             free( name );