Make regsubkey_ctr_addkey return WERROR. Nobody checks this so far, but this
[metze/old/v3-2-winbind-ndr.git] / source / registry / reg_objects.c
index 83fd85658fbf3702ae37eb7a9781bd004d3464d6..94b7a4df9506f605ed85b2c92d07f77f969f4e7f 100644 (file)
  Add a new key to the array
  **********************************************************************/
 
-int regsubkey_ctr_addkey( REGSUBKEY_CTR *ctr, const char *keyname )
+WERROR regsubkey_ctr_addkey( REGSUBKEY_CTR *ctr, const char *keyname )
 {
-       if ( !keyname )
-               return ctr->num_subkeys;
+       char **newkeys;
+
+       if ( !keyname ) {
+               return WERR_OK;
+       }
 
        /* make sure the keyname is not already there */
 
-       if ( regsubkey_ctr_key_exists( ctr, keyname ) )
-               return ctr->num_subkeys;
-               
-       /* allocate a space for the char* in the array */
-               
-       if (ctr->subkeys == NULL) {
-               ctr->subkeys = TALLOC_P(ctr, char *);
-       } else {
-               ctr->subkeys = TALLOC_REALLOC_ARRAY(ctr, ctr->subkeys, char *, ctr->num_subkeys+1);
+       if ( regsubkey_ctr_key_exists( ctr, keyname ) ) {
+               return WERR_OK;
        }
 
-       if (!ctr->subkeys) {
-               ctr->num_subkeys = 0;
-               return 0;
+       if (!(newkeys = TALLOC_REALLOC_ARRAY(ctr, ctr->subkeys, char *,
+                                            ctr->num_subkeys+1))) {
+               return WERR_NOMEM;
        }
 
-       /* allocate the string and save it in the array */
-       
-       ctr->subkeys[ctr->num_subkeys] = talloc_strdup( ctr, keyname );
+       ctr->subkeys = newkeys;
+
+       if (!(ctr->subkeys[ctr->num_subkeys] = talloc_strdup(ctr->subkeys,
+                                                            keyname ))) {
+               /*
+                * Don't shrink the new array again, this wastes a pointer
+                */
+               return WERR_NOMEM;
+       }
        ctr->num_subkeys++;
-       
-       return ctr->num_subkeys;
+
+       return WERR_OK;
 }
  
  /***********************************************************************