summaryrefslogtreecommitdiff
path: root/configmgr
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2015-09-01 11:32:50 +0200
committerStephan Bergmann <sbergman@redhat.com>2015-09-01 11:33:16 +0200
commitdf7fbad544679999c9635fc441571a0b52826d60 (patch)
treeb7be7c6d9909cb363ee9aed19b6e21f76249ed78 /configmgr
parentc874bf3f7bd6bbe31416506d9b4213bcbbbac4fa (diff)
readdconflayer: avoid deref of null (removed) member
Change-Id: I3b2ce8ef79c4bc0dde8ba43f96ca4e97a71dd2cd
Diffstat (limited to 'configmgr')
-rw-r--r--configmgr/source/readdconflayer.cxx131
1 files changed, 68 insertions, 63 deletions
diff --git a/configmgr/source/readdconflayer.cxx b/configmgr/source/readdconflayer.cxx
index d6575e782007..035f554dea9e 100644
--- a/configmgr/source/readdconflayer.cxx
+++ b/configmgr/source/readdconflayer.cxx
@@ -847,82 +847,87 @@ void readDir(
<< node->getTemplateName());
continue;
}
- if (member->getFinalized() < layer) {
- continue;
- }
- switch (member->kind()) {
- case Node::KIND_PROPERTY:
- {
- if (isDir) {
- SAL_WARN(
- "configmgr.dconf",
- "bad dir " << path << " does not match property");
- continue;
+ if (member.is()) {
+ if (member->getFinalized() < layer) {
+ continue;
+ }
+ switch (member->kind()) {
+ case Node::KIND_PROPERTY:
+ {
+ if (isDir) {
+ SAL_WARN(
+ "configmgr.dconf",
+ "bad dir " << path << " does not match property");
+ continue;
+ }
+ rtl::Reference<PropertyNode> prop(
+ static_cast<PropertyNode *>(member.get()));
+ css::uno::Any value;
+ switch (readValue(
+ client, path, prop->getStaticType(),
+ prop->isNillable(), prop->isExtension(),
+ &value))
+ {
+ case ReadValue::Error:
+ continue;
+ case ReadValue::Value:
+ prop->setValue(layer, value);
+ finalize(client, path, member, layer);
+ break;
+ case ReadValue::Remove:
+ remove = true;
+ break;
+ }
+ break;
}
- rtl::Reference<PropertyNode> prop(
- static_cast<PropertyNode *>(member.get()));
- css::uno::Any value;
- switch (readValue(
- client, path, prop->getStaticType(),
- prop->isNillable(), prop->isExtension(), &value))
+ case Node::KIND_LOCALIZED_VALUE:
{
- case ReadValue::Error:
- continue;
- case ReadValue::Value:
- prop->setValue(layer, value);
+ if (isDir) {
+ SAL_WARN(
+ "configmgr.dconf",
+ "bad dir " << path
+ << " does not match localized value");
+ continue;
+ }
+ assert(
+ node.is()
+ && node->kind() == Node::KIND_LOCALIZED_PROPERTY);
+ rtl::Reference<LocalizedPropertyNode> locProp(
+ static_cast<LocalizedPropertyNode *>(node.get()));
+ css::uno::Any value;
+ if (readValue(
+ client, path, locProp->getStaticType(),
+ locProp->isNillable(), false, &value)
+ == ReadValue::Error)
+ {
+ continue;
+ }
+ static_cast<LocalizedValueNode *>(member.get())->setValue(
+ layer, value);
finalize(client, path, member, layer);
break;
- case ReadValue::Remove:
- remove = true;
- break;
}
- break;
- }
- case Node::KIND_LOCALIZED_VALUE:
- {
- if (isDir) {
+ case Node::KIND_LOCALIZED_PROPERTY:
+ case Node::KIND_GROUP:
+ case Node::KIND_SET:
+ if (!isDir) {
SAL_WARN(
"configmgr.dconf",
- "bad dir " << path
- << " does not match localized value");
+ "bad key " << path
+ << " does not match localized property, group, or"
+ " set, respectively");
continue;
}
- assert(
- node.is() && node->kind() == Node::KIND_LOCALIZED_PROPERTY);
- rtl::Reference<LocalizedPropertyNode> locProp(
- static_cast<LocalizedPropertyNode *>(node.get()));
- css::uno::Any value;
- if (readValue(
- client, path, locProp->getStaticType(),
- locProp->isNillable(), false, &value)
- == ReadValue::Error)
- {
- continue;
- }
- static_cast<LocalizedValueNode *>(member.get())->setValue(
- layer, value);
- finalize(client, path, member, layer);
+ assert(path.endsWith("/"));
+ readDir(
+ data, layer, member, member->getMembers(), client, path);
break;
+ default:
+ assert(false); // cannot happen
}
- case Node::KIND_LOCALIZED_PROPERTY:
- case Node::KIND_GROUP:
- case Node::KIND_SET:
- if (!isDir) {
- SAL_WARN(
- "configmgr.dconf",
- "bad key " << path
- << " does not match localized property, group, or set,"
- " respectively");
- continue;
- }
- assert(path.endsWith("/"));
- readDir(data, layer, member, member->getMembers(), client, path);
- break;
- default:
- assert(false); // cannot happen
}
if (remove) {
- if (!member->getMandatory()) {
+ if (!(member.is() && member->getMandatory())) {
members.erase(name);
}
} else if (replace) {