aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorDavid M. Syzdek <david@syzdek.net>2019-11-27 00:14:12 -0900
committerDavid M. Syzdek <david@syzdek.net>2019-11-27 00:19:51 -0900
commiteed2629737878e137e9c27d42f046271d5f5aaf9 (patch)
tree44ddd264f49b04867371c1708b4bdcd491a97c50
parent1f61f562d52a7ca91e9b0028f30c2fd748728b0b (diff)
downloadldap-utils-eed2629737878e137e9c27d42f046271d5f5aaf9.tar.gz
ldap-utils-eed2629737878e137e9c27d42f046271d5f5aaf9.tar.bz2
ldap-utils-eed2629737878e137e9c27d42f046271d5f5aaf9.tar.xz
ldap-utils-eed2629737878e137e9c27d42f046271d5f5aaf9.zip
libldapschema: adding syntax checks for objectClasses
-rw-r--r--lib/libldapschema/lldap.c3
-rw-r--r--lib/libldapschema/llexer.c39
2 files changed, 35 insertions, 7 deletions
diff --git a/lib/libldapschema/lldap.c b/lib/libldapschema/lldap.c
index c980daf..886d76d 100644
--- a/lib/libldapschema/lldap.c
+++ b/lib/libldapschema/lldap.c
@@ -248,9 +248,6 @@ int ldapschema_fetch(LDAPSchema * lsd, LDAP * ld)
248 if (attr->model.type != LDAPSCHEMA_ATTRIBUTETYPE) 248 if (attr->model.type != LDAPSCHEMA_ATTRIBUTETYPE)
249 continue; 249 continue;
250 250
251 if (!(attr->names))
252 ldapschema_schema_err(lsd, (LDAPSchemaModel *)attr, "missing NAME");
253
254 if (!(attr->syntax)) 251 if (!(attr->syntax))
255 ldapschema_schema_err(lsd, (LDAPSchemaModel *)attr, "missing or unknown SYNTAX"); 252 ldapschema_schema_err(lsd, (LDAPSchemaModel *)attr, "missing or unknown SYNTAX");
256 }; 253 };
diff --git a/lib/libldapschema/llexer.c b/lib/libldapschema/llexer.c
index 19a8672..488ed9b 100644
--- a/lib/libldapschema/llexer.c
+++ b/lib/libldapschema/llexer.c
@@ -719,6 +719,9 @@ LDAPSchemaAttributeType * ldapschema_parse_attributetype(LDAPSchema * lsd, const
719 }; 719 };
720 ldapschema_value_free(argv); 720 ldapschema_value_free(argv);
721 721
722 if (!(attr->names))
723 ldapschema_schema_err(lsd, (LDAPSchemaModel *)attr, "missing NAME");
724
722 // register attributeType 725 // register attributeType
723 if ((err = ldapschema_model_register(lsd, &attr->model)) != LDAP_SUCCESS) 726 if ((err = ldapschema_model_register(lsd, &attr->model)) != LDAP_SUCCESS)
724 { 727 {
@@ -1053,6 +1056,11 @@ LDAPSchemaObjectclass * ldapschema_parse_objectclass(LDAPSchema * lsd, const str
1053 else if (!(strcasecmp(argv[pos], "NAME"))) 1056 else if (!(strcasecmp(argv[pos], "NAME")))
1054 { 1057 {
1055 pos++; 1058 pos++;
1059 if ((objcls->model.desc))
1060 {
1061 ldapschema_schema_err_kw_dup(lsd, (LDAPSchemaModel *)objcls, "NAME");
1062 continue;
1063 };
1056 if (argv[pos][0] == '(') 1064 if (argv[pos][0] == '(')
1057 { 1065 {
1058 if ((err = ldapschema_definition_split(lsd, &objcls->model, argv[pos], strlen(argv[pos]), &objcls->names)) == -1) 1066 if ((err = ldapschema_definition_split(lsd, &objcls->model, argv[pos], strlen(argv[pos]), &objcls->names)) == -1)
@@ -1088,6 +1096,11 @@ LDAPSchemaObjectclass * ldapschema_parse_objectclass(LDAPSchema * lsd, const str
1088 else if (!(strcasecmp(argv[pos], "DESC"))) 1096 else if (!(strcasecmp(argv[pos], "DESC")))
1089 { 1097 {
1090 pos++; 1098 pos++;
1099 if ((objcls->model.desc))
1100 {
1101 ldapschema_schema_err_kw_dup(lsd, (LDAPSchemaModel *)objcls, "DESC");
1102 continue;
1103 };
1091 if (pos >= argc) 1104 if (pos >= argc)
1092 { 1105 {
1093 lsd->errcode = LDAPSCHEMA_SCHEMA_ERROR; 1106 lsd->errcode = LDAPSCHEMA_SCHEMA_ERROR;
@@ -1117,6 +1130,11 @@ LDAPSchemaObjectclass * ldapschema_parse_objectclass(LDAPSchema * lsd, const str
1117 { 1130 {
1118 pos++; 1131 pos++;
1119 if ((objcls->sup_name)) 1132 if ((objcls->sup_name))
1133 {
1134 ldapschema_schema_err_kw_dup(lsd, (LDAPSchemaModel *)objcls, "SUP");
1135 continue;
1136 };
1137 if ((objcls->sup_name))
1120 free(objcls->sup_name); 1138 free(objcls->sup_name);
1121 if ((objcls->sup_name = strdup(argv[pos])) == NULL) 1139 if ((objcls->sup_name = strdup(argv[pos])) == NULL)
1122 { 1140 {
@@ -1145,6 +1163,11 @@ LDAPSchemaObjectclass * ldapschema_parse_objectclass(LDAPSchema * lsd, const str
1145 else if (!(strcasecmp(argv[pos], "MUST"))) 1163 else if (!(strcasecmp(argv[pos], "MUST")))
1146 { 1164 {
1147 pos++; 1165 pos++;
1166 if ((objcls->must))
1167 {
1168 ldapschema_schema_err_kw_dup(lsd, (LDAPSchemaModel *)objcls, "MUST");
1169 continue;
1170 };
1148 if ((err = ldapschema_parse_objectclass_attrs(lsd, "MUST", objcls, argv[pos], 1)) > 0) 1171 if ((err = ldapschema_parse_objectclass_attrs(lsd, "MUST", objcls, argv[pos], 1)) > 0)
1149 { 1172 {
1150 ldapschema_value_free(argv); 1173 ldapschema_value_free(argv);
@@ -1157,6 +1180,11 @@ LDAPSchemaObjectclass * ldapschema_parse_objectclass(LDAPSchema * lsd, const str
1157 else if (!(strcasecmp(argv[pos], "MAY"))) 1180 else if (!(strcasecmp(argv[pos], "MAY")))
1158 { 1181 {
1159 pos++; 1182 pos++;
1183 if ((objcls->may))
1184 {
1185 ldapschema_schema_err_kw_dup(lsd, (LDAPSchemaModel *)objcls, "MAY");
1186 continue;
1187 };
1160 if ((err = ldapschema_parse_objectclass_attrs(lsd, "MAY", objcls, argv[pos], 0)) > 0) 1188 if ((err = ldapschema_parse_objectclass_attrs(lsd, "MAY", objcls, argv[pos], 0)) > 0)
1161 { 1189 {
1162 ldapschema_value_free(argv); 1190 ldapschema_value_free(argv);
@@ -1168,14 +1196,17 @@ LDAPSchemaObjectclass * ldapschema_parse_objectclass(LDAPSchema * lsd, const str
1168 // handle unknown parameters 1196 // handle unknown parameters
1169 else 1197 else
1170 { 1198 {
1171 ldapschema_schema_err(lsd, &objcls->model, "invalid term '%s' in definition", argv[pos]); 1199 ldapschema_schema_err_kw_unknown(lsd, (LDAPSchemaModel *)objcls, argv[pos]);
1172 ldapschema_value_free(argv);
1173 ldapschema_objectclass_free(objcls);
1174 return(NULL);
1175 }; 1200 };
1176 }; 1201 };
1177 ldapschema_value_free(argv); 1202 ldapschema_value_free(argv);
1178 1203
1204 if (!(objcls->names))
1205 ldapschema_schema_err(lsd, (LDAPSchemaModel *)objcls, "missing 'NAME'");
1206
1207 if ( (!(objcls->may)) && (!(objcls->must)) )
1208 ldapschema_schema_err(lsd, (LDAPSchemaModel *)objcls, "missing 'MUST' and 'MAY'");
1209
1179 // register objectClass 1210 // register objectClass
1180 if ((err = ldapschema_model_register(lsd, &objcls->model)) != LDAP_SUCCESS) 1211 if ((err = ldapschema_model_register(lsd, &objcls->model)) != LDAP_SUCCESS)
1181 { 1212 {