X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Flibldap%2Fschema.c;h=72e4618876d365e19160171425cd64906a0003ee;hb=427f4ee0f66cac081a712e4ccc08609813b17fdc;hp=bff6c5bdbe11db353cbb016bc8a49f0a14ea314a;hpb=7732236996d5185a0f62ef35ac6d7d9abad6c70b;p=openldap
diff --git a/libraries/libldap/schema.c b/libraries/libldap/schema.c
index bff6c5bdbe..72e4618876 100644
--- a/libraries/libldap/schema.c
+++ b/libraries/libldap/schema.c
@@ -1,7 +1,7 @@
/* $OpenLDAP$ */
/* This work is part of OpenLDAP Software .
*
- * Copyright 1998-2005 The OpenLDAP Foundation.
+ * Copyright 1998-2010 The OpenLDAP Foundation.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -30,6 +30,8 @@
#include
+static const char EndOfInput[] = "end of input";
+
static const char *
choose_name( char *names[], const char *fallback )
{
@@ -1027,6 +1029,9 @@ get_token( const char ** sp, char ** token_val )
**sp != ')' &&
**sp != '$' &&
**sp != '\'' &&
+ /* for suggested minimum upper bound on the number
+ * of characters (RFC 4517) */
+ **sp != '{' &&
**sp != '\0' )
(*sp)++;
q = *sp;
@@ -1411,16 +1416,20 @@ add_extension(LDAPSchemaExtensionItem ***extensions,
if ( !*extensions ) {
*extensions =
LDAP_CALLOC(2, sizeof(LDAPSchemaExtensionItem *));
- if ( !*extensions )
- return 1;
+ if ( !*extensions ) {
+ LDAP_FREE( ext );
+ return 1;
+ }
n = 0;
} else {
for ( n=0; (*extensions)[n] != NULL; n++ )
;
tmp = LDAP_REALLOC(*extensions,
(n+2)*sizeof(LDAPSchemaExtensionItem *));
- if ( !tmp )
+ if ( !tmp ) {
+ LDAP_FREE( ext );
return 1;
+ }
*extensions = tmp;
}
(*extensions)[n] = ext;
@@ -1507,7 +1516,7 @@ ldap_str2syntax( LDAP_CONST char * s,
switch (kind) {
case TK_EOS:
*code = LDAP_SCHERR_NORIGHTPAREN;
- *errp = ss;
+ *errp = EndOfInput;
ldap_syntax_free(syn);
return NULL;
case TK_RIGHTPAREN:
@@ -1672,7 +1681,7 @@ ldap_str2matchingrule( LDAP_CONST char * s,
switch (kind) {
case TK_EOS:
*code = LDAP_SCHERR_NORIGHTPAREN;
- *errp = ss;
+ *errp = EndOfInput;
ldap_matchingrule_free(mr);
return NULL;
case TK_RIGHTPAREN:
@@ -1871,7 +1880,7 @@ ldap_str2matchingruleuse( LDAP_CONST char * s,
switch (kind) {
case TK_EOS:
*code = LDAP_SCHERR_NORIGHTPAREN;
- *errp = ss;
+ *errp = EndOfInput;
ldap_matchingruleuse_free(mru);
return NULL;
case TK_RIGHTPAREN:
@@ -2053,7 +2062,8 @@ ldap_str2attributetype( LDAP_CONST char * s,
if ( !at->at_oid ) {
if ( ( flags & ( LDAP_SCHEMA_ALLOW_NO_OID
| LDAP_SCHEMA_ALLOW_OID_MACRO ) )
- && (ss == savepos) ) {
+ && (ss == savepos) )
+ {
/* Backtracking */
ss = savepos;
kind = get_token(&ss,&sval);
@@ -2070,11 +2080,13 @@ ldap_str2attributetype( LDAP_CONST char * s,
!strcasecmp(sval, "COLLECTIVE") ||
!strcasecmp(sval, "NO-USER-MODIFICATION") ||
!strcasecmp(sval, "USAGE") ||
- !strncasecmp(sval, "X-", 2) ) {
+ !strncasecmp(sval, "X-", 2) )
+ {
/* Missing OID, backtrack */
ss = savepos;
} else if ( flags
- & LDAP_SCHEMA_ALLOW_OID_MACRO) {
+ & LDAP_SCHEMA_ALLOW_OID_MACRO)
+ {
/* Non-numerical OID ... */
int len = ss-savepos;
at->at_oid = LDAP_MALLOC(len+1);
@@ -2100,7 +2112,7 @@ ldap_str2attributetype( LDAP_CONST char * s,
switch (kind) {
case TK_EOS:
*code = LDAP_SCHERR_NORIGHTPAREN;
- *errp = ss;
+ *errp = EndOfInput;
ldap_attributetype_free(at);
return NULL;
case TK_RIGHTPAREN:
@@ -2473,7 +2485,7 @@ ldap_str2objectclass( LDAP_CONST char * s,
switch (kind) {
case TK_EOS:
*code = LDAP_SCHERR_NORIGHTPAREN;
- *errp = ss;
+ *errp = EndOfInput;
ldap_objectclass_free(oc);
return NULL;
case TK_RIGHTPAREN:
@@ -2752,7 +2764,7 @@ ldap_str2contentrule( LDAP_CONST char * s,
switch (kind) {
case TK_EOS:
*code = LDAP_SCHERR_NORIGHTPAREN;
- *errp = ss;
+ *errp = EndOfInput;
ldap_contentrule_free(cr);
return NULL;
case TK_RIGHTPAREN:
@@ -2977,7 +2989,7 @@ ldap_str2structurerule( LDAP_CONST char * s,
switch (kind) {
case TK_EOS:
*code = LDAP_SCHERR_NORIGHTPAREN;
- *errp = ss;
+ *errp = EndOfInput;
ldap_structurerule_free(sr);
return NULL;
case TK_RIGHTPAREN:
@@ -3166,7 +3178,7 @@ ldap_str2nameform( LDAP_CONST char * s,
switch (kind) {
case TK_EOS:
*code = LDAP_SCHERR_NORIGHTPAREN;
- *errp = ss;
+ *errp = EndOfInput;
ldap_nameform_free(nf);
return NULL;
case TK_RIGHTPAREN:
@@ -3225,6 +3237,21 @@ ldap_str2nameform( LDAP_CONST char * s,
seen_obsolete = 1;
nf->nf_obsolete = LDAP_SCHEMA_YES;
parse_whsp(&ss);
+ } else if ( !strcasecmp(sval,"OC") ) {
+ LDAP_FREE(sval);
+ if ( seen_class ) {
+ *code = LDAP_SCHERR_DUPOPT;
+ *errp = ss;
+ ldap_nameform_free(nf);
+ return(NULL);
+ }
+ seen_class = 1;
+ nf->nf_objectclass = parse_woid(&ss,code);
+ if ( !nf->nf_objectclass ) {
+ *errp = ss;
+ ldap_nameform_free(nf);
+ return NULL;
+ }
} else if ( !strcasecmp(sval,"MUST") ) {
LDAP_FREE(sval);
if ( seen_must ) {