r23801: The FSF has moved around a lot. This fixes their Mass Ave address.
[bbaumbach/samba-autobuild/.git] / source3 / registry / reg_objects.c
index 83fd85658fbf3702ae37eb7a9781bd004d3464d6..aebf0142eec15a2fa55e7c1689e579d63593916a 100644 (file)
@@ -5,7 +5,7 @@
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
+ *  the Free Software Foundation; either version 3 of the License, or
  *  (at your option) any later version.
  *  
  *  This program is distributed in the hope that it will be useful,
@@ -14,8 +14,7 @@
  *  GNU General Public License for more details.
  *  
  *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *  along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
 
 /* Implementation of registry frontend view functions. */
  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;
 }
  
  /***********************************************************************
Add a new key to the array
Delete a key from the array
  **********************************************************************/
 
 int regsubkey_ctr_delkey( REGSUBKEY_CTR *ctr, const char *keyname )
@@ -308,8 +309,16 @@ int regval_ctr_addvalue( REGVAL_CTR *ctr, const char *name, uint16 type,
        
        fstrcpy( ctr->values[ctr->num_values]->valuename, name );
        ctr->values[ctr->num_values]->type = type;
-       ctr->values[ctr->num_values]->data_p = (uint8 *)TALLOC_MEMDUP(
-               ctr, data_p, size );
+       if (size) {
+               ctr->values[ctr->num_values]->data_p = (uint8 *)TALLOC_MEMDUP(
+                       ctr, data_p, size );
+               if (!ctr->values[ctr->num_values]->data_p) {
+                       ctr->num_values = 0;
+                       return 0;
+               }
+       } else {
+               ctr->values[ctr->num_values]->data_p = NULL;
+       }
        ctr->values[ctr->num_values]->size = size;
        ctr->num_values++;
 
@@ -348,8 +357,16 @@ int regval_ctr_copyvalue( REGVAL_CTR *ctr, REGISTRY_VALUE *val )
        
                fstrcpy( ctr->values[ctr->num_values]->valuename, val->valuename );
                ctr->values[ctr->num_values]->type = val->type;
-               ctr->values[ctr->num_values]->data_p = (uint8 *)TALLOC_MEMDUP(
-                       ctr, val->data_p, val->size );
+               if (val->size) {
+                       ctr->values[ctr->num_values]->data_p = (uint8 *)TALLOC_MEMDUP(
+                               ctr, val->data_p, val->size );
+                       if (!ctr->values[ctr->num_values]->data_p) {
+                               ctr->num_values = 0;
+                               return 0;
+                       }
+               } else {
+                       ctr->values[ctr->num_values]->data_p = NULL;
+               }
                ctr->values[ctr->num_values]->size = val->size;
                ctr->num_values++;
        }