r182: Fix a couple of segfaults
authorJelmer Vernooij <jelmer@samba.org>
Mon, 12 Apr 2004 18:02:54 +0000 (18:02 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 17:51:15 +0000 (12:51 -0500)
(This used to be commit db5d7062e69b456a89b17525e5a0177f93c90c83)

source4/lib/registry/TODO
source4/lib/registry/common/reg_objects.c
source4/lib/registry/common/reg_util.c
source4/lib/registry/reg_backend_w95/reg_backend_w95.c

index f84b1c53393472c1ab292ad8c5c5f002014d9424..9b0dbe4c717906bec9f45a4fcdf25059a8f4b3a9 100644 (file)
@@ -4,6 +4,9 @@
 
 reg_backend_dir:
  - value support
+
+reg_backend_w95.c:
+ - write support
  
 reg_backend_nt4:
  - write support
index 78260e198fd45aa1d2d471488b8b9431f36f4832..3f721c107eef27950a4a5b94f572fb779c905443 100644 (file)
@@ -47,6 +47,9 @@ void reg_val_free( REG_VAL *val )
        if ( !val )
                return;
 
+       val->ref--;
+       if(val->ref) return;
+
        if(val->handle->functions->free_val_backend_data)
                val->handle->functions->free_val_backend_data(val);
                
index 5ca104fc2ef8c19dafb9a1e4ea0d4f0820225cdb..82b8d066798513f75a508d8a83e440d33a3de4d6 100644 (file)
@@ -45,10 +45,10 @@ char *reg_val_data_string(REG_VAL *v)
   switch (reg_val_type(v)) {
   case REG_SZ:
          /* FIXME: Convert to ascii */
-         return strdup(reg_val_data_blk(v));
+         return strndup(reg_val_data_blk(v), reg_val_size(v));
 
   case REG_EXPAND_SZ:
-         return strdup(reg_val_data_blk(v));
+         return strndup(reg_val_data_blk(v), reg_val_size(v));
 
   case REG_BINARY:
          ret = malloc(reg_val_size(v) * 3 + 2);
index 0b6b6db358c30d8102a8a44f565e7f5d67fb18b8..31abd698545de4e71aae747dd915e00ddd99d677 100644 (file)
@@ -204,6 +204,10 @@ static WERROR w95_get_subkey_by_index (REG_KEY *parent, int n, REG_KEY **key)
                        RGDB_KEY *rgdb_key;
                        char *name;
                        rgdb_key = LOCN_RGDB_KEY(creg, child->id.rgdb, child->id.id);
+                       if(!rgdb_key) {
+                               DEBUG(0, ("Can't find %d,%d in RGDB table!\n", child->id.rgdb, child->id.id));
+                               return WERR_FOOBAR;
+                       }
                        name = strndup((char *)rgdb_key + sizeof(RGDB_KEY), rgdb_key->name_len);
                        *key = reg_key_new_rel(name, parent, child);
                        SAFE_FREE(name);