Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: assert failures on null/empty maps (Closes #504) #509

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
157 changes: 92 additions & 65 deletions src/c/config.c
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ iot_data_t *edgex_private_config_defaults (const iot_data_t *driverconf)
iot_data_string_map_add (result, "Service/Port", iot_data_alloc_ui16 (59999));
iot_data_string_map_add (result, "Service/StartupMsg", iot_data_alloc_string ("", IOT_DATA_REF));

if (driverconf)
if (driverconf && (iot_data_type(driverconf) == IOT_DATA_MAP))
{
iot_data_map_iter_t iter;
iot_data_map_iter (driverconf, &iter);
Expand Down Expand Up @@ -281,39 +281,46 @@ void edgex_device_parseClients (iot_logger_t *lc, const iot_data_t *clients, edg

static void addInsecureSecretsMap (iot_data_t *confmap, const iot_data_t *config)
{
if ((!config) || (iot_data_type(config) != IOT_DATA_MAP))
{
return;
}
const iot_data_t *sub = iot_data_string_map_get (config, DYN_NAME);
if (sub)
if (sub && (iot_data_type(sub) == IOT_DATA_MAP))
{
sub = iot_data_string_map_get (sub, INSECURE_NAME);
}
if (sub)
if (sub && (iot_data_type(sub) == IOT_DATA_MAP))
{
iot_data_map_iter_t iter;
iot_data_map_iter (sub, &iter);
while (iot_data_map_iter_next (&iter))
{
const iot_data_t *tab = iot_data_map_iter_value (&iter);
const iot_data_t *sname = iot_data_string_map_get (tab, "SecretName");
if (sname)
{
const iot_data_t *secrets = iot_data_string_map_get (tab, "SecretData");
if (secrets)
{
char *cpath;
const char *key = iot_data_map_iter_string_key (&iter);
iot_data_map_iter_t elem;
iot_data_map_iter (secrets, &elem);
while (iot_data_map_iter_next (&elem))
if (tab && (iot_data_type(tab) == IOT_DATA_MAP))
{
const iot_data_t *sname = iot_data_string_map_get (tab, "SecretName");
if (sname)
{
const iot_data_t *secrets = iot_data_string_map_get (tab, "SecretData");
char *cpath;
const char *key = iot_data_map_iter_string_key (&iter);
iot_data_map_iter_t elem;
if (secrets && (iot_data_type(secrets) == IOT_DATA_MAP))
{
cpath = malloc (sizeof (DYN_PREFIX) + sizeof (INSECURE_NAME) + strlen (key) + sizeof ("/SecretData/") + strlen (iot_data_map_iter_string_key (&elem)));
strcpy (cpath, DYN_PREFIX);
strcat (cpath, INSECURE_NAME);
strcat (cpath, "/");
strcat (cpath, key);
strcat (cpath, "/SecretData/");
strcat (cpath, iot_data_map_iter_string_key (&elem));
iot_data_map_add (confmap, iot_data_alloc_string (cpath, IOT_DATA_TAKE), iot_data_add_ref (iot_data_map_iter_value (&elem)));
}
iot_data_map_iter (secrets, &elem);
while (iot_data_map_iter_next (&elem))
{
cpath = malloc (sizeof (DYN_PREFIX) + sizeof (INSECURE_NAME) + strlen (key) + sizeof ("/SecretData/") + strlen (iot_data_map_iter_string_key (&elem)));
strcpy (cpath, DYN_PREFIX);
strcat (cpath, INSECURE_NAME);
strcat (cpath, "/");
strcat (cpath, key);
strcat (cpath, "/SecretData/");
strcat (cpath, iot_data_map_iter_string_key (&elem));
iot_data_map_add (confmap, iot_data_alloc_string (cpath, IOT_DATA_TAKE), iot_data_add_ref (iot_data_map_iter_value (&elem)));
}
}
cpath = malloc (sizeof (DYN_PREFIX) + sizeof (INSECURE_NAME) + strlen (key) + sizeof ("/SecretName/"));
strcpy (cpath, DYN_PREFIX);
strcat (cpath, INSECURE_NAME);
Expand Down Expand Up @@ -371,16 +378,19 @@ void edgex_device_overrideConfig_map (iot_data_t *config, const iot_data_t *map)
const iot_data_t *replace;
iot_data_map_iter_t iter;

iot_data_map_iter (config, &iter);
while (iot_data_map_iter_next (&iter))
if (config && (iot_data_type(config) == IOT_DATA_MAP))
{
replace = findEntry (map, iot_data_map_iter_string_key (&iter));
if (replace)
iot_data_map_iter (config, &iter);
while (iot_data_map_iter_next (&iter))
{
iot_data_t *newval = iot_data_transform (replace, iot_data_type (iot_data_map_iter_value (&iter)));
if (newval)
replace = findEntry (map, iot_data_map_iter_string_key (&iter));
if (replace)
{
iot_data_free (iot_data_map_iter_replace_value (&iter, newval));
iot_data_t *newval = iot_data_transform (replace, iot_data_type (iot_data_map_iter_value (&iter)));
if (newval)
{
iot_data_free (iot_data_map_iter_replace_value (&iter, newval));
}
}
}
}
Expand All @@ -394,6 +404,10 @@ void edgex_device_overrideConfig_env (iot_logger_t *lc, iot_data_t *config)
const char *key;
iot_data_map_iter_t iter;

if ((!config) || (iot_data_type(config) != IOT_DATA_MAP))
{
return;
}
iot_data_map_iter (config, &iter);
while (iot_data_map_iter_next (&iter))
{
Expand Down Expand Up @@ -435,16 +449,19 @@ void edgex_device_overrideConfig_nvpairs (iot_data_t *config, const devsdk_nvpai
const char *raw;
iot_data_map_iter_t iter;

iot_data_map_iter (config, &iter);
while (iot_data_map_iter_next (&iter))
if (config && (iot_data_type(config) == IOT_DATA_MAP))
{
raw = devsdk_nvpairs_value (pairs, iot_data_map_iter_string_key (&iter));
if (raw)
iot_data_map_iter (config, &iter);
while (iot_data_map_iter_next (&iter))
{
iot_data_t *newval = iot_data_alloc_from_string (iot_data_type (iot_data_map_iter_value (&iter)), raw);
if (newval)
raw = devsdk_nvpairs_value (pairs, iot_data_map_iter_string_key (&iter));
if (raw)
{
iot_data_free (iot_data_map_iter_replace_value (&iter, newval));
iot_data_t *newval = iot_data_alloc_from_string (iot_data_type (iot_data_map_iter_value (&iter)), raw);
if (newval)
{
iot_data_free (iot_data_map_iter_replace_value (&iter, newval));
}
}
}
}
Expand Down Expand Up @@ -519,20 +536,23 @@ void edgex_device_populateConfig (devsdk_service_t *svc, iot_data_t *config)
svc->config.sdkconf = config;
svc->config.driverconf = iot_data_alloc_map (IOT_DATA_STRING);

iot_data_map_iter (config, &iter);
while (iot_data_map_iter_next (&iter))
if (config && (iot_data_type(config) == IOT_DATA_MAP))
{
const char *key = iot_data_map_iter_string_key (&iter);
if (strncmp (key, DRV_PREFIX, DRV_PREFIXLEN) == 0)
{
iot_data_map_add (svc->config.driverconf, iot_data_alloc_string (key + DRV_PREFIXLEN, IOT_DATA_COPY), iot_data_copy (iot_data_map_iter_value (&iter)));
}
else if (strncmp (key, DYN_DRV_PREFIX, DYN_DRV_PREFIXLEN) == 0)
iot_data_map_iter (config, &iter);
while (iot_data_map_iter_next (&iter))
{
char *nkey = malloc (strlen (key) - DRV_PREFIXLEN + 1);
strcpy (nkey, DYN_PREFIX);
strcat (nkey, key + DYN_DRV_PREFIXLEN);
iot_data_map_add (svc->config.driverconf, iot_data_alloc_string (nkey, IOT_DATA_TAKE), iot_data_copy (iot_data_map_iter_value (&iter)));
const char *key = iot_data_map_iter_string_key (&iter);
if (strncmp (key, DRV_PREFIX, DRV_PREFIXLEN) == 0)
{
iot_data_map_add (svc->config.driverconf, iot_data_alloc_string (key + DRV_PREFIXLEN, IOT_DATA_COPY), iot_data_copy (iot_data_map_iter_value (&iter)));
}
else if (strncmp (key, DYN_DRV_PREFIX, DYN_DRV_PREFIXLEN) == 0)
{
char *nkey = malloc (strlen (key) - DRV_PREFIXLEN + 1);
strcpy (nkey, DYN_PREFIX);
strcat (nkey, key + DYN_DRV_PREFIXLEN);
iot_data_map_add (svc->config.driverconf, iot_data_alloc_string (nkey, IOT_DATA_TAKE), iot_data_copy (iot_data_map_iter_value (&iter)));
}
}
}

Expand Down Expand Up @@ -605,24 +625,27 @@ void edgex_device_updateConf (void *p, const devsdk_nvpairs *config)
edgex_secrets_reconfigure (svc->secretstore, svc->config.sdkconf);
}

iot_data_map_iter (svc->config.sdkconf, &iter);
while (iot_data_map_iter_next (&iter))
if (svc->config.sdkconf && (iot_data_type(svc->config.sdkconf) == IOT_DATA_MAP))
{
const char *key = iot_data_map_iter_string_key (&iter);
if (strncmp (key, DYN_DRV_PREFIX, DYN_DRV_PREFIXLEN) == 0)
iot_data_map_iter (svc->config.sdkconf, &iter);
while (iot_data_map_iter_next (&iter))
{
char *nkey = malloc (strlen (key) - DRV_PREFIXLEN + 1);
strcpy (nkey, DYN_PREFIX);
strcat (nkey, key + DYN_DRV_PREFIXLEN);
const iot_data_t *driverval = iot_data_string_map_get (svc->config.driverconf, nkey);
if (driverval && !iot_data_equal (driverval, iot_data_map_iter_value (&iter)))
{
updatedriver = true;
iot_data_map_add (svc->config.driverconf, iot_data_alloc_string (nkey, IOT_DATA_TAKE), iot_data_copy (iot_data_map_iter_value (&iter)));
}
else
const char *key = iot_data_map_iter_string_key (&iter);
if (strncmp (key, DYN_DRV_PREFIX, DYN_DRV_PREFIXLEN) == 0)
{
free (nkey);
char *nkey = malloc (strlen (key) - DRV_PREFIXLEN + 1);
strcpy (nkey, DYN_PREFIX);
strcat (nkey, key + DYN_DRV_PREFIXLEN);
const iot_data_t *driverval = iot_data_string_map_get (svc->config.driverconf, nkey);
if (driverval && !iot_data_equal (driverval, iot_data_map_iter_value (&iter)))
{
updatedriver = true;
iot_data_map_add (svc->config.driverconf, iot_data_alloc_string (nkey, IOT_DATA_TAKE), iot_data_copy (iot_data_map_iter_value (&iter)));
}
else
{
free (nkey);
}
}
}
}
Expand All @@ -636,6 +659,10 @@ void edgex_device_dumpConfig (iot_logger_t *lc, iot_data_t *config)
{
char *val;
iot_data_map_iter_t iter;
if ((!config) || (iot_data_type(config) != IOT_DATA_MAP))
{
return;
}
iot_data_map_iter (config, &iter);
while (iot_data_map_iter_next (&iter))
{
Expand Down Expand Up @@ -773,7 +800,7 @@ static JSON_Value *edgex_device_config_toJson (devsdk_service_t *svc)

json_object_set_value (obj, "Service", sval);

if (svc->config.driverconf)
if (svc->config.driverconf && (iot_data_type(svc->config.driverconf) == IOT_DATA_MAP))
{
iot_data_map_iter_t iter;
iot_data_map_iter (svc->config.driverconf, &iter);
Expand Down
61 changes: 32 additions & 29 deletions src/c/consul.c
Original file line number Diff line number Diff line change
Expand Up @@ -398,38 +398,41 @@ static void edgex_consul_client_write_config (void *impl, const char *servicenam
JSON_Array *jarray = json_value_get_array (jresult);

iot_data_map_iter_t iter;
iot_data_map_iter (config, &iter);
while (iot_data_map_iter_next (&iter))
if (config && (iot_data_type(config) == IOT_DATA_MAP))
{
char *base64val;
const iot_data_t *val = iot_data_map_iter_value (&iter);
if (iot_data_type (val) == IOT_DATA_STRING)
iot_data_map_iter (config, &iter);
while (iot_data_map_iter_next (&iter))
{
base64val = value_to_b64 (iot_data_string (val));
}
else
{
char *json = iot_data_to_json (val);
base64val = value_to_b64 (json);
free (json);
}

const char *k = iot_data_map_iter_string_key (&iter);
char *keystr = malloc (strlen (CONF_PREFIX) + strlen (servicename) + strlen (k) + 2);
sprintf (keystr, "%s%s/%s", CONF_PREFIX, servicename, k);

JSON_Value *kvfields = json_value_init_object ();
JSON_Object *obj = json_value_get_object (kvfields);
json_object_set_string (obj, "Verb", "set");
json_object_set_string (obj, "Key", keystr);
json_object_set_string (obj, "Value", base64val);

JSON_Value *kvcmd = json_value_init_object ();
json_object_set_value (json_value_get_object (kvcmd), "KV", kvfields);
json_array_append_value (jarray, kvcmd);
char *base64val;
const iot_data_t *val = iot_data_map_iter_value (&iter);
if (iot_data_type (val) == IOT_DATA_STRING)
{
base64val = value_to_b64 (iot_data_string (val));
}
else
{
char *json = iot_data_to_json (val);
base64val = value_to_b64 (json);
free (json);
}

free (base64val);
free (keystr);
const char *k = iot_data_map_iter_string_key (&iter);
char *keystr = malloc (strlen (CONF_PREFIX) + strlen (servicename) + strlen (k) + 2);
sprintf (keystr, "%s%s/%s", CONF_PREFIX, servicename, k);

JSON_Value *kvfields = json_value_init_object ();
JSON_Object *obj = json_value_get_object (kvfields);
json_object_set_string (obj, "Verb", "set");
json_object_set_string (obj, "Key", keystr);
json_object_set_string (obj, "Value", base64val);

JSON_Value *kvcmd = json_value_init_object ();
json_object_set_value (json_value_get_object (kvcmd), "KV", kvfields);
json_array_append_value (jarray, kvcmd);

free (base64val);
free (keystr);
}
}

char *json = json_serialize_to_string (jresult);
Expand Down
2 changes: 1 addition & 1 deletion src/c/dto-read.c
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ static edgex_device_operatingstate edgex_operatingstate_read (const iot_data_t *
static devsdk_protocols *edgex_protocols_read (const iot_data_t *obj)
{
devsdk_protocols *result = NULL;
if (obj)
if (obj && (iot_data_type(obj) == IOT_DATA_MAP))
{
iot_data_map_iter_t iter;
iot_data_map_iter (obj, &iter);
Expand Down
13 changes: 8 additions & 5 deletions src/c/edgex-rest.c
Original file line number Diff line number Diff line change
Expand Up @@ -159,11 +159,14 @@ static JSON_Value *string_map_write (const iot_data_t *map)
JSON_Value *result = json_value_init_object ();
JSON_Object *obj = json_value_get_object (result);

iot_data_map_iter_t iter;
iot_data_map_iter (map, &iter);
while (iot_data_map_iter_next (&iter))
{
json_object_set_string (obj, iot_data_map_iter_string_key (&iter), iot_data_map_iter_string_value (&iter));
if (map && (iot_data_type(map) == IOT_DATA_MAP))
{
iot_data_map_iter_t iter;
iot_data_map_iter (map, &iter);
while (iot_data_map_iter_next (&iter))
{
json_object_set_string (obj, iot_data_map_iter_string_key (&iter), iot_data_map_iter_string_value (&iter));
}
}
return result;
}
Expand Down
22 changes: 17 additions & 5 deletions src/c/examples/discovery/template.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,12 @@ static void dump_protocols (iot_logger_t *lc, const devsdk_protocols *prots)
{
iot_data_map_iter_t iter;
iot_log_debug (lc, " [Other] protocol:");
iot_data_map_iter (devsdk_protocols_properties (prots, "Other"), &iter);
const iot_data_t *others = devsdk_protocols_properties(prots, "Other");
if ((!others) || (iot_data_type(others) != IOT_DATA_MAP))
{
return;
}
iot_data_map_iter (others, &iter);
while (iot_data_map_iter_next (&iter))
{
iot_log_debug (lc, " %s = %s", iot_data_map_iter_string_key (&iter), iot_data_map_iter_string_value (&iter));
Expand All @@ -35,6 +40,10 @@ static void dump_protocols (iot_logger_t *lc, const devsdk_protocols *prots)
static void dump_attributes (iot_logger_t *lc, devsdk_resource_attr_t attrs)
{
iot_data_map_iter_t iter;
if ((!attrs) || (iot_data_type((iot_data_t *)attrs) != IOT_DATA_MAP))
{
return;
}
iot_data_map_iter ((iot_data_t *)attrs, &iter);
while (iot_data_map_iter_next (&iter))
{
Expand All @@ -55,7 +64,7 @@ static bool template_init
{
template_driver *driver = (template_driver *) impl;
iot_log_debug (lc, "Template Init. Driver Config follows:");
if (config)
if (config && (iot_data_type(config) == IOT_DATA_MAP))
{
iot_data_map_iter_t iter;
iot_data_map_iter (config, &iter);
Expand All @@ -81,10 +90,13 @@ static void template_reconfigure
iot_data_map_iter_t iter;
template_driver *driver = (template_driver *) impl;
iot_log_debug (driver->lc, "Template Reconfiguration. New Config follows:");
iot_data_map_iter (config, &iter);
while (iot_data_map_iter_next (&iter))
if (config && (iot_data_type(config) == IOT_DATA_MAP))
{
iot_log_debug (driver->lc, " %s = %s", iot_data_map_iter_string_key (&iter), iot_data_map_iter_string_value (&iter));
iot_data_map_iter (config, &iter);
while (iot_data_map_iter_next (&iter))
{
iot_log_debug (driver->lc, " %s = %s", iot_data_map_iter_string_key (&iter), iot_data_map_iter_string_value (&iter));
}
}
}

Expand Down
Loading