diff options
| author | David M. Syzdek <david@syzdek.net> | 2019-11-26 22:10:36 -0900 |
|---|---|---|
| committer | David M. Syzdek <david@syzdek.net> | 2019-11-26 22:10:36 -0900 |
| commit | e7cafff74b65c6c7924bebff1d702fb982ecdfef (patch) | |
| tree | f9de757b20fb1f5c046fefc41cbc6ff1db89016f | |
| parent | 7b24baad5c3b766114c51809098234e483ff1813 (diff) | |
| download | ldap-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.c | 121 | ||||
| -rw-r--r-- | lib/libldapschema/libldapschema.h | 5 | ||||
| -rw-r--r-- | lib/libldapschema/lldap.c | 6 | ||||
| -rw-r--r-- | lib/libldapschema/llexer.c | 6 | ||||
| -rw-r--r-- | lib/libldapschema/lmemory.c | 34 |
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 |
| 103 | int ldapschema_schema_err(LDAPSchema * lsd, LDAPSchemaModel * mod, const char * fmt, ... ) | 104 | int 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 | ||
| 180 | char ** ldapschema_schema_errors(LDAPSchema * lsd ) | 155 | char ** 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 | ||
| 642 | void ldapschema_object_free(LDAPSchemaModel * obj) | 647 | void 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 | ||
