/mandos/trunk

To get this branch, use:
bzr branch http://bzr.recompile.se/loggerhead/mandos/trunk

« back to all changes in this revision

Viewing changes to Makefile

  • Committer: teddy at recompile
  • Date: 2020-04-05 21:30:59 UTC
  • Revision ID: teddy@recompile.se-20200405213059-fb2a61ckqynrmatk
Fix file descriptor leak in mandos-client

When the local network has Mandos servers announcing themselves using
real, globally reachable, IPv6 addresses (i.e. not link-local
addresses), but there is no router on the local network providing IPv6
RA (Router Advertisement) packets, the client cannot reach the server
by normal means, since the client only has a link-local IPv6 address,
and has no usable route to reach the server's global IPv6 address.
(This is not a common situation, and usually only happens when the
router itself reboots and runs a Mandos client, since it cannot then
give RA packets to itself.)  The client code has a solution for
this, which consists of adding a temporary local route to reach the
address of the server during communication, and removing this
temporary route afterwards.

This solution with a temporary route works, but has a file descriptor
leak; it leaks one file descriptor for each addition and for each
removal of a route.  If one server requiring an added route is present
on the network, but no servers gives a password, making the client
retry after the default ten seconds, and we furthermore assume a
default 1024 open files limit, the client runs out of file descriptors
after about 90 minutes, after which time the client process will be
useless and fail to retrieve any passwords, necessitating manual
password entry via the keyboard.

Fix this by eliminating the file descriptor leak in the client.

* plugins.d/mandos-client.c (add_delete_local_route): Do
  close(devnull) also in parent process, also if fork() fails, and on
  any failure in child process.

Show diffs side-by-side

added added

removed removed

Lines of Context:
41
41
#COVERAGE=--coverage
42
42
OPTIMIZE:=-Os -fno-strict-aliasing
43
43
LANGUAGE:=-std=gnu11
 
44
FEATURES:=-D_FILE_OFFSET_BITS=64
44
45
htmldir:=man
45
 
version:=1.8.6
 
46
version:=1.8.10
46
47
SED:=sed
47
48
PKG_CONFIG?=pkg-config
48
49
 
88
89
                        --variable=systemdsystemunitdir)
89
90
TMPFILES:=$(DESTDIR)$(shell $(PKG_CONFIG) systemd \
90
91
                        --variable=tmpfilesdir)
 
92
SYSUSERS:=$(DESTDIR)$(shell $(PKG_CONFIG) systemd \
 
93
                        --variable=sysusersdir)
91
94
 
92
95
GNUTLS_CFLAGS:=$(shell $(PKG_CONFIG) --cflags-only-I gnutls)
93
96
GNUTLS_LIBS:=$(shell $(PKG_CONFIG) --libs gnutls)
102
105
GLIB_LIBS:=$(shell $(PKG_CONFIG) --libs glib-2.0)
103
106
 
104
107
# Do not change these two
105
 
CFLAGS+=$(WARN) $(DEBUG) $(FORTIFY) $(COVERAGE) \
106
 
        $(OPTIMIZE) $(LANGUAGE) -DVERSION='"$(version)"'
 
108
CFLAGS+=$(WARN) $(DEBUG) $(FORTIFY) $(COVERAGE) $(OPTIMIZE) \
 
109
        $(LANGUAGE) $(FEATURES) -DVERSION='"$(version)"'
107
110
LDFLAGS+=-Xlinker --as-needed $(COVERAGE) $(LINK_FORTIFY) $(strip \
108
111
        ) $(foreach flag,$(LINK_FORTIFY_LD),-Xlinker $(flag))
109
112
 
153
156
 
154
157
objects:=$(addsuffix .o,$(CPROGS))
155
158
 
 
159
.PHONY: all
156
160
all: $(PROGS) mandos.lsm
157
161
 
 
162
.PHONY: doc
158
163
doc: $(DOCS)
159
164
 
 
165
.PHONY: html
160
166
html: $(htmldocs)
161
167
 
162
168
%.5: %.xml common.ent legalnotice.xml
279
285
                $@)
280
286
 
281
287
# Need to add the GnuTLS, Avahi and GPGME libraries
282
 
