aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorDavid M. Syzdek <david@syzdek.net>2019-11-26 22:10:36 -0900
committerDavid M. Syzdek <david@syzdek.net>2019-11-26 22:10:36 -0900
commite7cafff74b65c6c7924bebff1d702fb982ecdfef (patch)
treef9de757b20fb1f5c046fefc41cbc6ff1db89016f
parent7b24baad5c3b766114c51809098234e483ff1813 (diff)
downloadldap-utils-e7cafff74b65c6c7924bebff1d702fb982ecdfef.tar.gz
ldap-utils-e7cafff74b65c6c7924bebff1d702fb982ecdfef.tar.bz2
ldap-utils-e7cafff74b65c6c7924bebff1d702fb982ecdfef.tar.xz
ldap-utils-e7cafff74b65c6c7924bebff1d702fb982ecdfef.zip
libldapschema: refactoring error message functions and error messages
-rw-r--r--lib/libldapschema/lerror.c121
-rw-r--r--lib/libldapschema/libldapschema.h5
-rw-r--r--lib/libldapschema/lldap.c6
-rw-r--r--lib/libldapschema/llexer.c6
-rw-r--r--lib/libldapschema/lmemory.c34
5 files changed, 97 insertions, 75 deletions
diff --git a/lib/libldapschema/lerror.c b/lib/libldapschema/lerror.c
index 0cef955..45cac7b 100644
--- a/lib/libldapschema/lerror.c
+++ b/lib/libldapschema/lerror.c
@@ -51,6 +51,7 @@
51#include <stdlib.h> 51#include <stdlib.h>
52 52
53#include "lmemory.h" 53#include "lmemory.h"
54#include "lsort.h"
54 55
55 56
56///////////////// 57/////////////////
@@ -102,73 +103,47 @@ int ldapschema_errno( LDAPSchema * lsd )
102/// @see ldapschema_free, ldapschema_initialize, ldapschema_err2string 103/// @see ldapschema_free, ldapschema_initialize, ldapschema_err2string
103int ldapschema_schema_err(LDAPSchema * lsd, LDAPSchemaModel * mod, const char * fmt, ... ) 104int ldapschema_schema_err(LDAPSchema * lsd, LDAPSchemaModel * mod, const char * fmt, ... )
104{ 105{
105 char buff[512]; 106 char buff[512];
106 va_list args; 107 va_list args;
107 char * str; 108 char * str;
108 const char * type; 109 char ** tmplist;
109 size_t len; 110 char *** listp;
111 int err;
110 112
111 assert(lsd != NULL); 113 assert(lsd != NULL);
112 assert(fmt != NULL); 114 assert(fmt != NULL);
113 115
114 116 // determines which list
115 // initialize errors if first error 117 listp = &lsd->schema_errs;
116 if (!(lsd->schema_errs))
117 {
118 if ((lsd->schema_errs = malloc(sizeof(char *)*2)) == NULL)
119 return(lsd->errcode = LDAPSCHEMA_NO_MEMORY);
120 lsd->schema_errs[0] = NULL;
121 };
122
123 // determine object type
124 if ((mod)) 118 if ((mod))
125 { 119 listp = &mod->errors;
126 switch(mod->type)
127 {
128 case LDAPSCHEMA_ATTRIBUTETYPE: type = "attributeType"; break;
129 case LDAPSCHEMA_OBJECTCLASS: type = "objectClass"; break;
130 case LDAPSCHEMA_SYNTAX: type = "ldapSyntax"; break;
131 case LDAPSCHEMA_MATCHINGRULE: type = "matchingRules"; break;
132 default: type = "unknown"; break;
133 };
134 } else
135 {
136 type = "";
137 };
138 120
139 // save definition if first error for object 121 // initialize errors if first error
140 if (lsd->schema_errs_cur != mod) 122 if (!(*listp))
141 { 123 {
142 lsd->schema_errs_cnt++; 124 if ((*listp = malloc(sizeof(char *)*2)) == NULL)
143 snprintf(buff, sizeof(buff), "%s %zu: ", type, lsd->schema_errs_cnt);
144 len = strlen(buff);
145 snprintf(&buff[len], sizeof(buff)-len, "definition: %s", mod->definition);
146 if ((str = strdup(buff)) == NULL)
147 return(lsd->errcode = LDAPSCHEMA_NO_MEMORY);
148 if ((lsd->schema_errs = ldapschema_value_add(lsd->schema_errs, str, NULL)) == NULL)
149 {
150 free(str);
151 return(lsd->errcode = LDAPSCHEMA_NO_MEMORY); 125 return(lsd->errcode = LDAPSCHEMA_NO_MEMORY);
152 }; 126 bzero(*listp, sizeof(char *)*2);
153 }; 127 };
154 128
155 // create error header
156 snprintf(buff, sizeof(buff), "%s %zu: ", type, lsd->schema_errs_cnt);
157 len = strlen(buff);
158
159 // process error message 129 // process error message
160 va_start(args, fmt); 130 va_start(args, fmt);
161 vsnprintf(&buff[len], sizeof(buff)-len, fmt, args); 131 vsnprintf(buff, sizeof(buff), fmt, args);
162 va_end(args); 132 va_end(args);
163 133
164 // save error 134 // save error
165 if ((str = strdup(buff)) == NULL) 135 if ((str = strdup(buff)) == NULL)
166 return(lsd->errcode = LDAPSCHEMA_NO_MEMORY); 136 return(lsd->errcode = LDAPSCHEMA_NO_MEMORY);
167 if ((lsd->schema_errs = ldapschema_value_add(lsd->schema_errs, str, NULL)) == NULL) 137 if ((tmplist = ldapschema_value_add(*listp, str, NULL)) == NULL)
168 { 138 {
169 free(str); 139 free(str);
170 return(lsd->errcode = LDAPSCHEMA_NO_MEMORY); 140 return(lsd->errcode = LDAPSCHEMA_NO_MEMORY);
171 }; 141 };
142 *listp = tmplist;
143
144 // adds object to error list
145 if ((err = ldapschema_insert(lsd, (void ***)&lsd->objerrs, &lsd->objerrs_len, mod, ldapschema_compar_models)) > 0)
146 return(lsd->errcode);
172 147
173 // set error code 148 // set error code
174 lsd->errcode = LDAPSCHEMA_SCHEMA_ERROR; 149 lsd->errcode = LDAPSCHEMA_SCHEMA_ERROR;
@@ -179,28 +154,64 @@ int ldapschema_schema_err(LDAPSchema * lsd, LDAPSchemaModel * mod, const char *
179 154
180char ** ldapschema_schema_errors(LDAPSchema * lsd ) 155char ** ldapschema_schema_errors(LDAPSchema * lsd )
181{ 156{
182 char ** errs; 157 int len;
183 size_t len; 158 size_t x;
184 size_t pos; 159 size_t y;
160 char buff[256];
161 char * str;
162 char ** errs;
163 char ** tmperrs;
164 LDAPSchemaModel * mod;
185 165
186 assert(lsd != NULL); 166 assert(lsd != NULL);
187 167
188 if (!(lsd->schema_errs)) 168 // if not errors, exit
169 if ( (!(lsd->schema_errs)) && (!(lsd->objerrs)) )
189 return(NULL); 170 return(NULL);
190 171
191 for(len = 0; ((lsd->schema_errs[len])); len++); 172 // initialize list
192 if ((errs = malloc(sizeof(char *)*(len+1))) == NULL) 173 if ((errs = malloc(sizeof(char *)*2)) == NULL)
193 return(NULL); 174 return(NULL);
175 errs[0] = NULL;
176 len = 0;
194 177
195 for(pos = 0; pos < len; pos++) 178 // copy server errors
179 for(x = 0; (((lsd->schema_errs)) && ((lsd->schema_errs[x]))); x++)
196 { 180 {
197 if ((errs[pos] = strdup(lsd->schema_errs[pos])) == NULL) 181 snprintf(buff, sizeof(buff), "server: %s", lsd->schema_errs[x]);
182 if ((str = strdup(buff)) == NULL)
183 {
184 ldapschema_value_free(errs);
185 return(NULL);
186 };
187 if ((tmperrs = ldapschema_value_add(errs, str, &len)) == NULL)
198 { 188 {
199 ldapschema_value_free(errs); 189 ldapschema_value_free(errs);
200 return(NULL); 190 return(NULL);
201 }; 191 };
192 errs = tmperrs;
193 };
194
195 // loop through objects and copy errors
196 for(x = 0; x < lsd->objerrs_len; x++)
197 {
198 mod = lsd->objerrs[x].model;
199 for(y = 0; ((mod->errors[y])); y++)
200 {
201 snprintf(buff, sizeof(buff), "%s: %s: %s", ldapschema_type_name(mod->type), mod->oid, mod->errors[y]);
202 if ((str = strdup(buff)) == NULL)
203 {
204 ldapschema_value_free(errs);
205 return(NULL);
206 };
207 if ((tmperrs = ldapschema_value_add(errs, str, &len)) == NULL)
208 {
209 ldapschema_value_free(errs);
210 return(NULL);
211 };
212 errs = tmperrs;
213 };
202 }; 214 };
203 errs[pos] = NULL;
204 215
205 return(errs); 216 return(errs);
206} 217}
diff --git a/lib/libldapschema/libldapschema.h b/lib/libldapschema/libldapschema.h
index 12e07c2..f8b3bc5 100644
--- a/lib/libldapschema/libldapschema.h
+++ b/lib/libldapschema/libldapschema.h
@@ -74,6 +74,8 @@ struct ldap_schema
74{ 74{
75 int32_t errcode; ///< last error code 75 int32_t errcode; ///< last error code
76 int32_t pad32; 76 int32_t pad32;
77 size_t objerrs_len; ///< number of objects with errors
78 LDAPSchemaPointer * objerrs; ///< objects with errors
77 LDAPSchemaPointer * dups; ///< array of duplicate oids 79 LDAPSchemaPointer * dups; ///< array of duplicate oids
78 size_t dups_len; ///< length of duplicate array 80 size_t dups_len; ///< length of duplicate array
79 LDAPSchemaPointer * oids; ///< array of all known oids 81 LDAPSchemaPointer * oids; ///< array of all known oids
@@ -87,8 +89,6 @@ struct ldap_schema
87 LDAPSchemaAlias ** objclses; ///< array of objectClasses 89 LDAPSchemaAlias ** objclses; ///< array of objectClasses
88 size_t objclses_len; ///< length of objectClasses array 90 size_t objclses_len; ///< length of objectClasses array
89 char ** schema_errs; ///< list of schema errors discovered 91 char ** schema_errs; ///< list of schema errors discovered
90 size_t schema_errs_cnt; ///< number of objects with errors
91 LDAPSchemaModel * schema_errs_cur; ///< reference to current object being reported (may contain multiple errors)
92}; 92};
93 93
94 94
@@ -120,6 +120,7 @@ struct ldap_schema_model
120 const LDAPSchemaSpec * spec; 120 const LDAPSchemaSpec * spec;
121 LDAPSchemaExtension ** extensions; 121 LDAPSchemaExtension ** extensions;
122 size_t extensions_len; 122 size_t extensions_len;
123 char ** errors;
123}; 124};
124 125
125 126
diff --git a/lib/libldapschema/lldap.c b/lib/libldapschema/lldap.c
index edefb71..26e2bbe 100644
--- a/lib/libldapschema/lldap.c
+++ b/lib/libldapschema/lldap.c
@@ -87,8 +87,6 @@ int ldapschema_fetch(LDAPSchema * lsd, LDAP * ld)
87 if ((lsd->schema_errs)) 87 if ((lsd->schema_errs))
88 ldapschema_value_free(lsd->schema_errs); 88 ldapschema_value_free(lsd->schema_errs);
89 lsd->schema_errs = NULL; 89 lsd->schema_errs = NULL;
90 lsd->schema_errs_cnt = 0;
91 lsd->schema_errs_cur = NULL;
92 90
93 attrs = NULL; 91 attrs = NULL;
94 if ((err = ldapschema_definition_split(lsd, NULL, "( + * )", 7, &attrs)) == -1) 92 if ((err = ldapschema_definition_split(lsd, NULL, "( + * )", 7, &attrs)) == -1)
@@ -195,7 +193,7 @@ int ldapschema_fetch(LDAPSchema * lsd, LDAP * ld)
195 continue; 193 continue;
196 if ((alias = ldapschema_find_alias(lsd, attr->sup_name, lsd->attrs, lsd->attrs_len)) == NULL) 194 if ((alias = ldapschema_find_alias(lsd, attr->sup_name, lsd->attrs, lsd->attrs_len)) == NULL)
197 { 195 {
198 ldapschema_schema_err(lsd, &attr->model, "specified invalid superior '%s'", attr->sup_name); 196 ldapschema_schema_err(lsd, &attr->model, "specifies invalid superior '%s'", attr->sup_name);
199 continue; 197 continue;
200 }; 198 };
201 199
@@ -250,7 +248,7 @@ int ldapschema_fetch(LDAPSchema * lsd, LDAP * ld)
250 continue; 248 continue;
251 if ((alias = ldapschema_find_alias(lsd, objcls->sup_name, lsd->objclses, lsd->objclses_len)) == NULL) 249 if ((alias = ldapschema_find_alias(lsd, objcls->sup_name, lsd->objclses, lsd->objclses_len)) == NULL)
252 { 250 {
253 ldapschema_schema_err(lsd, &objcls->model, "specified invalid superior '%s'", objcls->sup_name); 251 ldapschema_schema_err(lsd, &objcls->model, "specifies invalid superior '%s'", objcls->sup_name);
254 continue; 252 continue;
255 }; 253 };
256 254
diff --git a/lib/libldapschema/llexer.c b/lib/libldapschema/llexer.c
index fa6439f..e761f7b 100644
--- a/lib/libldapschema/llexer.c
+++ b/lib/libldapschema/llexer.c
@@ -1172,7 +1172,7 @@ int ldapschema_parse_objectclass_attrs(LDAPSchema * lsd, const char * field,
1172 { 1172 {
1173 if ((alias = ldapschema_find_alias(lsd, attrnames[idx], lsd->attrs, lsd->attrs_len)) == NULL) 1173 if ((alias = ldapschema_find_alias(lsd, attrnames[idx], lsd->attrs, lsd->attrs_len)) == NULL)
1174 { 1174 {
1175 ldapschema_schema_err(lsd, &objcls->model, "'%s' contains invalid attributeType '%s'", field, attrnames[idx]); 1175 ldapschema_schema_err(lsd, &objcls->model, "specifies undefined attributeType '%s' in '%s'", attrnames[idx], field);
1176 lsd->errcode = LDAPSCHEMA_SCHEMA_ERROR; 1176 lsd->errcode = LDAPSCHEMA_SCHEMA_ERROR;
1177 } else 1177 } else
1178 { 1178 {
@@ -1182,13 +1182,13 @@ int ldapschema_parse_objectclass_attrs(LDAPSchema * lsd, const char * field,
1182 return(lsd->errcode); 1182 return(lsd->errcode);
1183 }; 1183 };
1184 if (err == -1) 1184 if (err == -1)
1185 ldapschema_schema_err(lsd, &objcls->model, "'%s' contains duplicate attributeType '%s'", field, attrnames[idx]); 1185 ldapschema_schema_err(lsd, &objcls->model, "specifies duplicate attributeType '%s'in '%s'", attrnames[idx], field);
1186 }; 1186 };
1187 if ((idx+1) < attrnames_len) 1187 if ((idx+1) < attrnames_len)
1188 { 1188 {
1189 idx++; 1189 idx++;
1190 if ((strcasecmp("$", attrnames[idx]))) 1190 if ((strcasecmp("$", attrnames[idx])))
1191 ldapschema_schema_err(lsd, &objcls->model, "'%s' contains invalid delimiter", field); 1191 ldapschema_schema_err(lsd, &objcls->model, "uses invalid delimiter in '%s'", field);
1192 }; 1192 };
1193 }; 1193 };
1194 1194
diff --git a/lib/libldapschema/lmemory.c b/lib/libldapschema/lmemory.c
index 346c321..3818927 100644
--- a/lib/libldapschema/lmemory.c
+++ b/lib/libldapschema/lmemory.c
@@ -202,6 +202,11 @@ void ldapschema_free(LDAPSchema * lsd)
202 202
203 assert(lsd != NULL); 203 assert(lsd != NULL);
204 204
205 // frees list of errors
206 if ((lsd->objerrs))
207 free(lsd->objerrs);
208 lsd->objerrs = NULL;
209
205 // frees syntaxes list 210 // frees syntaxes list
206 if ((lsd->syntaxes)) 211 if ((lsd->syntaxes))
207 { 212 {
@@ -576,7 +581,7 @@ int ldapschema_model_register(LDAPSchema * lsd, LDAPSchemaModel * mod)
576 return(err); 581 return(err);
577 if (err == -1) 582 if (err == -1)
578 { 583 {
579 ldapschema_schema_err(lsd, mod, "server defines duplicate OID '%s'", mod->oid); 584 ldapschema_schema_err(lsd, mod, "duplicates OID of existing object");
580 if ((err = ldapschema_append(lsd,(void ***)&lsd->dups, &lsd->dups_len, mod)) != LDAP_SUCCESS) 585 if ((err = ldapschema_append(lsd,(void ***)&lsd->dups, &lsd->dups_len, mod)) != LDAP_SUCCESS)
581 return(err); 586 return(err);
582 }; 587 };
@@ -593,7 +598,7 @@ int ldapschema_model_register(LDAPSchema * lsd, LDAPSchemaModel * mod)
593 }; 598 };
594 if (err == -1) 599 if (err == -1)
595 { 600 {
596 ldapschema_schema_err(lsd, mod, " model with duplicate oid '%s' found", mod->oid); 601 ldapschema_schema_err(lsd, mod, "duplicates oid of existing object");
597 free(alias); 602 free(alias);
598 }; 603 };
599 604
@@ -611,7 +616,7 @@ int ldapschema_model_register(LDAPSchema * lsd, LDAPSchemaModel * mod)
611 }; 616 };
612 if (err == -1) 617 if (err == -1)
613 { 618 {
614 ldapschema_schema_err(lsd, mod, " model with duplicate desc '%s' found", mod->oid); 619 ldapschema_schema_err(lsd, mod, "duplicates DESC of existing object");
615 free(alias); 620 free(alias);
616 }; 621 };
617 }; 622 };
@@ -630,7 +635,7 @@ int ldapschema_model_register(LDAPSchema * lsd, LDAPSchemaModel * mod)
630 }; 635 };
631 if (err == -1) 636 if (err == -1)
632 { 637 {
633 ldapschema_schema_err(lsd, mod, " object with duplicate name '%s' found", names[idx]); 638 ldapschema_schema_err(lsd, mod, "duplicates NAME '%s' of existing object", names[idx]);
634 free(alias); 639 free(alias);
635 }; 640 };
636 }; 641 };
@@ -641,7 +646,7 @@ int ldapschema_model_register(LDAPSchema * lsd, LDAPSchemaModel * mod)
641 646
642void ldapschema_object_free(LDAPSchemaModel * obj) 647void ldapschema_object_free(LDAPSchemaModel * obj)
643{ 648{
644 size_t ext; 649 size_t idx;
645 650
646 assert(obj != NULL); 651 assert(obj != NULL);
647 652
@@ -656,17 +661,24 @@ void ldapschema_object_free(LDAPSchemaModel * obj)
656 661
657 if ((obj->extensions)) 662 if ((obj->extensions))
658 { 663 {
659 for(ext = 0; ((obj->extensions[ext])); ext++) 664 for(idx = 0; ((obj->extensions[idx])); idx++)
660 { 665 {
661 if ((obj->extensions[ext]->extension)) 666 if ((obj->extensions[idx]->extension))
662 free(obj->extensions[ext]->extension); 667 free(obj->extensions[idx]->extension);
663 if ((obj->extensions[ext]->values)) 668 if ((obj->extensions[idx]->values))
664 ldapschema_value_free(obj->extensions[ext]->values); 669 ldapschema_value_free(obj->extensions[idx]->values);
665 free(obj->extensions[ext]); 670 free(obj->extensions[idx]);
666 }; 671 };
667 free(obj->extensions); 672 free(obj->extensions);
668 }; 673 };
669 674
675 if ((obj->errors))
676 {
677 for(idx = 0; ((obj->errors[idx])); idx++)
678 free(obj->errors[idx]);
679 free(obj->errors);
680 };
681
670 return; 682 return;
671} 683}
672 684