r22588: Make all uses of TALLOC_MEMDUP consistent.
authorJeremy Allison <jra@samba.org>
Mon, 30 Apr 2007 01:34:28 +0000 (01:34 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 17:19:48 +0000 (12:19 -0500)
Jeremy.
(This used to be commit 8ad13718af0ba1fcb10a6f1631b1ed3cb8d11175)

source3/libmsrpc/libmsrpc_internal.c
source3/locking/brlock.c
source3/registry/reg_objects.c
source3/rpc_client/cli_spoolss.c
source3/rpc_parse/parse_spoolss.c
source3/rpc_server/srv_spoolss_nt.c
source3/rpcclient/cmd_spoolss.c
source3/utils/net_rpc_printer.c

index a86cde178d6e83cf9c399e021d9c48a152bbb20b..64e6332e804a2b27118ce01c5ea9d240077a05cc 100644 (file)
@@ -264,13 +264,16 @@ REG_VALUE_DATA *cac_MakeRegValueData( TALLOC_CTX * mem_ctx, uint32 data_type,
 
                data->reg_binary.data_length = size;
 
-               data->reg_binary.data =
-                       ( uint8 * ) TALLOC_MEMDUP( mem_ctx, buf.buffer,
-                                                  size );
-               if ( !data->reg_binary.data ) {
-                       TALLOC_FREE( data );
-                       errno = ENOMEM;
-                       data = NULL;
+               if (size) {
+                       data->reg_binary.data =
+                               ( uint8 * ) TALLOC_MEMDUP( mem_ctx, buf.buffer, size );
+                       if ( !data->reg_binary.data ) {
+                               TALLOC_FREE( data );
+                               errno = ENOMEM;
+                               data = NULL;
+                       }
+               } else {
+                       data->reg_binary.data = NULL;
                }
                break;
 
index 899e211ffcc5d2fc5f71f84403cd9d7bb26b99a4..6dd3ac6ea17935c40d55c91b1cbea53bfce99e5c 100644 (file)
@@ -1283,10 +1283,15 @@ void brl_close_fnum(struct byte_range_lock *br_lck)
                        unsigned int num_locks_copy;
 
                        /* Copy the current lock array. */
-                       locks_copy = (struct lock_struct *)TALLOC_MEMDUP(br_lck, locks, br_lck->num_locks * sizeof(struct lock_struct));
-                       if (!locks_copy) {
-                               smb_panic("brl_close_fnum: talloc fail.\n");
+                       if (br_lck->num_locks) {
+                               locks_copy = (struct lock_struct *)TALLOC_MEMDUP(br_lck, locks, br_lck->num_locks * sizeof(struct lock_struct));
+                               if (!locks_copy) {
+                                       smb_panic("brl_close_fnum: talloc fail.\n");
+                               }
+                       } else {        
+                               locks_copy = NULL;
                        }
+
                        num_locks_copy = br_lck->num_locks;
 
                        for (i=0; i < num_locks_copy; i++) {
index 42bdb8f4829ad5025297b506a7a3e278027f925f..fba98b3fb15b60742b7b52eba4e1a1f830f5595e 100644 (file)
@@ -310,8 +310,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++;
 
@@ -350,8 +358,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++;
        }
index 75c617c944c2fc2da1cc3c60cec42ff0699e7309..2d40f5dba1a00a795a8279d6e48490ed068baca6 100644 (file)
@@ -1609,7 +1609,11 @@ WERROR rpccli_spoolss_getprinterdata(struct rpc_pipe_client *cli, TALLOC_CTX *me
 
        /* Return output parameters */
 
-       value->data_p = (uint8 *)TALLOC_MEMDUP(mem_ctx, out.data, out.needed);
+       if (out.needed) {
+               value->data_p = (uint8 *)TALLOC_MEMDUP(mem_ctx, out.data, out.needed);
+       } else {
+               value->data_p = NULL;
+       }
        value->type = out.type;
        value->size = out.size;
 
@@ -1662,7 +1666,11 @@ WERROR rpccli_spoolss_getprinterdataex(struct rpc_pipe_client *cli, TALLOC_CTX *
 
        /* Return output parameters */
 
-       value->data_p = (uint8 *)TALLOC_MEMDUP(mem_ctx, out.data, out.needed);
+       if (out.needed) {
+               value->data_p = (uint8 *)TALLOC_MEMDUP(mem_ctx, out.data, out.needed);
+       } else {
+               value->data_p = NULL;
+       }
        value->type = out.type;
        value->size = out.needed;
        
@@ -1758,8 +1766,12 @@ WERROR rpccli_spoolss_enumprinterdata(struct rpc_pipe_client *cli, TALLOC_CTX *m
        if (value) {
                rpcstr_pull(value->valuename, out.value, sizeof(value->valuename), -1,
                            STR_TERMINATE);
-               value->data_p = (uint8 *)TALLOC_MEMDUP(mem_ctx, out.data,
+               if (out.realdatasize) {
+                       value->data_p = (uint8 *)TALLOC_MEMDUP(mem_ctx, out.data,
                                                       out.realdatasize);
+               } else {
+                       value->data_p = NULL;
+               }
                value->type = out.type;
                value->size = out.realdatasize;
        }
index 9c180d34739e618694e45186a8efddea7fe5a35e..98280ee8444930644fb6c2a942a192bb514680d1 100644 (file)
@@ -5251,9 +5251,13 @@ BOOL make_spoolss_buffer5(TALLOC_CTX *mem_ctx, BUFFER5 *buf5, uint32 len, uint16
 
        buf5->buf_len = len;
        if (src) {
-               if((buf5->buffer=(uint16*)TALLOC_MEMDUP(mem_ctx, src, sizeof(uint16)*len)) == NULL) {
-                       DEBUG(0,("make_spoolss_buffer5: Unable to malloc memory for buffer!\n"));
-                       return False;
+               if (len) {
+                       if((buf5->buffer=(uint16*)TALLOC_MEMDUP(mem_ctx, src, sizeof(uint16)*len)) == NULL) {
+                               DEBUG(0,("make_spoolss_buffer5: Unable to malloc memory for buffer!\n"));
+                               return False;
+                       }
+               } else {
+                       buf5->buffer = NULL;
                }
        } else {
                buf5->buffer=NULL;
index 08c3a46133e2e86993b2f787919a5427ff84784b..abe944322e66b97e405762a291b8ad77ed21b472 100644 (file)
@@ -1416,11 +1416,15 @@ static DEVICEMODE* dup_devicemode(TALLOC_CTX *ctx, DEVICEMODE *devmode)
                        return NULL;
        }
 
-       d->dev_private = (uint8 *)TALLOC_MEMDUP(ctx, devmode->dev_private,
+       if (devmode->driverextra) {
+               d->dev_private = (uint8 *)TALLOC_MEMDUP(ctx, devmode->dev_private,
                                                devmode->driverextra);
-       if (!d->dev_private) {
-               return NULL;
-       }       
+               if (!d->dev_private) {
+                       return NULL;
+               }       
+       } else {
+               d->dev_private = NULL;
+       }
        return d;
 }
 
index e8561ea182f2dcaaccae8182dd91b17c6c5cef2b..a16c7ea52073e2aec96d35ed89680dd522368ab5 100644 (file)
@@ -2027,15 +2027,23 @@ static WERROR cmd_spoolss_setprinterdata(struct rpc_pipe_client *cli,
                UNISTR2 data;
                init_unistr2(&data, argv[4], UNI_STR_TERMINATE);
                value.size = data.uni_str_len * 2;
-               value.data_p = (uint8 *)TALLOC_MEMDUP(mem_ctx, data.buffer,
+               if (value.size) {
+                       value.data_p = (uint8 *)TALLOC_MEMDUP(mem_ctx, data.buffer,
                                                      value.size);
+               } else {
+                       value.data_p = NULL;
+               }
                break;
        }
        case REG_DWORD: {
                uint32 data = strtoul(argv[4], NULL, 10);
                value.size = sizeof(data);
-               value.data_p = (uint8 *)TALLOC_MEMDUP(mem_ctx, &data,
+               if (sizeof(data)) {
+                       value.data_p = (uint8 *)TALLOC_MEMDUP(mem_ctx, &data,
                                                      sizeof(data));
+               } else {
+                       value.data_p = NULL;
+               }
                break;
        }
        case REG_BINARY: {
index d0b55454f95f89f0ac57ed3a5a378934ddd24b7e..63ea50a67bda80d63d34747c46215f73e6b860a2 100644 (file)
@@ -2331,7 +2331,11 @@ NTSTATUS rpc_printer_migrate_settings_internals(const DOM_SID *domain_sid,
 
                                        value.type = REG_SZ;
                                        value.size = data.uni_str_len * 2;
-                                       value.data_p = (uint8 *)TALLOC_MEMDUP(mem_ctx, data.buffer, value.size);
+                                       if (value.size) {
+                                               value.data_p = (uint8 *)TALLOC_MEMDUP(mem_ctx, data.buffer, value.size);
+                                       } else {
+                                               value.data_p = NULL;
+                                       }
 
                                        if (opt_verbose) 
                                                display_reg_value(subkey, value);