plugins.d/mandos-client: plugins.d/mandos-client.c
283
 
        $(LINK.c) $^ $(GNUTLS_CFLAGS) $(AVAHI_CFLAGS) $(strip\
284
 
                ) $(GPGME_CFLAGS) $(GNUTLS_LIBS) $(strip\
285
 
                ) $(AVAHI_LIBS) $(GPGME_LIBS) $(LOADLIBES) $(strip\
286
 
                ) $(LDLIBS) -o $@
 
288
plugins.d/mandos-client: CFLAGS += $(GNUTLS_CFLAGS) $(strip \
 
289
        ) $(AVAHI_CFLAGS) $(GPGME_CFLAGS)
 
290
plugins.d/mandos-client: LDLIBS += $(GNUTLS_LIBS) $(strip \
 
291
        ) $(AVAHI_LIBS) $(GPGME_LIBS)
287
292
 
288
293
# Need to add the libnl-route library
289
 
plugin-helpers/mandos-client-iprouteadddel: plugin-helpers/mandos-client-iprouteadddel.c
290
 
        $(LINK.c) $(LIBNL3_CFLAGS) $^ $(LIBNL3_LIBS) $(strip\
291
 
                ) $(LOADLIBES) $(LDLIBS) -o $@
 
294
plugin-helpers/mandos-client-iprouteadddel: CFLAGS += $(LIBNL3_CFLAGS)
 
295
plugin-helpers/mandos-client-iprouteadddel: LDLIBS += $(LIBNL3_LIBS)
292
296
 
293
297
# Need to add the GLib and pthread libraries
294
 
dracut-module/password-agent: dracut-module/password-agent.c
295
 
        $(LINK.c) $(GLIB_CFLAGS) $^ $(GLIB_LIBS) -lpthread $(strip\
296
 
                ) $(LOADLIBES) $(LDLIBS) -o $@
297
 
 
298
 
.PHONY : all doc html clean distclean mostlyclean maintainer-clean \
299
 
        check run-client run-server install install-html \
300
 
        install-server install-client-nokey install-client uninstall \
301
 
        uninstall-server uninstall-client purge purge-server \
302
 
        purge-client
303
 
 
 
298
dracut-module/password-agent: CFLAGS += $(GLIB_CFLAGS)
 
299
dracut-module/password-agent: LDLIBS += $(GLIB_LIBS) -lpthread
 
300
 
 
301
.PHONY: clean
304
302
clean:
305
303
        -rm --force $(CPROGS) $(objects) $(htmldocs) $(DOCS) core
306
304
 
 
305
.PHONY: distclean
307
306
distclean: clean
 
307
.PHONY: mostlyclean
308
308
mostlyclean: clean
 
309
.PHONY: maintainer-clean
309
310
maintainer-clean: clean
310
311
        -rm --force --recursive keydir confdir statedir
311
312
 
 
313
.PHONY: check
312
314
check: all
313
315
        ./mandos --check
314
316
        ./mandos-ctl --check
318
320
        ./dracut-module/password-agent --test
319
321
 
320
322
# Run the client with a local config and key
 
323
.PHONY: run-client
321
324
run-client: all keydir/seckey.txt keydir/pubkey.txt \
322
325
                        keydir/tls-privkey.pem keydir/tls-pubkey.pem
323
326
        @echo '######################################################'
351
354
keydir/seckey.txt keydir/pubkey.txt keydir/tls-privkey.pem keydir/tls-pubkey.pem: mandos-keygen
352
355
        install --directory keydir
353
356
        ./mandos-keygen --dir keydir --force
 
357
        if ! [ -e keydir/tls-privkey.pem ]; then \
 
358
                install --mode=u=rw /dev/null keydir/tls-privkey.pem; \
 
359
        fi
 
360
        if ! [ -e keydir/tls-pubkey.pem ]; then \
 
361
                install --mode=u=rw /dev/null keydir/tls-pubkey.pem; \
 
362
        fi
354
363
 
355
364
# Run the server with a local config
 
365
.PHONY: run-server
356
366
run-server: confdir/mandos.conf confdir/clients.conf statedir
357
367
        ./mandos --debug --no-dbus --configdir=confdir \
358
368
                --statedir=statedir $(SERVERARGS)
369
379
statedir:
370
380
        install --directory statedir
