summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNalin Dahyabhai <nalin.dahyabhai@pobox.com>2009-05-07 16:24:27 -0400
committerNalin Dahyabhai <nalin.dahyabhai@pobox.com>2009-05-07 16:24:27 -0400
commit1066dffe368e20ae43b1e6191a9138598da4f816 (patch)
tree172df0a0fd544255c6646c166ab85c967c56dd19
parentebd466d34ccd21f4d47246d2f831c00cf4bde9d4 (diff)
downloadslapi-nis-1066dffe368e20ae43b1e6191a9138598da4f816.tar.gz
slapi-nis-1066dffe368e20ae43b1e6191a9138598da4f816.tar.xz
slapi-nis-1066dffe368e20ae43b1e6191a9138598da4f816.zip
- make sure that %referred() and %deref() don't return empty strings
-rw-r--r--doc/format-specifiers.txt3
-rw-r--r--src/format.c18
-rwxr-xr-xtests/test32-nis-empty/before.sh8
-rw-r--r--tests/test32-nis-empty/before.txt17
-rw-r--r--tests/test32-nis-empty/description.txt1
-rw-r--r--tests/test32-nis-empty/dse.ldif22
-rw-r--r--tests/test32-nis-empty/userRoot.ldif28
7 files changed, 88 insertions, 9 deletions
diff --git a/doc/format-specifiers.txt b/doc/format-specifiers.txt
index 437f11f..c9cd87d 100644
--- a/doc/format-specifiers.txt
+++ b/doc/format-specifiers.txt
@@ -335,7 +335,7 @@ here (except for ''VALUEATTRIBUTE'') should be indexed.
merge(''SEPARATOR'',''EXPRESSION''[,...])
Evaluates and then creates a single value using multiple expressions
-which can evaluate to either single values or lists. Any expressions
+which may evaluate to either single values or lists. Any expressions
which cannot be evaluated are ignored.
Here are some example entries:
@@ -354,6 +354,7 @@ Here are some example entries:
And here's how an example expression evaluates for ''cn=group'':
%merge(":","%{membername}","%deref(\"member\",\"uid\")") -> jim:bob:pete
+ %merge(":","%{madeup}") -> (empty string)
=== collect ===
diff --git a/src/format.c b/src/format.c
index c32ad83..3cc1b64 100644
--- a/src/format.c
+++ b/src/format.c
@@ -918,9 +918,9 @@ format_deref(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e,
if (slapi_vattr_values_get(e, ref_attr, &ref_values,
&ref_disposition, &actual_ref_attr,
0, &ref_buffer_flags) != 0) {
- /* No references means we're done. */
+ /* No references means we're done, no answers to give. */
format_free_parsed_args(argv);
- return 0;
+ return -ENOENT;
}
/* Retrieve these attributes from the referred-to entries. */
attrs[0] = ref_attr;
@@ -1280,7 +1280,7 @@ format_referred(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e,
backend_free_set_config(set_bases, set_filter);
slapi_pblock_destroy(local_pb);
format_free_parsed_args(argv);
- return 0;
+ return -ENOENT;
}
/* Note that the attribute in this map refers to this entry. */
@@ -1337,16 +1337,18 @@ format_referred(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e,
}
free(filter);
+ backend_free_set_config(set_bases, set_filter);
+ slapi_pblock_destroy(local_pb);
+ format_free_parsed_args(argv);
+
/* Return any values we found. */
if (cbdata.choices != NULL) {
format_add_choice(outbuf_choices, outbuf, cbdata.choices);
format_free_bv_list(cbdata.choices);
+ return 0;
+ } else {
+ return -ENOENT;
}
-
- backend_free_set_config(set_bases, set_filter);
- slapi_pblock_destroy(local_pb);
- format_free_parsed_args(argv);
- return 0;
}
/* Add the name of this entry to the DN list in the cbdata. */
diff --git a/tests/test32-nis-empty/before.sh b/tests/test32-nis-empty/before.sh
new file mode 100755
index 0000000..27afbdf
--- /dev/null
+++ b/tests/test32-nis-empty/before.sh
@@ -0,0 +1,8 @@
+#!/bin/sh
+echo map list:
+$YP maplist example.com
+$YP -c maplist example.com
+for map in `$YP maplist example.com` ; do
+ echo contents of example.com:"$map":
+ $YP cat example.com $map
+done
diff --git a/tests/test32-nis-empty/before.txt b/tests/test32-nis-empty/before.txt
new file mode 100644
index 0000000..6d4b257
--- /dev/null
+++ b/tests/test32-nis-empty/before.txt
@@ -0,0 +1,17 @@
+map list:
+groups
+memberships
+groups
+memberships
+contents of example.com:groups:
+group1 group1-fake-uid:group1
+group2 group2-fake-uid:group2,group2-fake-uid:group2-alternate-name
+group2-alternate-name group2-fake-uid:group2,group2-fake-uid:group2-alternate-name
+contents of example.com:memberships:
+user1 group1
+user1a
+user1b
+user1c
+user2a
+user2b
+user2c
diff --git a/tests/test32-nis-empty/description.txt b/tests/test32-nis-empty/description.txt
new file mode 100644
index 0000000..795f1be
--- /dev/null
+++ b/tests/test32-nis-empty/description.txt
@@ -0,0 +1 @@
+deref() and referred() not returning empties
diff --git a/tests/test32-nis-empty/dse.ldif b/tests/test32-nis-empty/dse.ldif
new file mode 100644
index 0000000..b371b01
--- /dev/null
+++ b/tests/test32-nis-empty/dse.ldif
@@ -0,0 +1,22 @@
+dn: nis-domain=example.com+nis-map=groups,cn=NIS Server,cn=plugins,cn=config
+objectClass: top
+objectClass: extensibleObject
+nis-domain: example.com
+nis-map: groups
+nis-base: cn=Groups1, cn=Accounts, dc=example, dc=com
+nis-base: cn=Groups2, cn=Accounts, dc=example, dc=com
+nis-filter: objectclass=posixGroup
+nis-keys-format: %{cn}
+nis-values-format: %merge(",", "%deref(\"member\", \"madeup\")", "%deref(\"madeup\", \"madeup\")", "%{uid}:%{cn}")
+
+dn: nis-domain=example.com+nis-map=memberships,cn=NIS Server,cn=plugins,cn=config
+objectClass: top
+objectClass: extensibleObject
+nis-domain: example.com
+nis-map: memberships
+nis-base: cn=Users1, cn=Accounts, dc=example, dc=com
+nis-base: cn=Users2, cn=Accounts, dc=example, dc=com
+nis-filter: objectclass=posixAccount
+nis-keys-format: %{uid}
+nis-values-format: %merge(",", "%referred(\"groups\", \"member\", \"cn\")", "%referred(\"groups\", \"member\", \"madeup\")", "%referred(\"groups\", \"madeup\", \"madeup\")", "%referred(\"madeup\", \"madeup\", \"madeup\")")
+
diff --git a/tests/test32-nis-empty/userRoot.ldif b/tests/test32-nis-empty/userRoot.ldif
new file mode 100644
index 0000000..876d6ed
--- /dev/null
+++ b/tests/test32-nis-empty/userRoot.ldif
@@ -0,0 +1,28 @@
+dn: uid=user1, cn=Users1, cn=Accounts, dc=example, dc=com
+objectClass: posixAccount
+objectClass: inetUser
+cn: user1
+uid: user1
+uidNumber: 1001
+gidNumber: 1001
+gecos: User
+loginShell: /bin/bash
+homeDirectory: /home/user
+
+dn: cn=group1, cn=Groups1, cn=Accounts, dc=example, dc=com
+objectClass: posixgroup
+objectClass: extensibleObject
+cn: group1
+uid: group1-fake-uid
+gidNumber: 1002
+member: uid=user1, cn=Users1, cn=Accounts, dc=example, dc=com
+
+dn: cn=group2, cn=Groups1, cn=Accounts, dc=example, dc=com
+objectClass: posixgroup
+objectClass: extensibleObject
+cn: group2
+cn: group2-alternate-name
+uid: group2-fake-uid
+gidNumber: 1003
+member: cn=group1, cn=Groups1, cn=Accounts, dc=example, dc=com
+