r18971: avoid strndup is a few places. Fixes a minor memory leak, and should
authorAndrew Tridgell <tridge@samba.org>
Thu, 28 Sep 2006 06:44:47 +0000 (06:44 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 19:20:25 +0000 (14:20 -0500)
fix RPC-LSA on AIX.
(This used to be commit 6cce709d08579f4e00b44b692332a557b0ea3b86)

source4/lib/registry/common/reg_util.c
source4/libcli/auth/session.c
source4/torture/rpc/lsa.c
source4/torture/rpc/session_key.c

index 3d0cdf5a6ac6ab7163d3a01ea0bf52b106e423d0..a8d7accb3dcb32c08c94ed6cf041f82361da4207 100644 (file)
@@ -171,9 +171,9 @@ WERROR reg_open_key_abs(TALLOC_CTX *mem_ctx, struct registry_context *handle, co
        if(strchr(name, '\\')) predeflength = strchr(name, '\\')-name;
        else predeflength = strlen(name);
 
-       predefname = strndup(name, predeflength);
+       predefname = talloc_strndup(mem_ctx, name, predeflength);
        error = reg_get_predefined_key_by_name(handle, predefname, &predef);
-       SAFE_FREE(predefname);
+       talloc_free(predefname);
 
        if(!W_ERROR_IS_OK(error)) {
                return error;
index 280a0d282c072830ab44486798b234cde9f070f0..430eecd78fb609fb01272b46617cc4c8e06ff0de 100644 (file)
@@ -97,7 +97,8 @@ DATA_BLOB sess_encrypt_string(const char *str, const DATA_BLOB *session_key)
 
   caller should free the returned string
 */
-char *sess_decrypt_string(DATA_BLOB *blob, const DATA_BLOB *session_key)
+char *sess_decrypt_string(TALLOC_CTX *mem_ctx, 
+                         DATA_BLOB *blob, const DATA_BLOB *session_key)
 {
        DATA_BLOB out;
        int slen;
@@ -107,7 +108,7 @@ char *sess_decrypt_string(DATA_BLOB *blob, const DATA_BLOB *session_key)
                return NULL;
        }
        
-       out = data_blob(NULL, blob->length);
+       out = data_blob_talloc(mem_ctx, NULL, blob->length);
        if (!out.data) {
                return NULL;
        }
@@ -117,19 +118,23 @@ char *sess_decrypt_string(DATA_BLOB *blob, const DATA_BLOB *session_key)
        if (IVAL(out.data, 4) != 1) {
                DEBUG(0,("Unexpected revision number %d in session crypted string\n",
                         IVAL(out.data, 4)));
+               data_blob_free(&out);
                return NULL;
        }
 
        slen = IVAL(out.data, 0);
        if (slen > blob->length - 8) {
                DEBUG(0,("Invalid crypt length %d\n", slen));
+               data_blob_free(&out);
                return NULL;
        }
 
-       ret = strndup((const char *)(out.data+8), slen);
+       ret = talloc_strndup(mem_ctx, (const char *)(out.data+8), slen);
 
        data_blob_free(&out);
 
+       DEBUG(0,("decrypted string '%s' of length %d\n", ret, slen));
+
        return ret;
 }
 
index 84bc90963d68fcb4f28cca46e2ed98bfaeed9eb6..575426a409c02163021dcd61fda6a7b056471483 100644 (file)
@@ -976,7 +976,8 @@ static BOOL test_CreateSecret(struct dcerpc_pipe *p,
                                
                                blob2 = data_blob_talloc(mem_ctx, NULL, blob1.length);
                                
-                               secret2 = sess_decrypt_string(&blob1, &session_key);
+                               secret2 = sess_decrypt_string(mem_ctx, 
+                                                             &blob1, &session_key);
                                
                                if (strcmp(secret1, secret2) != 0) {
                                        printf("Returned secret '%s' doesn't match '%s'\n", 
@@ -1036,7 +1037,8 @@ static BOOL test_CreateSecret(struct dcerpc_pipe *p,
                                
                                blob2 = data_blob_talloc(mem_ctx, NULL, blob1.length);
                                
-                               secret4 = sess_decrypt_string(&blob1, &session_key);
+                               secret4 = sess_decrypt_string(mem_ctx, 
+                                                             &blob1, &session_key);
                                
                                if (strcmp(secret3, secret4) != 0) {
                                        printf("Returned NEW secret %s doesn't match %s\n", secret4, secret3);
@@ -1048,7 +1050,8 @@ static BOOL test_CreateSecret(struct dcerpc_pipe *p,
                                
                                blob2 = data_blob_talloc(mem_ctx, NULL, blob1.length);
                                
-                               secret2 = sess_decrypt_string(&blob1, &session_key);
+                               secret2 = sess_decrypt_string(mem_ctx, 
+                                                             &blob1, &session_key);
                                
                                if (strcmp(secret1, secret2) != 0) {
                                        printf("Returned OLD secret %s doesn't match %s\n", secret2, secret1);
@@ -1122,7 +1125,8 @@ static BOOL test_CreateSecret(struct dcerpc_pipe *p,
                                
                                blob2 = data_blob_talloc(mem_ctx, NULL, blob1.length);
                                
-                               secret6 = sess_decrypt_string(&blob1, &session_key);
+                               secret6 = sess_decrypt_string(mem_ctx,
+                                                             &blob1, &session_key);
                                
                                if (strcmp(secret3, secret4) != 0) {
                                        printf("Returned NEW secret '%s' doesn't match '%s'\n", secret4, secret3);
@@ -1134,7 +1138,8 @@ static BOOL test_CreateSecret(struct dcerpc_pipe *p,
                                
                                blob2 = data_blob_talloc(mem_ctx, NULL, blob1.length);
                                
-                               secret6 = sess_decrypt_string(&blob1, &session_key);
+                               secret6 = sess_decrypt_string(mem_ctx,
+                                                             &blob1, &session_key);
                                
                                if (strcmp(secret5, secret6) != 0) {
                                        printf("Returned OLD secret %s doesn't match %s\n", secret5, secret6);
index d70fc95b182d5a818def0f6ab71df53e087a5ca0..67859467703ff72b5d97e025f1559e6f95bb23c0 100644 (file)
@@ -139,7 +139,7 @@ static BOOL test_CreateSecret_basic(struct dcerpc_pipe *p,
                        
                        blob2 = data_blob_talloc(mem_ctx, NULL, blob1.length);
                        
-                       secret2 = sess_decrypt_string(&blob1, &session_key);
+                       secret2 = sess_decrypt_string(mem_ctx, &blob1, &session_key);
                        
                        if (strcmp(secret1, secret2) != 0) {
                                printf("Returned secret '%s' doesn't match '%s'\n",