From 9cc9a2a8a4a22aceff0d530d4ae17d5e8d36a9a7 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Wed, 4 Nov 2009 17:42:53 +1100 Subject: [PATCH] lib/util Split data_blob_hex_string() into upper and lower Rather than have a repeat of the bugs we found at the plugfest where hexidecimal strings must be in upper or lower case in particular places, ensure that each caller chooses which case they want. This reverts most of the callers back to upper case, as things were before tridge's patch. The critical call in the extended DN code is of course handled in lower case. Andrew Bartlett --- lib/util/data_blob.c | 19 ++++++++++++++++++- lib/util/data_blob.h | 7 ++++++- lib/util/tests/data_blob.c | 3 ++- librpc/ndr/ndr_drsuapi.c | 2 +- librpc/ndr/uuid.c | 2 +- librpc/rpc/binding.c | 2 +- .../dsdb/samdb/ldb_modules/password_hash.c | 10 +++++----- source4/lib/ldb-samba/ldif_handlers.c | 2 +- source4/lib/registry/util.c | 2 +- source4/torture/ldap/schema.c | 2 +- source4/torture/rpc/samsync.c | 4 ++-- 11 files changed, 39 insertions(+), 16 deletions(-) diff --git a/lib/util/data_blob.c b/lib/util/data_blob.c index 825d8cf88ca..6e7557f8ef6 100644 --- a/lib/util/data_blob.c +++ b/lib/util/data_blob.c @@ -153,7 +153,7 @@ _PUBLIC_ int data_blob_cmp(const DATA_BLOB *d1, const DATA_BLOB *d2) /** print the data_blob as hex string **/ -_PUBLIC_ char *data_blob_hex_string(TALLOC_CTX *mem_ctx, const DATA_BLOB *blob) +_PUBLIC_ char *data_blob_hex_string_lower(TALLOC_CTX *mem_ctx, const DATA_BLOB *blob) { int i; char *hex_string; @@ -173,6 +173,23 @@ _PUBLIC_ char *data_blob_hex_string(TALLOC_CTX *mem_ctx, const DATA_BLOB *blob) return hex_string; } +_PUBLIC_ char *data_blob_hex_string_upper(TALLOC_CTX *mem_ctx, const DATA_BLOB *blob) +{ + int i; + char *hex_string; + + hex_string = talloc_array(mem_ctx, char, (blob->length*2)+1); + if (!hex_string) { + return NULL; + } + + for (i = 0; i < blob->length; i++) + slprintf(&hex_string[i*2], 3, "%02X", blob->data[i]); + + hex_string[(blob->length*2)] = '\0'; + return hex_string; +} + /** useful for constructing data blobs in test suites, while avoiding const warnings diff --git a/lib/util/data_blob.h b/lib/util/data_blob.h index ffde51cf336..c294533960c 100644 --- a/lib/util/data_blob.h +++ b/lib/util/data_blob.h @@ -96,7 +96,12 @@ _PUBLIC_ int data_blob_cmp(const DATA_BLOB *d1, const DATA_BLOB *d2); /** print the data_blob as hex string **/ -_PUBLIC_ char *data_blob_hex_string(TALLOC_CTX *mem_ctx, const DATA_BLOB *blob); +_PUBLIC_ char *data_blob_hex_string_upper(TALLOC_CTX *mem_ctx, const DATA_BLOB *blob); + +/** +print the data_blob as hex string +**/ +_PUBLIC_ char *data_blob_hex_string_lower(TALLOC_CTX *mem_ctx, const DATA_BLOB *blob); /** useful for constructing data blobs in test suites, while diff --git a/lib/util/tests/data_blob.c b/lib/util/tests/data_blob.c index f0b02b8d171..53330a4afd5 100644 --- a/lib/util/tests/data_blob.c +++ b/lib/util/tests/data_blob.c @@ -78,7 +78,8 @@ static bool test_cmp(struct torture_context *tctx) static bool test_hex_string(struct torture_context *tctx) { DATA_BLOB a = data_blob_string_const("\xC\xA\xF\xE"); - torture_assert_str_equal(tctx, data_blob_hex_string(tctx, &a), "0c0a0f0e", "hex string"); + torture_assert_str_equal(tctx, data_blob_hex_string_lower(tctx, &a), "0c0a0f0e", "hex string"); + torture_assert_str_equal(tctx, data_blob_hex_string_upper(tctx, &a), "0C0A0F0E", "hex string"); return true; } diff --git a/librpc/ndr/ndr_drsuapi.c b/librpc/ndr/ndr_drsuapi.c index bfc3c75b4e7..15f2f842bdc 100644 --- a/librpc/ndr/ndr_drsuapi.c +++ b/librpc/ndr/ndr_drsuapi.c @@ -91,7 +91,7 @@ _PUBLIC_ void ndr_print_drsuapi_DsReplicaOID(struct ndr_print *ndr, const char * if (r->binary_oid) { char *partial_oid = NULL; DATA_BLOB oid_blob = data_blob_const(r->binary_oid, r->length); - char *hex_str = data_blob_hex_string(ndr, &oid_blob); + char *hex_str = data_blob_hex_string_upper(ndr, &oid_blob); ber_read_partial_OID_String(ndr, oid_blob, (const char **)&partial_oid); ndr->depth++; ndr->print(ndr, "%-25s: 0x%s (%s)", "binary_oid", hex_str, partial_oid); diff --git a/librpc/ndr/uuid.c b/librpc/ndr/uuid.c index 004a8d35ccf..df17d7824e9 100644 --- a/librpc/ndr/uuid.c +++ b/librpc/ndr/uuid.c @@ -291,7 +291,7 @@ _PUBLIC_ char *GUID_hexstring(TALLOC_CTX *mem_ctx, const struct GUID *guid) return NULL; } - ret = data_blob_hex_string(mem_ctx, &guid_blob); + ret = data_blob_hex_string_upper(mem_ctx, &guid_blob); talloc_free(tmp_mem); return ret; } diff --git a/librpc/rpc/binding.c b/librpc/rpc/binding.c index 734471451b7..20c3a389f16 100644 --- a/librpc/rpc/binding.c +++ b/librpc/rpc/binding.c @@ -113,7 +113,7 @@ const char *epm_floor_string(TALLOC_CTX *mem_ctx, struct epm_floor *epm_floor) return talloc_asprintf(mem_ctx, " uuid %s/0x%02x", uuidstr, syntax.if_version); } else { /* IPX */ return talloc_asprintf(mem_ctx, "IPX:%s", - data_blob_hex_string(mem_ctx, &epm_floor->rhs.uuid.unknown)); + data_blob_hex_string_upper(mem_ctx, &epm_floor->rhs.uuid.unknown)); } case EPM_PROTOCOL_NCACN: diff --git a/source4/dsdb/samdb/ldb_modules/password_hash.c b/source4/dsdb/samdb/ldb_modules/password_hash.c index 7779a1752be..8791db2bc4f 100644 --- a/source4/dsdb/samdb/ldb_modules/password_hash.c +++ b/source4/dsdb/samdb/ldb_modules/password_hash.c @@ -1137,7 +1137,7 @@ static int setup_supplemental_field(struct setup_password_fields_io *io) nt_errstr(status)); return LDB_ERR_OPERATIONS_ERROR; } - pknb_hexstr = data_blob_hex_string(io->ac, &pknb_blob); + pknb_hexstr = data_blob_hex_string_upper(io->ac, &pknb_blob); if (!pknb_hexstr) { ldb_oom(ldb); return LDB_ERR_OPERATIONS_ERROR; @@ -1169,7 +1169,7 @@ static int setup_supplemental_field(struct setup_password_fields_io *io) nt_errstr(status)); return LDB_ERR_OPERATIONS_ERROR; } - pkb_hexstr = data_blob_hex_string(io->ac, &pkb_blob); + pkb_hexstr = data_blob_hex_string_upper(io->ac, &pkb_blob); if (!pkb_hexstr) { ldb_oom(ldb); return LDB_ERR_OPERATIONS_ERROR; @@ -1200,7 +1200,7 @@ static int setup_supplemental_field(struct setup_password_fields_io *io) nt_errstr(status)); return LDB_ERR_OPERATIONS_ERROR; } - pdb_hexstr = data_blob_hex_string(io->ac, &pdb_blob); + pdb_hexstr = data_blob_hex_string_upper(io->ac, &pdb_blob); if (!pdb_hexstr) { ldb_oom(ldb); return LDB_ERR_OPERATIONS_ERROR; @@ -1229,7 +1229,7 @@ static int setup_supplemental_field(struct setup_password_fields_io *io) nt_errstr(status)); return LDB_ERR_OPERATIONS_ERROR; } - pcb_hexstr = data_blob_hex_string(io->ac, &pcb_blob); + pcb_hexstr = data_blob_hex_string_upper(io->ac, &pcb_blob); if (!pcb_hexstr) { ldb_oom(ldb); return LDB_ERR_OPERATIONS_ERROR; @@ -1255,7 +1255,7 @@ static int setup_supplemental_field(struct setup_password_fields_io *io) nt_errstr(status)); return LDB_ERR_OPERATIONS_ERROR; } - pb_hexstr = data_blob_hex_string(io->ac, &pb_blob); + pb_hexstr = data_blob_hex_string_upper(io->ac, &pb_blob); if (!pb_hexstr) { ldb_oom(ldb); return LDB_ERR_OPERATIONS_ERROR; diff --git a/source4/lib/ldb-samba/ldif_handlers.c b/source4/lib/ldb-samba/ldif_handlers.c index 9467bef8735..d8edeb0beb2 100644 --- a/source4/lib/ldb-samba/ldif_handlers.c +++ b/source4/lib/ldb-samba/ldif_handlers.c @@ -784,7 +784,7 @@ static int ldif_write_replUpToDateVector(struct ldb_context *ldb, void *mem_ctx, static int extended_dn_write_hex(struct ldb_context *ldb, void *mem_ctx, const struct ldb_val *in, struct ldb_val *out) { - *out = data_blob_string_const(data_blob_hex_string(mem_ctx, in)); + *out = data_blob_string_const(data_blob_hex_string_lower(mem_ctx, in)); if (!out->data) { return -1; } diff --git a/source4/lib/registry/util.c b/source4/lib/registry/util.c index a1897eff2e7..038b23fc874 100644 --- a/source4/lib/registry/util.c +++ b/source4/lib/registry/util.c @@ -68,7 +68,7 @@ _PUBLIC_ char *reg_val_data_string(TALLOC_CTX *mem_ctx, (void **)&ret, NULL, false); return ret; case REG_BINARY: - ret = data_blob_hex_string(mem_ctx, &data); + ret = data_blob_hex_string_upper(mem_ctx, &data); return ret; case REG_DWORD: if (*(int *)data.data == 0) diff --git a/source4/torture/ldap/schema.c b/source4/torture/ldap/schema.c index 7fe171691a6..b0a4892d7a5 100644 --- a/source4/torture/ldap/schema.c +++ b/source4/torture/ldap/schema.c @@ -356,7 +356,7 @@ static bool test_dump_sorted_syntax(struct ldb_context *ldb, struct test_rootDSE if (strcmp(syntaxes[i], a->attributeSyntax_oid) != 0) continue; - om_hex = data_blob_hex_string(ldb, &a->oMObjectClass); + om_hex = data_blob_hex_string_upper(ldb, &a->oMObjectClass); if (!om_hex) { return false; } diff --git a/source4/torture/rpc/samsync.c b/source4/torture/rpc/samsync.c index 52df4eb6b97..19060c69a94 100644 --- a/source4/torture/rpc/samsync.c +++ b/source4/torture/rpc/samsync.c @@ -593,11 +593,11 @@ static bool samsync_handle_user(struct torture_context *tctx, TALLOC_CTX *mem_ct if (nt_hash_p) { DATA_BLOB nt_hash_blob = data_blob_const(nt_hash_p, 16); - DEBUG(100,("ACCOUNT [%s\\%-25s] NTHASH %s\n", samsync_state->domain_name[0], username, data_blob_hex_string(mem_ctx, &nt_hash_blob))); + DEBUG(100,("ACCOUNT [%s\\%-25s] NTHASH %s\n", samsync_state->domain_name[0], username, data_blob_hex_string_upper(mem_ctx, &nt_hash_blob))); } if (lm_hash_p) { DATA_BLOB lm_hash_blob = data_blob_const(lm_hash_p, 16); - DEBUG(100,("ACCOUNT [%s\\%-25s] LMHASH %s\n", samsync_state->domain_name[0], username, data_blob_hex_string(mem_ctx, &lm_hash_blob))); + DEBUG(100,("ACCOUNT [%s\\%-25s] LMHASH %s\n", samsync_state->domain_name[0], username, data_blob_hex_string_upper(mem_ctx, &lm_hash_blob))); } nt_status = test_SamLogon(samsync_state->p_netlogon_wksta, mem_ctx, samsync_state->creds_netlogon_wksta, -- 2.34.1