Hi Matthias,
Can you please send patches to the registry in for review first?
On 03/14/10 18:48, Matthias Dieter Wallnöfer wrote:
diff --git a/source4/lib/registry/ldb.c b/source4/lib/registry/ldb.c
index 0213c54..9e77f1f 100644
--- a/source4/lib/registry/ldb.c
+++ b/source4/lib/registry/ldb.c
@@ -61,9 +61,22 @@ static void reg_ldb_unpack_value(TALLOC_CTX *mem_ctx,
case REG_SZ:
case REG_EXPAND_SZ:
if (val != NULL) {
- convert_string_talloc(mem_ctx, CH_UTF8, CH_UTF16,
- val->data, val->length,
- (void
**)&data->data,&data->length, false);
+ if (val->data[0] != '\0') {
+ /* The data should be provided as UTF16 string
*/
+ convert_string_talloc(mem_ctx, CH_UTF8,
CH_UTF16,
+ val->data, val->length,
+ (void
**)&data->data,&data->length, false);
+ } else {
+ /* Provide a possibility to store also UTF8
+ * REG_SZ/REG_EXPAND_SZ values. This is done
+ * by adding a '\0' in front of the data */
+ data->data = talloc_size(mem_ctx, val->length -
1);
+ if (data->data != NULL) {
+ memcpy(data->data, val->data + 1,
+ val->length - 1);
+ }
+ data->length = val->length - 1;
+ }
} else {
data->data = NULL;
data->length = 0;
^^ This is needlessly complicated.. Why do we need to support both UTF8
and UTF16 inside of the LDB registry backend?
@@ -72,9 +85,25 @@ static void reg_ldb_unpack_value(TALLOC_CTX *mem_ctx,
case REG_DWORD:
if (val != NULL) {
- uint32_t tmp = strtoul((char *)val->data, NULL, 0);
- *data = data_blob_talloc(mem_ctx, NULL, 4);
- SIVAL(data->data, 0, tmp);
+ if (val->data[0] != '\0') {
+ /* The data is a plain DWORD */
+ uint32_t tmp = strtoul((char *)val->data, NULL,
0);
+ data->data = talloc_size(mem_ctx,
sizeof(uint32_t) + 1);
+ if (data->data != NULL) {
+ SIVAL(data->data, 0, tmp);
+ }
+ data->length = sizeof(uint32_t);
+ } else {
+ /* Provide a possibility to store also UTF8
+ * REG_DWORD values. This is done by adding a
+ * '\0' in front of the data */
+ data->data = talloc_size(mem_ctx, val->length -
1);
+ if (data->data != NULL) {
+ memcpy(data->data, val->data + 1,
+ val->length - 1);
+ }
+ data->length = val->length - 1;
+ }
^^^ There is no such thing as a "UTF-8" DWORD.
} else {
data->data = NULL;
data->length = 0;
@@ -84,7 +113,9 @@ static void reg_ldb_unpack_value(TALLOC_CTX *mem_ctx,
case REG_BINARY:
default:
if (val != NULL) {
- *data = data_blob_talloc(mem_ctx, val->data,
val->length);
+ data->data = talloc_memdup(mem_ctx, val->data,
+ val->length);
+ data->length = val->length;
^^ What's wrong with data_blob_talloc ?
@@ -98,34 +129,105 @@ static struct ldb_message *reg_ldb_pack_value(struct
ldb_context *ctx,
const char *name,
uint32_t type, DATA_BLOB data)
{
- struct ldb_val val;
- struct ldb_message *msg = talloc_zero(mem_ctx, struct ldb_message);
- char *type_s;
+ struct ldb_message *msg;
+ char *name_dup, *type_str;
+ int ret;
- ldb_msg_add_string(msg, "value", talloc_strdup(mem_ctx, name));
+ msg = talloc_zero(mem_ctx, struct ldb_message);
+ if (msg == NULL) {
+ return NULL;
+ }
+
+ name_dup = talloc_strdup(msg, name);
+ if (name_dup == NULL) {
+ talloc_free(msg);
+ return NULL;
+ }
+
+ ret = ldb_msg_add_string(msg, "value", name_dup);
+ if (ret != LDB_SUCCESS) {
+ talloc_free(msg);
+ return NULL;
+ }
switch (type) {
case REG_SZ:
case REG_EXPAND_SZ:
if ((data.length> 0)&& (data.data != NULL)
&& (data.data[0] != '\0')) {
- convert_string_talloc(mem_ctx, CH_UTF16, CH_UTF8,
- (void *)data.data,
- data.length,
- (void
**)&val.data,&val.length, false);
- ldb_msg_add_value(msg, "data",&val, NULL);
+ struct ldb_val *val;
+ bool ret2;
+
+ val = talloc_zero(msg, struct ldb_val);
+ if (val == NULL) {
+ talloc_free(msg);
+ return NULL;
+ }
+
+ if (data.length % 2 == 0) {
+ /* The data is provided as UTF16 string */
+ ret2 = convert_string_talloc(mem_ctx, CH_UTF16,
CH_UTF8,
+ (void *)data.data,
data.length,
+ (void
**)&val->data,&val->length,
+ false);
+ if (!ret2) {
+ talloc_free(msg);
+ return NULL;
+ }
^^ This isn't necessarily true ? What if there is an uneven number of
characters in a UTF-8 string? In that case the length of that string
would be even.
Cheers,
Jelmer