Univention Bugzilla – Bug 19428
univention-directory-policy wertet ldap/server/addition nicht aus
Last modified: 2013-03-24 21:21:23 CET
In /etc/init.d/univention-directory-policy wird nur die Erreichbarkeit des Hosts ldap/server/name geprüft. ldap/server/addition wird im Fehlerfall nicht geprüft. if /bin/netcat -q0 -w4 $ldap_server_name 389 </dev/null >/dev/null 2>&1; then run-parts /usr/lib/univention-directory-policy \ >>/var/log/univention/ldap-policy.log 2>&1 Es sollte auch geprüft werden, ob die Skripte unterhalb von "/usr/lib/univention-directory-policy" ldap/server/addition auch (nicht) auswerten.
Created attachment 3659 [details] UCS 2.4 Patches Der im Archiv enthaltene Patch univention-directory-policy.init.diff fügt dem script (2.4)/univention-directory-policy/debian/univention-directory-policy.init einen else-Zweig hinzu der ausgeführt wird sollte der primäre ldap-Server nicht erreichbar sein. Im else-Zweig wird über die in ldap/server/addition enthaltenen FQDNS iteriert und jeweils geprüft ob der zur FQDN gehörende ldap-Server erreichbar ist oder nicht. Sollte er es sein wird "run-parts /usr/lib/univention-directory-policy --host $host" (wobei $host der aktuellen FQDN des aktiven ldap-Servers entspricht) aufgerufen und entsprechend ausgewertet. Der ebenfalls im Archiv enthaltene Patch nfsmounts.py.diff passt das script (2.4)/univention-config-registry/nfsmounts.py so an, dass der im else-Zweig durch run-parts an /usr/lib/univention-directory-policy übergebene Paramter "--host" dementsprechend berücksichtig wird.
Created attachment 3660 [details] UCS 3.0 Patches Der im Archiv enthaltene Patch univention-directory-policy.init.diff fügt dem script (3.0)/univention-directory-policy/debian/univention-directory-policy.init einen else-Zweig hinzu der ausgeführt wird sollte der primäre ldap-Server nicht erreichbar sein. Im else-Zweig wird über die in ldap/server/addition enthaltenen FQDNS iteriert und jeweils geprüft ob der zur FQDN gehörende ldap-Server erreichbar ist oder nicht. Sollte er es sein wird "run-parts /usr/lib/univention-directory-policy --host $host" (wobei $host der aktuellen FQDN des aktiven ldap-Servers entspricht) aufgerufen und entsprechend ausgewertet. Der ebenfalls im Archiv enthaltene Patch nfsmounts.py.diff passt das script (3.0)/univention-base-files/univention-directory-policy/nfsmounts.py so an, dass der im else-Zweig durch run-parts an /usr/lib/univention-directory-policy übergebene Paramter "--host" dementsprechend berücksichtig wird.
Sowohl die Patches für 2.4 und 3.0 müssten abermals getestet werden. Funktionsweise der Änderungen an nfsmounts.py ist nicht verifiziert.
Info zum Patch, in der Zeile: opts, pargs = getopt.getopt(sys.argv[1:], 'hsvh', ['help', 'simulate', 'verbose', 'host']) sollte --host nicht auf -h, sondern -H gemappt werden (ansonsten gibt es eine Überschneidung mit --help). (Kleiner Hinweis: Bitte Patches als Patches an den Bug hängen, dann können sie einfach betrachtet werden.)
/etc/init.d/univention-directory-policy (univention-directory-policy) wurde entsprechend angepasst (zunächst wird $ldap_server_name getestet, dann $ldap_server_addition, bei Erfolg wird run-parts aufgerufen und die Schleife beendet) Unter /usr/lib/univention-directory-policy habe ich keine Skripte mehr gefunden, die direkt $ldap_server_name verwenden. Jedoch verwenden alle univention_policy_result und das ging bisher nur gegen $ldap_server_name. univention_policy_result (univention-policy) wurde auch angepasst. Wenn kein Host angegeben wurde und das erste univention_ldap_open (auf $ldap_server_name, siehe lib/ldap.c -> univention_ldap_open()) fehl schlägt, wird ldap/server/addition ausgelesen und auf alle Elemente (Leerzeichen ist Trenner!) ein univention_ldap_open versucht, bis eines erfolgreich ist.
Created attachment 4788 [details] Patch für univention-policy (free für duplizierte Strings).
(In reply to comment #6) > Created an attachment (id=4788) [details] > Patch für univention-policy (free für duplizierte Strings). eingebaut.
root@slave:~# ucr set ldap/server/name="invalid1 root@slave:~# ucr set ldap/server/addition="invalid2 invalid3 invalid4" root@slave:~# /usr/bin/univention-policy-result -D "$ldap_hostdn"\ -y /etc/machine.secret "$ldap_hostdn" could not open policy for cn=slave,cn=dc,cn=computers,dc=arucs31i5,dc=qa *** glibc detected *** /usr/bin/univention-policy-result: double free or corruption (fasttop): 0x00000000022fb670 *** ======= Backtrace: ========= /lib/libc.so.6(+0x71e16)[0x7f6c5d7f6e16] /lib/libc.so.6(cfree+0x6c)[0x7f6c5d7fbb8c] /usr/lib/libuniventionpolicy.so.0(univention_ldap_close+0x62)[0x7f6c5dae98f2] /usr/bin/univention-policy-result[0x40155d] /lib/libc.so.6(__libc_start_main+0xfd)[0x7f6c5d7a3c8d] /usr/bin/univention-policy-result[0x401149]
Kann ich nicht nachvollziehen. -> ucr set ldap/server/name="invalid1" ldap/server/addition="invalid2 invalid3 invalid4" -> univention_policy_result -D $(ucr get ldap/hostdn) -y /etc/machine.secret $(ucr get ldap/hostdn) could not open policy for cn=master,cn=dc,cn=computers,dc=ucs,dc=new # master.ucs.new ist der erreichbare UCS Master -> ucr set ldap/server/name="invalid1" ldap/server/addition="invalid2 invalid3 invalid4 master.ucs.new" -> univention_policy_result -D $(ucr get ldap/hostdn) -y /etc/machine.secret $(ucr get ldap/hostdn) DN: cn=master,cn=dc,cn=computers,dc=ucs,dc=new POLICY cn=master,cn=dc,cn=computers,dc=ucs,dc=new Policy: cn=default-users,cn=admin-settings,cn=users,cn=policies,dc=ucs,dc=new Attribute: univentionAdminMayOverrideSettings Value: 0 ...
OK, hatte nicht mit der aktuellen Version getestet.
univention_policy_result.c gibt ldap_parameters->hosf nun mit FREE frei. Dadurch wird der Pointer zugleich auf NULL gesetzt und ein späteres FREE in lib/ldap.c.univention_ldap_close() führt nicht mehr zum Fehler.
Ok, funktioniert super, mit gültigen und ungültigen Servernamen.
UCS 3.1-0 has been released: http://forum.univention.de/viewtopic.php?f=54&t=2125 If this error occurs again, please use "Clone This Bug".
*** Bug 22186 has been marked as a duplicate of this bug. ***