371
381
 
 
382
.PHONY: install
372
383
install: install-server install-client-nokey
373
384
 
 
385
.PHONY: install-html
374
386
install-html: html
375
387
        install --directory $(htmldir)
376
388
        install --mode=u=rw,go=r --target-directory=$(htmldir) \
377
389
                $(htmldocs)
378
390
 
 
391
.PHONY: install-server
379
392
install-server: doc
380
393
        install --directory $(CONFDIR)
381
394
        if install --directory --mode=u=rwx --owner=$(USER) \
389
402
                install --mode=u=rw,go=r tmpfiles.d-mandos.conf \
390
403
                        $(TMPFILES)/mandos.conf; \
391
404
        fi
 
405
        if [ "$(SYSUSERS)" != "$(DESTDIR)" \
 
406
                        -a -d "$(SYSUSERS)" ]; then \
 
407
                install --mode=u=rw,go=r sysusers.d-mandos.conf \
 
408
                        $(SYSUSERS)/mandos.conf; \
 
409
        fi
392
410
        install --mode=u=rwx,go=rx mandos $(PREFIX)/sbin/mandos
393
411
        install --mode=u=rwx,go=rx --target-directory=$(PREFIX)/sbin \
394
412
                mandos-ctl
423
441
        gzip --best --to-stdout intro.8mandos \
424
442
                > $(MANDIR)/man8/intro.8mandos.gz
425
443
 
 
444
.PHONY: install-client-nokey
426
445
install-client-nokey: all doc
427
446
        install --directory $(LIBDIR)/mandos $(CONFDIR)
428
447
        install --directory --mode=u=rwx $(KEYDIR) \
429
448
                $(LIBDIR)/mandos/plugins.d \
430
449
                $(LIBDIR)/mandos/plugin-helpers
 
450
        if [ "$(SYSUSERS)" != "$(DESTDIR)" \
 
451
                        -a -d "$(SYSUSERS)" ]; then \
 
452
                install --mode=u=rw,go=r sysusers.d-mandos.conf \
 
453
                        $(SYSUSERS)/mandos-client.conf; \
 
454
        fi
431
455
        if [ "$(CONFDIR)" != "$(LIBDIR)/mandos" ]; then \
432
456
                install --mode=u=rwx \
433
457
                        --directory "$(CONFDIR)/plugins.d" \
502
526
        gzip --best --to-stdout dracut-module/password-agent.8mandos \
503
527
                > $(MANDIR)/man8/password-agent.8mandos.gz
504
528
 
 
529
.PHONY: install-client
505
530
install-client: install-client-nokey
506
531
# Post-installation stuff
507
532
        -$(PREFIX)/sbin/mandos-keygen --dir "$(KEYDIR)"
517
542
        fi
518
543
        echo "Now run mandos-keygen --password --dir $(KEYDIR)"
519
544
 
 
545
.PHONY: uninstall
520
546
uninstall: uninstall-server uninstall-client
521
547
 
 
548
.PHONY: uninstall-server
522
549
uninstall-server:
523
550
        -rm --force $(PREFIX)/sbin/mandos \
524
551
                $(PREFIX)/sbin/mandos-ctl \
531
558
        update-rc.d -f mandos remove
532
559
        -rmdir $(CONFDIR)
533
560
 
 
561
.PHONY: uninstall-client
534
562
uninstall-client:
535
563
# Refuse to uninstall client if /etc/crypttab is explicitly configured
536
564
# to use it.
572
600
            done; \
573
601
        fi
574
602
 
 
603
.PHONY: purge
575
604
purge: purge-server purge-client
576
605
 
 
606
.PHONY: purge-server
577
607
purge-server: uninstall-server
578
608
        -rm --force $(CONFDIR)/mandos.conf $(CONFDIR)/clients.conf \
579
609
                $(DESTDIR)/etc/dbus-1/system.d/mandos.conf
584
614
                $(DESTDIR)/var/run/mandos.pid
585
615
        -rmdir $(CONFDIR)
586
616
 
 
617
.PHONY: purge-client
587
618
purge-client: uninstall-client
588
619
        -shred --remove $(KEYDIR)/seckey.txt $(KEYDIR)/tls-privkey.pem
589
620
        -rm --force $(CONFDIR)/plugin-runner.conf \