Subject: [alpine-aports] [PATCH] community/erlang: upgrade to 19.0.1

From: Marlus Saraiva <[email-masked]>
Date: Mon, 11 Jul 2016 23:33:13 +0000

---
 ...at-man-pages-and-do-not-install-miscellan.patch |   37 -
 community/erlang/0002-Remove-rpath.patch           |   28 -
 .../erlang/0003-Do-not-install-C-sources.patch     |  143 --
 .../erlang/0004-Do-not-install-Java-sources.patch  |   28 -
 .../0006-Do-not-install-erlang-sources.patch       |  840 ---------
 ...7-Split-off-webtool-dependency-from-tools.patch |   38 -
 .../erlang/0015-otp-update-version-19.0.1.patch    | 1233 +++++++++++++
 .../0060-set-disksup_posix_only-to-true.patch      |   22 -
 .../erlang/0070-otp-update-version-18.3.2.patch    | 1887 --------------------
 community/erlang/APKBUILD                          |   54 +-
 10 files changed, 1243 insertions(+), 3067 deletions(-)
 delete mode 100644 community/erlang/0001-Do-not-format-man-pages-and-do-not-install-miscellan.patch
 delete mode 100644 community/erlang/0002-Remove-rpath.patch
 delete mode 100644 community/erlang/0003-Do-not-install-C-sources.patch
 delete mode 100644 community/erlang/0004-Do-not-install-Java-sources.patch
 delete mode 100644 community/erlang/0006-Do-not-install-erlang-sources.patch
 delete mode 100644 community/erlang/0007-Split-off-webtool-dependency-from-tools.patch
 create mode 100644 community/erlang/0015-otp-update-version-19.0.1.patch
 delete mode 100644 community/erlang/0060-set-disksup_posix_only-to-true.patch
 delete mode 100644 community/erlang/0070-otp-update-version-18.3.2.patch

diff --git a/community/erlang/0001-Do-not-format-man-pages-and-do-not-install-miscellan.patch b/community/erlang/0001-Do-not-format-man-pages-and-do-not-install-miscellan.patch
deleted file mode 100644
index fef4a7f..0000000
--- a/community/erlang/0001-Do-not-format-man-pages-and-do-not-install-miscellan.patch
+++ /dev/null
@@ -1,37 +0,0 @@
-From: Peter Lemenkov <[email-masked]>
-Date: Thu, 25 Feb 2010 16:45:28 +0300
-Subject: [PATCH] Do not format man-pages and do not install miscellaneous
- utilities for dealing with man-pages.
-
-Signed-off-by: Peter Lemenkov <[email-masked]>
-
---- otp_src_18.0-orig/erts/etc/common/Makefile.in
-+++ otp_src_18.0-fixed/erts/etc/common/Makefile.in
-@@ -551,10 +551,6 @@
- ifneq ($(INSTALL_TOP_BIN),)
- 	$(INSTALL_PROGRAM) $(INSTALL_TOP_BIN) "$(RELEASE_PATH)"
- endif
--ifneq ($(INSTALL_MISC),)
--	$(INSTALL_DIR) "$(RELEASE_PATH)/misc"
--	$(INSTALL_SCRIPT) $(INSTALL_MISC) "$(RELEASE_PATH)/misc"
--endif
- ifneq ($(INSTALL_SRC),)
- 	$(INSTALL_DIR) "$(RELEASE_PATH)/erts-$(VSN)/src"
- 	$(INSTALL_DATA) $(INSTALL_SRC) "$(RELEASE_PATH)/erts-$(VSN)/src"
---- otp_src_18.0-orig/erts/etc/unix/Install.src
-+++ otp_src_18.0-fixed/erts/etc/unix/Install.src
-@@ -141,14 +141,5 @@
- cp -p ../releases/%I_SYSTEM_VSN%/no_dot_erlang.boot .
- cp -p $Name.boot start.boot
- cp -p ../releases/%I_SYSTEM_VSN%/$Name.script start.script
--#
--# Fixing the man pages
--#
--
--if [ -d "$ERL_ROOT/man" ]
--then
--    cd "$ERL_ROOT"
--    ./misc/format_man_pages "$ERL_ROOT"
--fi
- 
- exit 0
diff --git a/community/erlang/0002-Remove-rpath.patch b/community/erlang/0002-Remove-rpath.patch
deleted file mode 100644
index 71658fe..0000000
--- a/community/erlang/0002-Remove-rpath.patch
+++ /dev/null
@@ -1,28 +0,0 @@
-From: Peter Lemenkov <[email-masked]>
-Date: Thu, 25 Feb 2010 16:57:43 +0300
-Subject: [PATCH] Remove rpath
-
-Signed-off-by: Peter Lemenkov <[email-masked]>
-
---- otp_src_18.0-orig/lib/crypto/c_src/Makefile.in
-+++ otp_src_18.0-fixed/lib/crypto/c_src/Makefile.in
-@@ -90,7 +90,7 @@
- DYNAMIC_CRYPTO_LIB=@SSL_DYNAMIC_ONLY@
- 
- ifeq ($(DYNAMIC_CRYPTO_LIB),yes)
--SSL_DED_LD_RUNTIME_LIBRARY_PATH = @SSL_DED_LD_RUNTIME_LIBRARY_PATH@
-+SSL_DED_LD_RUNTIME_LIBRARY_PATH =
- CRYPTO_LINK_LIB=$(SSL_DED_LD_RUNTIME_LIBRARY_PATH) -L$(SSL_LIBDIR) -l$(SSL_CRYPTO_LIBNAME)
- EXTRA_FLAGS = -DHAVE_DYNAMIC_CRYPTO_LIB
- else
---- otp_src_18.0-orig/lib/crypto/priv/Makefile
-+++ otp_src_18.0-fixed/lib/crypto/priv/Makefile
-@@ -61,7 +61,7 @@
- # ----------------------------------------------------
- 
- $(SO_NIFLIB): $(OBJS)
--	$(SO_LD) $(SO_LDFLAGS) -L$(SO_SSL_LIBDIR) -Wl,-R$(SO_SSL_LIBDIR) \
-+	$(SO_LD) $(SO_LDFLAGS) -L$(SO_SSL_LIBDIR) \
- 	-o $@ $^ -lcrypto
- 
- $(DLL_NIFLIB): $(OBJS)
diff --git a/community/erlang/0003-Do-not-install-C-sources.patch b/community/erlang/0003-Do-not-install-C-sources.patch
deleted file mode 100644
index 364c4ad..0000000
--- a/community/erlang/0003-Do-not-install-C-sources.patch
+++ /dev/null
@@ -1,143 +0,0 @@
-From: Peter Lemenkov <[email-masked]>
-Date: Fri, 18 Jun 2010 23:41:33 +0400
-Subject: [PATCH] Do not install C sources
-
-Don't install *.c and *.o files.
-
-Excepts ones from the internal erl_interface. These
-API headers are necessary. See rhbz #818419 for the
-explanation why they're necessary for the low-level
-interaction with the Erlang nodes:
-
-https://bugzilla.redhat.com/818419
-
-Signed-off-by: Peter Lemenkov <[email-masked]>
-
---- otp_src_18.0-orig/lib/asn1/c_src/Makefile
-+++ otp_src_18.0-fixed/lib/asn1/c_src/Makefile
-@@ -143,8 +143,6 @@
- ifneq ($(findstring ose,$(TARGET)),ose)
- 	$(INSTALL_PROGRAM) $(NIF_SHARED_OBJ_FILE) "$(RELSYSDIR)/priv/lib"
- endif
--	$(INSTALL_DIR) "$(RELSYSDIR)/c_src"
--	$(INSTALL_DATA) *.c "$(RELSYSDIR)/c_src"
- 
- release_docs_spec:
- 
---- otp_src_18.0-orig/lib/crypto/c_src/Makefile.in
-+++ otp_src_18.0-fixed/lib/crypto/c_src/Makefile.in
-@@ -200,14 +200,10 @@
- include $(ERL_TOP)/make/otp_release_targets.mk
- 
- release_spec: opt
--	$(INSTALL_DIR) "$(RELSYSDIR)/priv/obj"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/priv/lib"
--	$(INSTALL_DATA) $(NIF_MAKEFILE) "$(RELSYSDIR)/priv/obj"
- ifneq ($(findstring ose,$(TARGET)),ose)
--	$(INSTALL_PROGRAM) $(CRYPTO_OBJS) "$(RELSYSDIR)/priv/obj"
- 	$(INSTALL_PROGRAM) $(NIF_LIB) "$(RELSYSDIR)/priv/lib"
- ifeq ($(DYNAMIC_CRYPTO_LIB),yes)
--	$(INSTALL_PROGRAM) $(CALLBACK_OBJS) "$(RELSYSDIR)/priv/obj"
- 	$(INSTALL_PROGRAM) $(CALLBACK_LIB) "$(RELSYSDIR)/priv/lib"
- endif
- endif
---- otp_src_18.0-orig/lib/erl_interface/src/Makefile.in
-+++ otp_src_18.0-fixed/lib/erl_interface/src/Makefile.in
-@@ -905,14 +905,14 @@
- 	$(INSTALL_PROGRAM) $(EXE_TARGETS) "$(RELSYSDIR)/bin"
- endif
- 	$(INSTALL_DATA) $(EXTRA)        "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) connect/*.[ch]  "$(RELSYSDIR)/src/connect"
--	$(INSTALL_DATA) decode/*.[ch]   "$(RELSYSDIR)/src/decode"
--	$(INSTALL_DATA) encode/*.[ch]   "$(RELSYSDIR)/src/encode"
--	$(INSTALL_DATA) epmd/*.[ch]     "$(RELSYSDIR)/src/epmd"
--	$(INSTALL_DATA) misc/*.[ch]     "$(RELSYSDIR)/src/misc"
--	$(INSTALL_DATA) registry/*.[ch] "$(RELSYSDIR)/src/registry"
--	$(INSTALL_DATA) legacy/*.[ch]   "$(RELSYSDIR)/src/legacy"
--	$(INSTALL_DATA) prog/*.[ch]     "$(RELSYSDIR)/src/prog"
-+	$(INSTALL_DATA) connect/*.h  "$(RELSYSDIR)/src/connect"
-+	$(INSTALL_DATA) decode/*.h   "$(RELSYSDIR)/src/decode"
-+	$(INSTALL_DATA) encode/*.h   "$(RELSYSDIR)/src/encode"
-+	$(INSTALL_DATA) epmd/*.h     "$(RELSYSDIR)/src/epmd"
-+	$(INSTALL_DATA) misc/*.h     "$(RELSYSDIR)/src/misc"
-+	$(INSTALL_DATA) registry/*.h "$(RELSYSDIR)/src/registry"
-+	$(INSTALL_DATA) legacy/*.h   "$(RELSYSDIR)/src/legacy"
-+	$(INSTALL_DATA) prog/*.h     "$(RELSYSDIR)/src/prog"
- 
- release_docs:
- 
---- otp_src_18.0-orig/lib/ic/c_src/Makefile.in
-+++ otp_src_18.0-fixed/lib/ic/c_src/Makefile.in
-@@ -145,12 +145,10 @@
- include $(ERL_TOP)/make/otp_release_targets.mk
- 
- release_spec: opt
--	$(INSTALL_DIR) "$(RELSYSDIR)/c_src"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/include"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/priv/lib"
- 	$(INSTALL_DIR) "$(RELEASE_PATH)/usr/include"
- 	$(INSTALL_DIR) "$(RELEASE_PATH)/usr/lib"
--	$(INSTALL_DATA) ic.c ic_tmo.c "$(RELSYSDIR)/c_src"
- 	$(INSTALL_DATA) $(IDL_FILES) $(H_FILES) "$(RELSYSDIR)/include"
- 	$(INSTALL_DATA) $(LIBRARY) "$(RELSYSDIR)/priv/lib"
- 	$(INSTALL_DATA) $(IDL_FILES) $(H_FILES) "$(RELEASE_PATH)/usr/include"
---- otp_src_18.0-orig/lib/megaco/src/flex/Makefile.in
-+++ otp_src_18.0-fixed/lib/megaco/src/flex/Makefile.in
-@@ -271,7 +271,7 @@
- 	$(INSTALL_DATA) $(ERL_FILES) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src/flex"
- 	$(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin"
- ifeq ($(ENABLE_MEGACO_FLEX_SCANNER),true)
--	$(INSTALL_DATA) $(FLEX_FILES) $(C_TARGETS) "$(RELSYSDIR)/src/flex"
-+	$(INSTALL_DATA) $(FLEX_FILES) "$(RELSYSDIR)/src/flex"
- 	$(INSTALL_PROGRAM) $(SOLIBS) "$(RELSYSDIR)/priv/lib"
- endif
- 
---- otp_src_18.0-orig/lib/odbc/c_src/Makefile.in
-+++ otp_src_18.0-fixed/lib/odbc/c_src/Makefile.in
-@@ -129,11 +129,8 @@
- 
- release_spec: opt
- ifdef EXE_TARGET
--	$(INSTALL_DIR) "$(RELSYSDIR)/c_src"
--	$(INSTALL_DATA) $(C_FILES) $(H_FILES) "$(RELSYSDIR)/c_src"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/priv"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/priv/bin"
--	$(INSTALL_DIR) "$(RELSYSDIR)/priv/obj"
- 	$(INSTALL_PROGRAM) $(EXE_TARGET) "$(RELSYSDIR)/priv/bin"
- endif
- 
---- otp_src_18.0-orig/lib/os_mon/c_src/Makefile.in
-+++ otp_src_18.0-fixed/lib/os_mon/c_src/Makefile.in
-@@ -126,8 +126,6 @@
- include $(ERL_TOP)/make/otp_release_targets.mk
- 
- release_spec: opt
--	$(INSTALL_DIR) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(C_FILES) "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/priv/bin"
- 	$(INSTALL_PROGRAM) $(TARGET_FILES) "$(RELSYSDIR)/priv/bin"
- 
---- otp_src_18.0-orig/lib/runtime_tools/c_src/Makefile.in
-+++ otp_src_18.0-fixed/lib/runtime_tools/c_src/Makefile.in
-@@ -157,10 +157,8 @@
- include $(ERL_TOP)/make/otp_release_targets.mk
- 
- release_spec: opt
--	$(INSTALL_DIR) "$(RELSYSDIR)/priv/obj"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/priv/lib"
- ifneq ($(findstring ose,$(TARGET)),ose)
--	$(INSTALL_PROGRAM) $(DYNTRACE_OBJS) "$(RELSYSDIR)/priv/obj"
- 	$(INSTALL_PROGRAM) $(NIF_LIB) $(SOLIBS) "$(RELSYSDIR)/priv/lib"
- endif
- 
---- otp_src_18.0-orig/lib/tools/c_src/Makefile.in
-+++ otp_src_18.0-fixed/lib/tools/c_src/Makefile.in
-@@ -198,8 +198,6 @@
- RELSYSDIR = $(RELEASE_PATH)/lib/tools-$(TOOLS_VSN)
- 
- release_spec: all
--	$(INSTALL_DIR) "$(RELSYSDIR)/c_src"
--	$(INSTALL_DATA) $(EMEM_SRCS) $(EMEM_HEADERS) "$(RELSYSDIR)/c_src"
- ifneq ($(PROGS),)
- 	$(INSTALL_DIR) "$(RELSYSDIR)/bin"
- 	$(INSTALL_PROGRAM) $(PROGS) "$(RELSYSDIR)/bin"
diff --git a/community/erlang/0004-Do-not-install-Java-sources.patch b/community/erlang/0004-Do-not-install-Java-sources.patch
deleted file mode 100644
index 799476c..0000000
--- a/community/erlang/0004-Do-not-install-Java-sources.patch
+++ /dev/null
@@ -1,28 +0,0 @@
-From: Peter Lemenkov <[email-masked]>
-Date: Sat, 19 Jun 2010 09:25:18 +0400
-Subject: [PATCH] Do not install Java sources
-
-Signed-off-by: Peter Lemenkov <[email-masked]>
-
---- otp_src_18.0-orig/lib/ic/java_src/com/ericsson/otp/ic/Makefile
-+++ otp_src_18.0-fixed/lib/ic/java_src/com/ericsson/otp/ic/Makefile
-@@ -113,8 +113,6 @@
- include $(ERL_TOP)/make/otp_release_targets.mk
- 
- release_spec: opt
--	$(INSTALL_DIR) "$(RELSYSDIR)/java_src/com/ericsson/otp/ic"
--	$(INSTALL_DATA) $(JAVA_FILES) "$(RELSYSDIR)/java_src/com/ericsson/otp/ic"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/priv"
- 	$(INSTALL_DATA) $(JAVA_DEST_ROOT)$(JARFILE) "$(RELSYSDIR)/priv"
- 
---- otp_src_18.0-orig/lib/jinterface/java_src/com/ericsson/otp/erlang/Makefile
-+++ otp_src_18.0-fixed/lib/jinterface/java_src/com/ericsson/otp/erlang/Makefile
-@@ -120,8 +120,6 @@
- 	$(V_at)$(MAKE) $(MFLAGS) RELEASE_PATH="$(RELEASE_PATH)" $(TARGET_MAKEFILE)  $@_spec
- 
- release_spec: opt
--	$(V_at)$(INSTALL_DIR) "$(RELSYSDIR)/java_src/com/ericsson/otp/erlang"
--	$(V_at)$(INSTALL_DATA) $(JAVA_SRC) "$(RELSYSDIR)/java_src/com/ericsson/otp/erlang"
- 	$(V_at)$(INSTALL_DIR) "$(RELSYSDIR)/priv"
- 	$(V_at)$(INSTALL_DATA) $(JAVA_DEST_ROOT)$(JARFILE) "$(RELSYSDIR)/priv"
- 	$(V_at)$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
diff --git a/community/erlang/0006-Do-not-install-erlang-sources.patch b/community/erlang/0006-Do-not-install-erlang-sources.patch
deleted file mode 100644
index d264665..0000000
--- a/community/erlang/0006-Do-not-install-erlang-sources.patch
+++ /dev/null
@@ -1,840 +0,0 @@
---- otp_src_18.3-orig/erts/preloaded/src/Makefile
-+++ otp_src_18.3-fixed/erts/preloaded/src/Makefile
-@@ -86,8 +86,6 @@
- include $(ERL_TOP)/make/otp_release_targets.mk
- 
- release_spec: $(APP_TARGET)
--	$(INSTALL_DIR) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(ERL_FILES) $(BEAM_FILES) $(STUBS_FILES) "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(STATIC_TARGET_FILES) $(APP_TARGET) "$(RELSYSDIR)/ebin"
- 
---- otp_src_18.3-orig/lib/asn1/src/Makefile
-+++ otp_src_18.3-fixed/lib/asn1/src/Makefile
-@@ -155,7 +155,7 @@
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA)  $(ERL_FILES) $(HRL_FILES) $(APP_SRC) $(APPUP_SRC) "$(RELSYSDIR)/src"
-+	$(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/examples"
- 	$(INSTALL_DATA) $(EXAMPLES) "$(RELSYSDIR)/examples"
- 
---- otp_src_18.3-orig/lib/common_test/src/Makefile
-+++ otp_src_18.3-fixed/lib/common_test/src/Makefile
-@@ -144,7 +144,7 @@
- 
- release_spec: opt
- 	$(INSTALL_DIR) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) "$(RELSYSDIR)/src"
-+	$(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/include"
---- otp_src_18.3-orig/lib/compiler/src/Makefile
-+++ otp_src_18.3-fixed/lib/compiler/src/Makefile
-@@ -172,8 +172,8 @@
- 
- release_spec: opt
- 	$(INSTALL_DIR) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) $(EXTRA_FILES) \
--		$(YRL_FILE) "$(RELSYSDIR)/src"
-+	$(INSTALL_DATA) $(HRL_FILES) $(EXTRA_FILES) \
-+		"$(RELSYSDIR)/src"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(INSTALL_FILES) "$(RELSYSDIR)/ebin"
- 
---- otp_src_18.3-orig/lib/cosEvent/src/Makefile
-+++ otp_src_18.3-fixed/lib/cosEvent/src/Makefile
-@@ -203,7 +203,7 @@
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) $(GEN_ERL_FILES) $(IDL_FILES) "$(RELSYSDIR)/src"
-+	$(INSTALL_DATA) $(HRL_FILES) $(IDL_FILES) "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/include"
- 	$(INSTALL_DATA) $(GEN_HRL_FILES) "$(RELSYSDIR)/include"
- 
---- otp_src_18.3-orig/lib/cosEventDomain/src/Makefile
-+++ otp_src_18.3-fixed/lib/cosEventDomain/src/Makefile
-@@ -172,7 +172,7 @@
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) $(GEN_ERL_FILES) $(IDL_FILES) "$(RELSYSDIR)/src"
-+	$(INSTALL_DATA) $(HRL_FILES) $(IDL_FILES) "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/include"
- 	$(INSTALL_DATA) $(EXTERNAL_GEN_HRL_FILES) "$(RELSYSDIR)/include"
- 
---- otp_src_18.3-orig/lib/cosFileTransfer/src/Makefile
-+++ otp_src_18.3-fixed/lib/cosFileTransfer/src/Makefile
-@@ -180,9 +180,7 @@
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(GEN_FILES) $(IDL_FILES) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) $(GEN_ERL_FILES) $(IDL_FILES) "$(RELSYSDIR)/src"
-+	$(INSTALL_DATA) $(HRL_FILES) $(GEN_HRL_FILES) $(IDL_FILES) "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/include"
--	$(INSTALL_DATA) $(GEN_HRL_FILES) "$(RELSYSDIR)/include"
- 
- release_docs_spec:
---- otp_src_18.3-orig/lib/cosNotification/src/Makefile
-+++ otp_src_18.3-fixed/lib/cosNotification/src/Makefile
-@@ -371,8 +371,7 @@
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(GEN_FILES) $(IDL_FILES) $(YECC_FILES) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) $(IDL_FILES) $(YECC_FILES) "$(RELSYSDIR)/src"
-+	$(INSTALL_DATA) $(GEN_HRL_FILES) $(HRL_FILES) $(IDL_FILES) "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/include"
- 	$(INSTALL_DATA) $(GEN_HRL_FILES) "$(RELSYSDIR)/include"
- 
---- otp_src_18.3-orig/lib/cosProperty/src/Makefile
-+++ otp_src_18.3-fixed/lib/cosProperty/src/Makefile
-@@ -180,8 +180,7 @@
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(GEN_FILES) $(IDL_FILES) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) $(GEN_ERL_FILES) $(IDL_FILES) "$(RELSYSDIR)/src"
-+	$(INSTALL_DATA) $(GEN_HRL_FILES) $(HRL_FILES) $(IDL_FILES) "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/include"
- 	$(INSTALL_DATA) $(GEN_HRL_FILES) "$(RELSYSDIR)/include"
- 
---- otp_src_18.3-orig/lib/cosTime/src/Makefile
-+++ otp_src_18.3-fixed/lib/cosTime/src/Makefile
-@@ -199,8 +199,7 @@
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(GEN_FILES) $(IDL_FILES) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) $(GEN_ERL_FILES) $(IDL_FILES) "$(RELSYSDIR)/src"
-+	$(INSTALL_DATA) $(GEN_HRL_FILES) $(HRL_FILES) $(IDL_FILES) "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/include"
- 	$(INSTALL_DATA) $(GEN_HRL_FILES) "$(RELSYSDIR)/include"
- 
---- otp_src_18.3-orig/lib/cosTransactions/src/Makefile
-+++ otp_src_18.3-fixed/lib/cosTransactions/src/Makefile
-@@ -174,7 +174,7 @@
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) $(GEN_ERL_FILES) $(IDL_FILE) "$(RELSYSDIR)/src"
-+	$(INSTALL_DATA) $(HRL_FILES) $(IDL_FILE) "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/include"
- 	$(INSTALL_DATA) $(EXTERNAL_GEN_HRL_FILES) "$(RELSYSDIR)/include"
- 
---- otp_src_18.3-orig/lib/crypto/src/Makefile
-+++ otp_src_18.3-fixed/lib/crypto/src/Makefile
-@@ -82,8 +82,6 @@
- include $(ERL_TOP)/make/otp_release_targets.mk
- 
- release_spec: opt
--	$(INSTALL_DIR) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(ERL_FILES) "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(TARGET_FILES) $(APP_TARGET) \
- 		$(APPUP_TARGET) "$(RELSYSDIR)/ebin"
---- otp_src_18.3-orig/lib/debugger/src/Makefile
-+++ otp_src_18.3-fixed/lib/debugger/src/Makefile
-@@ -117,7 +117,7 @@
- 
- release_spec: opt
- 	$(INSTALL_DIR) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(ERL_FILES) $(INTERNAL_HRL_FILES) $(TOOLBOX_FILES) "$(RELSYSDIR)/src"
-+	$(INSTALL_DATA) $(INTERNAL_HRL_FILES) $(TOOLBOX_FILES) "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(TARGET_FILES) $(TARGET_TOOLBOX_FILES) "$(RELSYSDIR)/ebin"
- 
---- otp_src_18.3-orig/lib/dialyzer/src/Makefile
-+++ otp_src_18.3-fixed/lib/dialyzer/src/Makefile
-@@ -152,7 +152,7 @@
- 
- release_spec: opt
- 	$(INSTALL_DIR) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) $(EXTRA_FILES) \
-+	$(INSTALL_DATA) $(HRL_FILES) $(EXTRA_FILES) \
- 		"$(RELSYSDIR)/src"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(INSTALL_FILES) "$(RELSYSDIR)/ebin"
---- otp_src_18.3-orig/lib/diameter/src/Makefile
-+++ otp_src_18.3-fixed/lib/diameter/src/Makefile
-@@ -251,11 +251,8 @@
- 	$(MAKE) $(EXAMPLE_DIRS:%/=release_examples_%)
- 
- $(TARGET_DIRS:%/=release_src_%): release_src_%:
--	$(INSTALL_DIR) "$(RELSYSDIR)/src/$*"
--	$(INSTALL_DATA) $(filter $*/%, $(TARGET_MODULES:%=%.erl) \
--	                               $(INTERNAL_HRLS)) \
--	                $(filter $*/%, compiler/$(DICT_YRL).yrl) \
--	                "$(RELSYSDIR)/src/$*"
-+	$(INSTALL_DATA) $(filter $*/%, $(INTERNAL_HRLS)) \
-+	                "$(RELSYSDIR)/src/$*" || true
- 
- $(EXAMPLE_DIRS:%/=release_examples_%): release_examples_%:
- 	$(INSTALL_DIR) "$(RELSYSDIR)/examples/$*"
---- otp_src_18.3-orig/lib/edoc/src/Makefile
-+++ otp_src_18.3-fixed/lib/edoc/src/Makefile
-@@ -88,7 +88,7 @@
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(OBJECTS) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(SOURCES) $(HRL_FILES) $(YRL_FILE) "$(RELSYSDIR)/src"
-+	$(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/src"
- 
- release_docs_spec:
- 
---- otp_src_18.3-orig/lib/eldap/src/Makefile
-+++ otp_src_18.3-fixed/lib/eldap/src/Makefile
-@@ -99,10 +99,6 @@
- release_spec: opt
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET) "$(RELSYSDIR)/ebin"
--	$(INSTALL_DIR) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(ERL_FILES) "$(RELSYSDIR)/src"
--	$(INSTALL_DIR) "$(RELSYSDIR)/asn1"
--	$(INSTALL_DATA) ../asn1/$(ASN1_FILES) "$(RELSYSDIR)/asn1"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/include"
- 	$(INSTALL_DATA) $(EXTERNAL_HRL_FILES) "$(RELSYSDIR)/include"
- 
---- otp_src_18.3-orig/lib/erl_docgen/src/Makefile
-+++ otp_src_18.3-fixed/lib/erl_docgen/src/Makefile
-@@ -90,8 +90,6 @@
- include $(ERL_TOP)/make/otp_release_targets.mk
- 
- release_spec: opt
--	$(INSTALL_DIR) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(ERL_FILES) "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin"
- 
---- otp_src_18.3-orig/lib/et/src/Makefile
-+++ otp_src_18.3-fixed/lib/et/src/Makefile
-@@ -109,7 +109,6 @@
- 	$(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(APP_TARGET) $(APPUP_TARGET) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DIR)  "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(ERL_FILES) "$(RELSYSDIR)/src"
- 	$(INSTALL_DATA) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR)  "$(RELSYSDIR)/include"
- 	$(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/include"
---- otp_src_18.3-orig/lib/eunit/src/Makefile
-+++ otp_src_18.3-fixed/lib/eunit/src/Makefile
-@@ -120,7 +120,6 @@
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(PARSE_TRANSFORM_BIN) $(OBJECTS) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(PARSE_TRANSFORM) $(SOURCES) "$(RELSYSDIR)/src"
- 	$(INSTALL_DATA) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/include"
- 	$(INSTALL_DATA) $(INCLUDE_DELIVERABLES) "$(RELSYSDIR)/include"
---- otp_src_18.3-orig/lib/gs/src/Makefile
-+++ otp_src_18.3-fixed/lib/gs/src/Makefile
-@@ -109,8 +109,8 @@
- 
- release_spec: opt
- 	$(INSTALL_DIR) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(APP_SRC) $(ERL_FILES) $(HRL_FILES) $(GEN_HRL_FILES) \
--		$(GSTK_GENERIC) "$(RELSYSDIR)/src"
-+	$(INSTALL_DATA) $(HRL_FILES) $(GEN_HRL_FILES) \
-+		"$(RELSYSDIR)/src"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/priv/bitmap"
---- otp_src_18.3-orig/lib/hipe/cerl/Makefile
-+++ otp_src_18.3-fixed/lib/hipe/cerl/Makefile
-@@ -102,7 +102,7 @@
- 
- release_spec: opt
- 	$(INSTALL_DIR) "$(RELSYSDIR)/cerl"
--	$(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) "$(RELSYSDIR)/cerl"
-+	$(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/cerl"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin"
- 
---- otp_src_18.3-orig/lib/hipe/flow/Makefile
-+++ otp_src_18.3-fixed/lib/hipe/flow/Makefile
-@@ -102,7 +102,7 @@
- 
- release_spec: opt
- 	$(INSTALL_DIR) "$(RELSYSDIR)/flow"
--	$(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) $(INC_FILES) "$(RELSYSDIR)/flow"
-+	$(INSTALL_DATA) $(HRL_FILES) $(INC_FILES) "$(RELSYSDIR)/flow"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin"
- 
---- otp_src_18.3-orig/lib/hipe/icode/Makefile
-+++ otp_src_18.3-fixed/lib/hipe/icode/Makefile
-@@ -120,7 +120,7 @@
- 
- release_spec: opt
- 	$(INSTALL_DIR) "$(RELSYSDIR)/icode"
--	$(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) "$(RELSYSDIR)/icode"
-+	$(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/icode"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin"
- 
---- otp_src_18.3-orig/lib/hipe/llvm/Makefile
-+++ otp_src_18.3-fixed/lib/hipe/llvm/Makefile
-@@ -103,7 +103,7 @@
- 
- release_spec: opt
- 	$(INSTALL_DIR) $(RELSYSDIR)/llvm
--	$(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) $(RELSYSDIR)/llvm
-+	$(INSTALL_DATA) $(HRL_FILES) $(RELSYSDIR)/llvm
- 	$(INSTALL_DIR) $(RELSYSDIR)/ebin
- 	$(INSTALL_DATA) $(TARGET_FILES) $(RELSYSDIR)/ebin
- 
---- otp_src_18.3-orig/lib/hipe/main/Makefile
-+++ otp_src_18.3-fixed/lib/hipe/main/Makefile
-@@ -118,7 +118,7 @@
- release_spec: opt
- 	$(INSTALL_DATA) ../vsn.mk "$(RELSYSDIR)"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/main"
--	$(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) "$(RELSYSDIR)/main"
-+	$(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/main"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin"
- 
---- otp_src_18.3-orig/lib/hipe/misc/Makefile
-+++ otp_src_18.3-fixed/lib/hipe/misc/Makefile
-@@ -102,7 +102,7 @@
- 
- release_spec: opt
- 	$(INSTALL_DIR) "$(RELSYSDIR)/misc"
--	$(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) "$(RELSYSDIR)/misc"
-+	$(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/misc"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin"
- 
---- otp_src_18.3-orig/lib/hipe/rtl/Makefile
-+++ otp_src_18.3-fixed/lib/hipe/rtl/Makefile
-@@ -105,7 +105,7 @@
- 
- release_spec: opt
- 	$(INSTALL_DIR) "$(RELSYSDIR)/rtl"
--	$(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) "$(RELSYSDIR)/rtl"
-+	$(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/rtl"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin"
- 
---- otp_src_18.3-orig/lib/hipe/util/Makefile
-+++ otp_src_18.3-fixed/lib/hipe/util/Makefile
-@@ -50,7 +50,6 @@
- endif
- MODULES = hipe_timing hipe_dot hipe_digraph $(HIPE_MODULES)
- 
--HRL_FILES=
- ERL_FILES= $(MODULES:%=%.erl)
- TARGET_FILES= $(MODULES:%=$(EBIN)/%.$(EMULATOR))
- DOC_FILES= $(MODULES:%=$(DOCS)/%.html)
-@@ -104,8 +103,6 @@
- include $(ERL_TOP)/make/otp_release_targets.mk
- 
- release_spec: opt
--	$(INSTALL_DIR) "$(RELSYSDIR)/util"
--	$(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) "$(RELSYSDIR)/util"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin"
- 
---- otp_src_18.3-orig/lib/ic/src/Makefile
-+++ otp_src_18.3-fixed/lib/ic/src/Makefile
-@@ -200,7 +200,7 @@
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(TARGET_FILES) $(APP_TARGET) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(ERL_FILES) $(YRL_FILE) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src"
-+	$(INSTALL_DATA) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/examples"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/examples/c-client"
- 	$(INSTALL_DATA) $(CCL_EX_FILES) "$(RELSYSDIR)/examples/c-client"
---- otp_src_18.3-orig/lib/inets/src/ftp/Makefile
-+++ otp_src_18.3-fixed/lib/inets/src/ftp/Makefile
-@@ -91,7 +91,7 @@
- release_spec: opt
- 	$(INSTALL_DIR)  "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR)  "$(RELSYSDIR)/src/ftp"
--	$(INSTALL_DATA) $(HRL_FILES) $(ERL_FILES) "$(RELSYSDIR)/src/ftp"
-+	$(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/src/ftp"
- 	$(INSTALL_DIR)  "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin"
- 
---- otp_src_18.3-orig/lib/inets/src/http_client/Makefile
-+++ otp_src_18.3-fixed/lib/inets/src/http_client/Makefile
-@@ -92,7 +92,7 @@
- release_spec: opt
- 	$(INSTALL_DIR)  "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR)  "$(RELSYSDIR)/src/http_client"
--	$(INSTALL_DATA) $(HRL_FILES) $(ERL_FILES) "$(RELSYSDIR)/src/http_client"
-+	$(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/src/http_client"
- 	$(INSTALL_DIR)  "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin"
- 
---- otp_src_18.3-orig/lib/inets/src/http_lib/Makefile
-+++ otp_src_18.3-fixed/lib/inets/src/http_lib/Makefile
-@@ -90,7 +90,7 @@
- release_spec: opt
- 	$(INSTALL_DIR)  "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR)  "$(RELSYSDIR)/src/http_lib"
--	$(INSTALL_DATA) $(HRL_FILES) $(ERL_FILES) "$(RELSYSDIR)/src/http_lib"
-+	$(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/src/http_lib"
- 	$(INSTALL_DIR)  "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin"
- 
---- otp_src_18.3-orig/lib/inets/src/http_server/Makefile
-+++ otp_src_18.3-fixed/lib/inets/src/http_server/Makefile
-@@ -135,7 +135,7 @@
- release_spec: opt
- 	$(INSTALL_DIR)  "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR)  "$(RELSYSDIR)/src/http_server"
--	$(INSTALL_DATA) $(HRL_FILES) $(ERL_FILES) "$(RELSYSDIR)/src/http_server"
-+	$(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/src/http_server"
- 	$(INSTALL_DIR)  "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(TARGET_FILES) $(BEHAVIOUR_TARGET_FILES) "$(RELSYSDIR)/ebin"
- 
---- otp_src_18.3-orig/lib/inets/src/inets_app/Makefile
-+++ otp_src_18.3-fixed/lib/inets/src/inets_app/Makefile
-@@ -115,7 +115,7 @@
- release_spec: opt
- 	$(INSTALL_DIR)  "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR)  "$(RELSYSDIR)/src/inets_app"
--	$(INSTALL_DATA) $(INTERNAL_HRL_FILES) $(ERL_FILES) "$(RELSYSDIR)/src/inets_app"
-+	$(INSTALL_DATA) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src/inets_app"
- 	$(INSTALL_DIR)  "$(RELSYSDIR)/include"
- 	$(INSTALL_DATA) $(EXTERNAL_HRL_FILES) "$(RELSYSDIR)/include"
- 	$(INSTALL_DIR)  "$(RELSYSDIR)/ebin"
---- otp_src_18.3-orig/lib/inets/src/tftp/Makefile
-+++ otp_src_18.3-fixed/lib/inets/src/tftp/Makefile
-@@ -96,7 +96,7 @@
- release_spec: opt
- 	$(INSTALL_DIR)  "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR)  "$(RELSYSDIR)/src/tftp"
--	$(INSTALL_DATA) $(HRL_FILES) $(ERL_FILES) "$(RELSYSDIR)/src/tftp"
-+	$(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/src/tftp"
- 	$(INSTALL_DIR)  "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(TARGET_FILES) $(BEHAVIOUR_TARGET_FILES) "$(RELSYSDIR)/ebin"
- 
---- otp_src_18.3-orig/lib/kernel/src/Makefile
-+++ otp_src_18.3-fixed/lib/kernel/src/Makefile
-@@ -200,7 +200,6 @@
- 
- release_spec: opt
- 	$(INSTALL_DIR) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(ERL_FILES) "$(RELSYSDIR)/src"
- 	$(INSTALL_DATA) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/include"
- 	$(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/include"
---- otp_src_18.3-orig/lib/megaco/src/app/Makefile
-+++ otp_src_18.3-fixed/lib/megaco/src/app/Makefile
-@@ -114,7 +114,7 @@
- 	$(INSTALL_DATA) $(APP_TARGET) $(APPUP_TARGET) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DIR)  "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR)  "$(RELSYSDIR)/src/app"
--	$(INSTALL_DATA) $(ERL_FILES) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src/app"
-+	$(INSTALL_DATA) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src/app"
- 	$(INSTALL_DIR)  "$(RELSYSDIR)/include"
- 	$(INSTALL_DATA) $(EXTERNAL_HRL_FILES) "$(RELSYSDIR)/include"
- 
---- otp_src_18.3-orig/lib/megaco/src/binary/Makefile
-+++ otp_src_18.3-fixed/lib/megaco/src/binary/Makefile
-@@ -176,7 +176,7 @@
- 	$(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DIR)  "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR)  "$(RELSYSDIR)/src/binary"
--	$(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) $(ASN1_FILES) "$(RELSYSDIR)/src/binary"
-+	$(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/src/binary"
- 
- 
- release_docs_spec:
---- otp_src_18.3-orig/lib/megaco/src/engine/Makefile
-+++ otp_src_18.3-fixed/lib/megaco/src/engine/Makefile
-@@ -102,7 +102,7 @@
- 	$(INSTALL_DATA) $(BEHAVIOUR_TARGET_FILES) $(TARGET_FILES) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DIR)  "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR)  "$(RELSYSDIR)/src/engine"
--	$(INSTALL_DATA) $(ERL_FILES) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src/engine"
-+	$(INSTALL_DATA) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src/engine"
- 	$(INSTALL_DIR)  "$(RELSYSDIR)/include"
- 
- 
---- otp_src_18.3-orig/lib/megaco/src/flex/Makefile.in
-+++ otp_src_18.3-fixed/lib/megaco/src/flex/Makefile.in
-@@ -268,8 +268,6 @@
- 	$(INSTALL_DIR)  "$(RELSYSDIR)/src/flex"
- 	$(INSTALL_DIR)  "$(RELSYSDIR)/priv/lib"
- 	$(INSTALL_DIR)  "$(RELSYSDIR)/include"
--	$(INSTALL_DATA) $(ERL_FILES) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src/flex"
--	$(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin"
- ifeq ($(ENABLE_MEGACO_FLEX_SCANNER),true)
- 	$(INSTALL_DATA) $(FLEX_FILES) "$(RELSYSDIR)/src/flex"
- 	$(INSTALL_PROGRAM) $(SOLIBS) "$(RELSYSDIR)/priv/lib"
---- otp_src_18.3-orig/lib/megaco/src/tcp/Makefile
-+++ otp_src_18.3-fixed/lib/megaco/src/tcp/Makefile
-@@ -94,7 +94,7 @@
- 	$(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DIR)  "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR)  "$(RELSYSDIR)/src/tcp"
--	$(INSTALL_DATA) $(ERL_FILES) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src/tcp"
-+	$(INSTALL_DATA) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src/tcp"
- 
- 
- release_docs_spec:
---- otp_src_18.3-orig/lib/megaco/src/text/Makefile
-+++ otp_src_18.3-fixed/lib/megaco/src/text/Makefile
-@@ -135,7 +135,7 @@
- 	$(INSTALL_DATA) $(BEAM_TARGET_FILES) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DIR)  "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR)  "$(RELSYSDIR)/src/text"
--	$(INSTALL_DATA) $(ERL_FILES) $(INTERNAL_YRL_FILES) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src/text"
-+	$(INSTALL_DATA) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src/text"
- 
- 
- release_docs_spec:
---- otp_src_18.3-orig/lib/megaco/src/udp/Makefile
-+++ otp_src_18.3-fixed/lib/megaco/src/udp/Makefile
-@@ -94,7 +94,7 @@
- 	$(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DIR)  "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR)  "$(RELSYSDIR)/src/udp"
--	$(INSTALL_DATA) $(ERL_FILES) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src/udp"
-+	$(INSTALL_DATA) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src/udp"
- 
- 
- release_docs_spec:
---- otp_src_18.3-orig/lib/mnesia/src/Makefile
-+++ otp_src_18.3-fixed/lib/mnesia/src/Makefile
-@@ -133,7 +133,7 @@
- 
- release_spec: opt
- 	$(INSTALL_DIR) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(HRL_FILES) $(ERL_FILES) "$(RELSYSDIR)/src"
-+	$(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin"
- 
---- otp_src_18.3-orig/lib/observer/src/Makefile
-+++ otp_src_18.3-fixed/lib/observer/src/Makefile
-@@ -152,7 +152,6 @@
- 
- release_spec: opt
- 	$(INSTALL_DIR) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(ERL_FILES) "$(RELSYSDIR)/src"
- 	$(INSTALL_DATA) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/examples"
- 	$(INSTALL_DATA) $(EXAMPLE_FILES) "$(RELSYSDIR)/examples"
---- otp_src_18.3-orig/lib/odbc/src/Makefile
-+++ otp_src_18.3-fixed/lib/odbc/src/Makefile
-@@ -110,7 +110,7 @@
- 
- release_spec: opt
- 	$(INSTALL_DIR) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) "$(RELSYSDIR)/src"
-+	$(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/include"
- 	$(INSTALL_DATA) $(EXT_HRL_FILES) "$(RELSYSDIR)/include"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
---- otp_src_18.3-orig/lib/orber/COSS/CosNaming/Makefile
-+++ otp_src_18.3-fixed/lib/orber/COSS/CosNaming/Makefile
-@@ -145,8 +145,8 @@
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(TARGET_FILES) $(APP_TARGET) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/COSS/CosNaming"
--	$(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) $(IDL_FILE) "$(RELSYSDIR)/COSS/CosNaming"
--	$(INSTALL_DATA) $(GEN_FILES) "$(RELSYSDIR)/COSS/CosNaming"
-+	$(INSTALL_DATA) $(HRL_FILES) $(IDL_FILE) "$(RELSYSDIR)/COSS/CosNaming"
-+	$(INSTALL_DATA) $(GEN_HRL_FILES) $(GEN_EXT_HRL_FILES) "$(RELSYSDIR)/COSS/CosNaming"
- 
- 
- release_docs_spec:
---- otp_src_18.3-orig/lib/orber/src/Makefile
-+++ otp_src_18.3-fixed/lib/orber/src/Makefile
-@@ -253,7 +253,7 @@
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(ERL_FILES) $(YRL_FILE) $(GEN_HRL_FILES_LOC) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src"
-+	$(INSTALL_DATA) $(GEN_HRL_FILES_LOC) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/include"
- 	$(INSTALL_DATA) $(EXTERNAL_HRL_FILES) $(GEN_HRL_FILES_EXT) "$(RELSYSDIR)/include"
- 
---- otp_src_18.3-orig/lib/os_mon/src/Makefile
-+++ otp_src_18.3-fixed/lib/os_mon/src/Makefile
-@@ -105,7 +105,6 @@
- 
- release_spec: opt
- 	$(INSTALL_DIR) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(ERL_FILES) "$(RELSYSDIR)/src"
- 	$(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin"
---- otp_src_18.3-orig/lib/ose/src/Makefile
-+++ otp_src_18.3-fixed/lib/ose/src/Makefile
-@@ -94,9 +94,6 @@
- include $(ERL_TOP)/make/otp_release_targets.mk
- 
- release_spec: opt
--	$(INSTALL_DIR) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(ERL_FILES) "$(RELSYSDIR)/src"
--	$(INSTALL_DIR) "$(RELSYSDIR)/include"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin"
- 
---- otp_src_18.3-orig/lib/otp_mibs/src/Makefile
-+++ otp_src_18.3-fixed/lib/otp_mibs/src/Makefile
-@@ -96,8 +96,6 @@
- include $(ERL_TOP)/make/otp_release_targets.mk
- 
- release_spec: opt
--	$(INSTALL_DIR) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(ERL_FILES) "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(TARGETS) "$(RELSYSDIR)/ebin"
- 
---- otp_src_18.3-orig/lib/parsetools/src/Makefile
-+++ otp_src_18.3-fixed/lib/parsetools/src/Makefile
-@@ -91,8 +91,6 @@
- include $(ERL_TOP)/make/otp_release_targets.mk
- 
- release_spec: opt
--	$(INSTALL_DIR) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(ERL_FILES) "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/include"
---- otp_src_18.3-orig/lib/percept/src/Makefile
-+++ otp_src_18.3-fixed/lib/percept/src/Makefile
-@@ -97,7 +97,6 @@
- 
- release_spec: opt
- 	$(INSTALL_DIR) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(ERL_FILES) "$(RELSYSDIR)/src"
- 	$(INSTALL_DATA) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src"
- #	$(INSTALL_DIR) "$(RELSYSDIR)/include"
- #	$(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/include"
---- otp_src_18.3-orig/lib/public_key/asn1/Makefile
-+++ otp_src_18.3-fixed/lib/public_key/asn1/Makefile
-@@ -96,8 +96,8 @@
- 	$(INSTALL_DIR) "$(RELSYSDIR)/include"
- 	$(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/include"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/asn1"
--	$(INSTALL_DATA) $(ASN_ASNS) $(ASN_ERLS) $(ASN_HRLS) $(ASN_CONFIGS) \
--		 $(GEN_ERLS) "$(RELSYSDIR)/asn1"
-+	$(INSTALL_DATA) $(ASN_ASNS) $(ASN_HRLS) $(ASN_CONFIGS) \
-+		 "$(RELSYSDIR)/asn1"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin"
- 
---- otp_src_18.3-orig/lib/public_key/src/Makefile
-+++ otp_src_18.3-fixed/lib/public_key/src/Makefile
-@@ -109,8 +109,6 @@
- include $(ERL_TOP)/make/otp_release_targets.mk
- 
- release_spec: opt
--	$(INSTALL_DIR) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(INTERNAL_HRL_FILES) $(ERL_FILES) "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/include"
- 	$(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/include"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
---- otp_src_18.3-orig/lib/reltool/src/Makefile
-+++ otp_src_18.3-fixed/lib/reltool/src/Makefile
-@@ -100,7 +100,7 @@
- 
- release_spec: opt
- 	$(INSTALL_DIR) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(INTERNAL_HRL_FILES) $(ERL_FILES) "$(RELSYSDIR)/src"
-+	$(INSTALL_DATA) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(APP_TARGET) $(APPUP_TARGET) "$(RELSYSDIR)/ebin"
---- otp_src_18.3-orig/lib/runtime_tools/src/Makefile
-+++ otp_src_18.3-fixed/lib/runtime_tools/src/Makefile
-@@ -97,8 +97,6 @@
- include $(ERL_TOP)/make/otp_release_targets.mk
- 
- release_spec: opt
--	$(INSTALL_DIR) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(ERL_FILES) "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/include"
- 	$(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/include"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/examples"
---- otp_src_18.3-orig/lib/sasl/src/Makefile
-+++ otp_src_18.3-fixed/lib/sasl/src/Makefile
-@@ -93,7 +93,6 @@
- 
- release_spec: opt
- 	$(INSTALL_DIR) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(ERL_FILES) "$(RELSYSDIR)/src"
- 	$(INSTALL_DATA) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin"
---- otp_src_18.3-orig/lib/snmp/src/agent/Makefile
-+++ otp_src_18.3-fixed/lib/snmp/src/agent/Makefile
-@@ -131,7 +131,7 @@
- release_spec: opt
- 	$(INSTALL_DIR) "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/src/agent"
--	$(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) "$(RELSYSDIR)/src/agent"
-+	$(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/src/agent"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET) \
- 		"$(RELSYSDIR)/ebin"
---- otp_src_18.3-orig/lib/snmp/src/app/Makefile
-+++ otp_src_18.3-fixed/lib/snmp/src/app/Makefile
-@@ -132,7 +132,7 @@
- release_spec: opt
- 	$(INSTALL_DIR) "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/src/app"
--	$(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) "$(RELSYSDIR)/src/app"
-+	$(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/src/app"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET) \
- 		"$(RELSYSDIR)/ebin"
---- otp_src_18.3-orig/lib/snmp/src/compile/Makefile
-+++ otp_src_18.3-fixed/lib/snmp/src/compile/Makefile
-@@ -123,7 +123,7 @@
- release_spec: opt
- 	$(INSTALL_DIR) "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/src/compiler"
--	$(INSTALL_DATA) $(ESCRIPT_SRC) $(PARSER_SRC) $(ERL_FILES) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src/compiler"
-+	$(INSTALL_DATA) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src/compiler"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(EBIN_FILES) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/bin"
---- otp_src_18.3-orig/lib/snmp/src/manager/Makefile
-+++ otp_src_18.3-fixed/lib/snmp/src/manager/Makefile
-@@ -114,7 +114,7 @@
- release_spec: opt
- 	$(INSTALL_DIR) "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/src/manager"
--	$(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) "$(RELSYSDIR)/src/manager"
-+	$(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/src/manager"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin"
- # 	$(INSTALL_DIR) "$(RELSYSDIR)/include"
---- otp_src_18.3-orig/lib/snmp/src/misc/Makefile
-+++ otp_src_18.3-fixed/lib/snmp/src/misc/Makefile
-@@ -112,7 +112,7 @@
- release_spec: opt
- 	$(INSTALL_DIR) "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/src/misc"
--	$(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) "$(RELSYSDIR)/src/misc"
-+	$(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/src/misc"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin"
- # 	$(INSTALL_DIR) "$(RELSYSDIR)/include"
---- otp_src_18.3-orig/lib/ssh/src/Makefile
-+++ otp_src_18.3-fixed/lib/ssh/src/Makefile
-@@ -135,7 +135,7 @@
- 
- release_spec: opt
- 	$(INSTALL_DIR) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(INTERNAL_HRL_FILES) $(ERL_FILES) "$(RELSYSDIR)/src"
-+	$(INSTALL_DATA) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(BEHAVIOUR_TARGET_FILES) $(TARGET_FILES) $(APP_TARGET) \
- 	$(APPUP_TARGET) "$(RELSYSDIR)/ebin"
---- otp_src_18.3-orig/lib/ssl/src/Makefile
-+++ otp_src_18.3-fixed/lib/ssl/src/Makefile
-@@ -142,7 +142,7 @@
- 
- release_spec: opt
- 	$(INSTALL_DIR) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(ERL_FILES) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src"
-+	$(INSTALL_DATA) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(BEHAVIOUR_TARGET_FILES) $(TARGET_FILES) $(APP_TARGET) \
- 	$(APPUP_TARGET) "$(RELSYSDIR)/ebin"
---- otp_src_18.3-orig/lib/stdlib/src/Makefile
-+++ otp_src_18.3-fixed/lib/stdlib/src/Makefile
-@@ -207,7 +207,6 @@
- 
- release_spec: opt
- 	$(INSTALL_DIR) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(ERL_FILES) erl_parse.yrl "$(RELSYSDIR)/src"
- 	$(INSTALL_DATA) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/include"
- 	$(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/include"
---- otp_src_18.3-orig/lib/syntax_tools/src/Makefile
-+++ otp_src_18.3-fixed/lib/syntax_tools/src/Makefile
-@@ -100,8 +100,6 @@
- release_spec: opt
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(OBJECTS) "$(RELSYSDIR)/ebin"
--	$(INSTALL_DIR) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(SOURCES) "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/include"
- 	$(INSTALL_DATA) $(INCLUDE_DELIVERABLES) "$(RELSYSDIR)/include"
- 
---- otp_src_18.3-orig/lib/test_server/src/Makefile
-+++ otp_src_18.3-fixed/lib/test_server/src/Makefile
-@@ -124,7 +124,6 @@
- 
- release_spec: opt
- 	$(INSTALL_DIR) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(ERL_FILES) "$(RELSYSDIR)/src"
- 	$(INSTALL_DATA) $(INTERNAL_HRL_FILES) $(TS_HRL_FILES) "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/include"
- 	$(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/include"
---- otp_src_18.3-orig/lib/tools/src/Makefile
-+++ otp_src_18.3-fixed/lib/tools/src/Makefile
-@@ -107,7 +107,7 @@
- 
- release_spec: opt
- 	$(INSTALL_DIR) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(ERL_FILES) $(YRL_FILE) $(HRL_FILES) "$(RELSYSDIR)/src"
-+	$(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET) \
- 		"$(RELSYSDIR)/ebin"
---- otp_src_18.3-orig/lib/typer/src/Makefile
-+++ otp_src_18.3-fixed/lib/typer/src/Makefile
-@@ -102,9 +102,6 @@
- include $(ERL_TOP)/make/otp_release_targets.mk
- 
- release_spec: opt
--	$(INSTALL_DIR) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) $(YRL_FILES) \
--		"$(RELSYSDIR)/src"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(INSTALL_FILES) "$(RELSYSDIR)/ebin"
- 
---- otp_src_18.3-orig/lib/webtool/src/Makefile
-+++ otp_src_18.3-fixed/lib/webtool/src/Makefile
-@@ -88,8 +88,6 @@
- include $(ERL_TOP)/make/otp_release_targets.mk
- 
- release_spec: opt
--	$(INSTALL_DIR) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET) \
- 		"$(RELSYSDIR)/ebin"
---- otp_src_18.3-orig/lib/wx/src/Makefile
-+++ otp_src_18.3-fixed/lib/wx/src/Makefile
-@@ -122,9 +122,9 @@
- include $(ERL_TOP)/make/otp_release_targets.mk
- release_spec: opt 
- 	$(INSTALL_DIR) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(HRL_FILES) $(ERL_FILES) "$(RELSYSDIR)/src"
-+	$(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/src/gen"
--	$(INSTALL_DATA) $(GEN_HRL) $(GEN_FILES) "$(RELSYSDIR)/src/gen"
-+	$(INSTALL_DATA) $(GEN_HRL) "$(RELSYSDIR)/src/gen"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/include"
- 	$(INSTALL_DATA) $(EXT_HRL) "$(RELSYSDIR)/include"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
---- otp_src_18.3-orig/lib/xmerl/src/Makefile
-+++ otp_src_18.3-fixed/lib/xmerl/src/Makefile
-@@ -218,9 +218,7 @@
- 	$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) $(ERL_FILES) $(INTERNAL_HRL_FILES) $(APP_SRC) $(APPUP_SRC) "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) xmerl_xpath_parse.yrl "$(RELSYSDIR)/src"
--	$(INSTALL_DATA) xmerl_b64Bin.yrl "$(RELSYSDIR)/src"
-+	$(INSTALL_DATA) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src"
- 	$(INSTALL_DIR) "$(RELSYSDIR)/include"
- 	$(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/include"
- 
diff --git a/community/erlang/0007-Split-off-webtool-dependency-from-tools.patch b/community/erlang/0007-Split-off-webtool-dependency-from-tools.patch
deleted file mode 100644
index 6a58f5c..0000000
--- a/community/erlang/0007-Split-off-webtool-dependency-from-tools.patch
+++ /dev/null
@@ -1,38 +0,0 @@
-From: Peter Lemenkov <[email-masked]>
-Date: Sat, 8 Nov 2014 22:54:57 +0300
-Subject: [PATCH] Split off webtool dependency from tools
-
-Signed-off-by: Peter Lemenkov <[email-masked]>
-
---- otp_src_18.0-orig/lib/tools/src/cover_web.erl
-+++ otp_src_18.0-fixed/lib/tools/src/cover_web.erl
-@@ -51,14 +51,25 @@
- %%%----------------------------------------------------------------------
- %% Start webtool and webcover from erlang shell
- start() ->
--    webtool:start(),
--    webtool:start_tools([],"app=webcover"),
-+    try
-+        % Disable automatic dependency picking up
-+        erlang:apply(webtool, start, []),
-+        erlang:apply(webtool, start_tools, [[],"app=webcover"])
-+    catch
-+        error:undef -> error_logger:error_msg("No erlang-webtool found.~nPlease install erlang-webtool package first.~n")
-+    end,
-     ok.
- 
- %% Stop webtool and webcover from erlang shell
- stop() ->
--    webtool:stop_tools([],"app=webcover"),
--    webtool:stop().
-+    try
-+        % Disable automatic dependency picking up
-+        erlang:apply(webtool, stop_tools, [[],"app=webcover"]),
-+        erlang:apply(webtool, stop, [])
-+    catch
-+        error:undef -> error_logger:error_msg("No erlang-webtool found.~nPlease install erlang-webtool package first.~n")
-+    end,
-+    ok.
- 
- 
- 
diff --git a/community/erlang/0015-otp-update-version-19.0.1.patch b/community/erlang/0015-otp-update-version-19.0.1.patch
new file mode 100644
index 0000000..31dcb29
--- /dev/null
+++ b/community/erlang/0015-otp-update-version-19.0.1.patch
@@ -0,0 +1,1233 @@
+--- a/OTP_VERSION
++++ b/OTP_VERSION
+@@ -1 +1 @@
+-19.0
++19.0.1
+--- a/erts/doc/src/notes.xml
++++ b/erts/doc/src/notes.xml
+@@ -32,6 +32,24 @@
+   <p>This document describes the changes made to the ERTS application.</p>
+ 
+ 
++<section><title>Erts 8.0.1</title>
++
++    <section><title>Fixed Bugs and Malfunctions</title>
++      <list>
++        <item>
++          <p>
++	    A memory allocation bug in <c>group_leader/2</c> could
++	    cause an emulator crash when garbage collecting a process
++	    that had been assigned a remote group leader. This bug
++	    was introduced in ERTS version 8.0.</p>
++          <p>
++	    Own Id: OTP-13716</p>
++        </item>
++      </list>
++    </section>
++
++</section>
++
+ <section><title>Erts 8.0</title>
+ 
+     <section><title>Fixed Bugs and Malfunctions</title>
+--- a/erts/emulator/beam/bif.c
++++ b/erts/emulator/beam/bif.c
+@@ -4305,8 +4305,9 @@ BIF_RETTYPE group_leader_2(BIF_ALIST_2)
+ 	    else {
+ 		locks &= ~ERTS_PROC_LOCK_STATUS;
+ 		erts_smp_proc_unlock(new_member, ERTS_PROC_LOCK_STATUS);
+-		if (erts_smp_atomic32_read_nob(&new_member->state)
+-		    & !(ERTS_PSFLG_DIRTY_RUNNING|ERTS_PSFLG_DIRTY_RUNNING_SYS)) {
++		if (new_member == BIF_P
++		    || !(erts_smp_atomic32_read_nob(&new_member->state)
++			 & (ERTS_PSFLG_DIRTY_RUNNING|ERTS_PSFLG_DIRTY_RUNNING_SYS))) {
+ 		    new_member->group_leader = STORE_NC_IN_PROC(new_member,
+ 								BIF_ARG_1);
+ 		}
+@@ -4326,6 +4327,7 @@ BIF_RETTYPE group_leader_2(BIF_ALIST_2)
+ 							BIF_ARG_1);
+ 		    bp->next = new_member->mbuf;
+ 		    new_member->mbuf = bp;
++		    new_member->mbuf_sz += bp->used_size;
+ 		}
+ 	    }
+ 	}
+--- a/erts/vsn.mk
++++ b/erts/vsn.mk
+@@ -18,7 +18,7 @@
+ # %CopyrightEnd%
+ # 
+ 
+-VSN = 8.0
++VSN = 8.0.1
+ 
+ # Port number 4365 in 4.2
+ # Port number 4366 in 4.3
+--- a/lib/dialyzer/doc/src/notes.xml
++++ b/lib/dialyzer/doc/src/notes.xml
+@@ -32,6 +32,20 @@
+   <p>This document describes the changes made to the Dialyzer
+     application.</p>
+ 
++<section><title>Dialyzer 3.0.1</title>
++
++    <section><title>Fixed Bugs and Malfunctions</title>
++      <list>
++        <item>
++	    <p>Fix a map related bug.</p>
++          <p>
++	    Own Id: OTP-13709 Aux Id: ERL-177, PR-1115 </p>
++        </item>
++      </list>
++    </section>
++
++</section>
++
+ <section><title>Dialyzer 3.0</title>
+ 
+     <section><title>Fixed Bugs and Malfunctions</title>
+--- /dev/null
++++ b/lib/dialyzer/test/map_SUITE_data/src/mand_remote_val/a.erl
+@@ -0,0 +1,9 @@
++-module(a).
++-export([to_map/1, to_map/2]).
++-type t() :: #{type := b:t()}.
++
++-spec to_map(t()) -> map().
++to_map(Resource) -> to_map(Resource, #{}).
++
++-spec to_map(t(), map()) -> map().
++to_map(_, Map) when is_map(Map) -> #{}.
+--- /dev/null
++++ b/lib/dialyzer/test/map_SUITE_data/src/mand_remote_val/b.erl
+@@ -0,0 +1,3 @@
++-module(b).
++-export_type([t/0]).
++-type t() :: binary().
+--- a/lib/dialyzer/vsn.mk
++++ b/lib/dialyzer/vsn.mk
+@@ -1 +1 @@
+-DIALYZER_VSN = 3.0
++DIALYZER_VSN = 3.0.1
+--- a/lib/hipe/cerl/erl_types.erl
++++ b/lib/hipe/cerl/erl_types.erl
+@@ -1664,10 +1664,12 @@ t_map(Pairs0, DefK0, DefV0) ->
+   %% define(DEBUG, true).
+   try
+     validate_map_elements(Pairs)
+-  catch error:badarg ->      error(badarg,      [Pairs0,DefK0,DefV0]);
+-	error:{badarg, E} -> error({badarg, E}, [Pairs0,DefK0,DefV0])
++  catch error:badarg -> error(badarg, [Pairs0,DefK0,DefV0])
+   end,
+-  ?map(Pairs, DefK, DefV).
++  case map_pairs_are_none(Pairs) of
++    true -> ?none;
++    false -> ?map(Pairs, DefK, DefV)
++  end.
+ 
+ normalise_map_optionals([], _, _) -> [];
+ normalise_map_optionals([E={K,?opt,?none}|T], DefK, DefV) ->
+@@ -1684,7 +1686,6 @@ normalise_map_optionals([E={K,?opt,V}|T], DefK, DefV) ->
+ normalise_map_optionals([E|T], DefK, DefV) ->
+   [E|normalise_map_optionals(T, DefK, DefV)].
+ 
+-validate_map_elements([{_,?mand,?none}|_]) -> error({badarg, none_in_mand});
+ validate_map_elements([{K1,_,_}|Rest=[{K2,_,_}|_]]) ->
+   case is_singleton_type(K1) andalso K1 < K2 of
+     false -> error(badarg);
+@@ -1697,6 +1698,10 @@ validate_map_elements([{K,_,_}]) ->
+   end;
+ validate_map_elements([]) -> true.
+ 
++map_pairs_are_none([]) -> false;
++map_pairs_are_none([{_,?mand,?none}|_]) -> true;
++map_pairs_are_none([_|Ps]) -> map_pairs_are_none(Ps).
++
+ -spec t_is_map(erl_type()) -> boolean().
+ 
+ t_is_map(Type) ->
+@@ -2833,12 +2838,7 @@ t_inf(?map(_, ADefK, ADefV) = A, ?map(_, BDefK, BDefV) = B, _Opaques) ->
+ 	 %% becomes mandatory in the infinumum
+ 	 (K, _, V1, _, V2) -> {K, ?mand, t_inf(V1, V2)}
+       end, A, B),
+-  %% If the infinimum of any mandatory values is ?none, the entire map infinimum
+-  %% is ?none.
+-  case lists:any(fun({_,?mand,?none})->true; ({_,_,_}) -> false end, Pairs) of
+-    true -> t_none();
+-    false -> t_map(Pairs, t_inf(ADefK, BDefK), t_inf(ADefV, BDefV))
+-  end;
++  t_map(Pairs, t_inf(ADefK, BDefK), t_inf(ADefV, BDefV));
+ t_inf(?matchstate(Pres1, Slots1), ?matchstate(Pres2, Slots2), _Opaques) ->
+   ?matchstate(t_inf(Pres1, Pres2), t_inf(Slots1, Slots2));
+ t_inf(?nil, ?nil, _Opaques) -> ?nil;
+--- a/lib/inets/doc/src/notes.xml
++++ b/lib/inets/doc/src/notes.xml
+@@ -33,7 +33,23 @@
+     <file>notes.xml</file>
+   </header>
+   
+-  <section><title>Inets 6.3</title>
++  <section><title>Inets 6.3.1</title>
++
++    <section><title>Fixed Bugs and Malfunctions</title>
++      <list>
++        <item>
++          <p>
++	    A debug message was accidently left enabled in the ftp
++	    client.</p>
++          <p>
++	    Own Id: OTP-13712 Aux Id: seq13143 </p>
++        </item>
++      </list>
++    </section>
++
++</section>
++
++<section><title>Inets 6.3</title>
+ 
+     <section><title>Fixed Bugs and Malfunctions</title>
+       <list>
+--- a/lib/inets/src/ftp/ftp.erl
++++ b/lib/inets/src/ftp/ftp.erl
+@@ -106,8 +106,8 @@
+ -type common_reason() ::  'econn' | 'eclosed' | term().
+ -type file_write_error_reason() :: term(). % See file:write for more info
+ 
+-%%-define(DBG(F,A), 'n/a').
+--define(DBG(F,A), io:format(F,A)).
++-define(DBG(F,A), 'n/a').
++%%-define(DBG(F,A), io:format(F,A)).
+ 
+ %%%=========================================================================
+ %%%  API - CLIENT FUNCTIONS
+@@ -2099,7 +2099,7 @@ handle_ctrl_result({pos_prel, _}, #state{caller = {transfer_data, Bin}}
+ 
+ %%--------------------------------------------------------------------------
+ %% Default
+-handle_ctrl_result({Status, Lines}, #state{client = From} = State) 
++handle_ctrl_result({Status, _Lines}, #state{client = From} = State) 
+   when From =/= undefined ->
+     ctrl_result_response(Status, State, {error, Status}).
+ 
+--- a/lib/inets/vsn.mk
++++ b/lib/inets/vsn.mk
+@@ -19,6 +19,6 @@
+ # %CopyrightEnd%
+ 
+ APPLICATION = inets
+-INETS_VSN   = 6.3
++INETS_VSN   = 6.3.1
+ PRE_VSN     =
+ APP_VSN     = "$(APPLICATION)-$(INETS_VSN)$(PRE_VSN)"
+--- a/lib/observer/doc/src/notes.xml
++++ b/lib/observer/doc/src/notes.xml
+@@ -32,6 +32,23 @@
+   <p>This document describes the changes made to the Observer
+     application.</p>
+ 
++<section><title>Observer 2.2.1</title>
++
++    <section><title>Fixed Bugs and Malfunctions</title>
++      <list>
++        <item>
++          <p>
++	    Fixed a crash happening when observing another node, who
++	    have a different number of schedulers than the current
++	    one.</p>
++          <p>
++	    Own Id: OTP-13702 Aux Id: ERL-171 </p>
++        </item>
++      </list>
++    </section>
++
++</section>
++
+ <section><title>Observer 2.2</title>
+ 
+     <section><title>Improvements and New Features</title>
+--- a/lib/observer/src/observer_perf_wx.erl
++++ b/lib/observer/src/observer_perf_wx.erl
+@@ -235,12 +235,14 @@ terminate(_Event, #state{appmon=Pid}) ->
+ code_change(_, _, State) ->
+     State.
+ 
+-restart_fetcher(Node, #state{appmon=Old, panel=Panel, time=#ti{fetch=Freq}=Ti}=State) ->
++restart_fetcher(Node, #state{appmon=Old, panel=Panel, time=#ti{fetch=Freq}=Ti, wins=Wins0}=State) ->
+     catch Old ! exit,
+     Me = self(),
+     Pid = spawn_link(Node, observer_backend, fetch_stats, [Me, round(1000/Freq)]),
+     wxWindow:refresh(Panel),
+-    precalc(State#state{active=true, appmon=Pid, samples=reset_data(), time=Ti#ti{tick=0}}).
++    Wins = [W#win{state=undefined} || W <- Wins0],
++    precalc(State#state{active=true, appmon=Pid, samples=reset_data(),
++			wins=Wins, time=Ti#ti{tick=0}}).
+ 
+ reset_data() ->
+     {0, queue:new()}.
+@@ -253,18 +255,25 @@ add_data(Stats, {N, Q}, Wins, _, Active) ->
+ 
+ add_data_1([#win{state={_,St}}|_]=Wins0, Last, N, {Drop, Q}, Active)
+   when St /= undefined ->
+-    {Wins, Stat} =
+-	lists:mapfoldl(fun(Win0, Entry) ->
+-			       {Win1,Stat} = add_data_2(Win0, Last, Entry),
+-			       case Active of
+-				   true ->
+-				       Win = add_data_3(Win1, N, Drop, Stat, Q),
+-				       {Win, Stat};
+-				   false ->
+-				       {Win1, Stat}
+-			       end
+-		       end, #{}, Wins0),
+-    {Wins, {N,queue:in(Stat#{}, Q)}};
++    try
++	{Wins, Stat} =
++	    lists:mapfoldl(fun(Win0, Entry) ->
++				   {Win1,Stat} = add_data_2(Win0, Last, Entry),
++				   case Active of
++				       true ->
++					   Win = add_data_3(Win1, N, Drop, Stat, Q),
++					   {Win, Stat};
++				       false ->
++					   {Win1, Stat}
++				   end
++			   end, #{}, Wins0),
++	{Wins, {N,queue:in(Stat#{}, Q)}}
++    catch no_scheduler_change ->
++	    {[Win#win{state=init_data(Id, Last),
++		      info = info(Id, Last)}
++	      || #win{name=Id}=Win <- Wins0], {0,queue:new()}}
++    end;
++
+ add_data_1(Wins, Stats, 1, {_, Q}, _) ->
+     {[Win#win{state=init_data(Id, Stats),
+ 	      info = info(Id, Stats)}
+@@ -409,7 +418,8 @@ collect_data(utilz, MemInfo, Max) ->
+ 
+ calc_delta([{Id, WN, TN}|Ss], [{Id, WP, TP}|Ps]) ->
+     [100*(WN-WP) div (TN-TP)|calc_delta(Ss, Ps)];
+-calc_delta([], []) -> [].
++calc_delta([], []) -> [];
++calc_delta(_, _) -> throw(no_scheduler_change).
+ 
+ precalc(#state{samples=Data0, paint=Paint, time=Ti, wins=Wins0}=State) ->
+     Wins = [precalc(Ti, Data0, Paint, Win) || Win <- Wins0],
+--- a/lib/observer/vsn.mk
++++ b/lib/observer/vsn.mk
+@@ -1 +1 @@
+-OBSERVER_VSN = 2.2
++OBSERVER_VSN = 2.2.1
+--- a/lib/ssh/doc/src/notes.xml
++++ b/lib/ssh/doc/src/notes.xml
+@@ -30,6 +30,30 @@
+     <file>notes.xml</file>
+   </header>
+ 
++<section><title>Ssh 4.3.1</title>
++
++    <section><title>Fixed Bugs and Malfunctions</title>
++      <list>
++        <item>
++          <p>
++	    SSH client does not any longer retry a bad password given
++	    as option to ssh:connect et al.</p>
++          <p>
++	    Own Id: OTP-13674 Aux Id: TR-HU92273 </p>
++        </item>
++        <item>
++          <p>
++	    Removed possible hanging risk for a certain timing
++	    sequence when communicating client and server executes on
++	    the same node.</p>
++          <p>
++	    Own Id: OTP-13715</p>
++        </item>
++      </list>
++    </section>
++
++</section>
++
+ <section><title>Ssh 4.3</title>
+ 
+     <section><title>Improvements and New Features</title>
+--- a/lib/ssh/src/ssh_auth.erl
++++ b/lib/ssh/src/ssh_auth.erl
+@@ -31,12 +31,111 @@
+ -export([publickey_msg/1, password_msg/1, keyboard_interactive_msg/1,
+ 	 service_request_msg/1, init_userauth_request_msg/1,
+ 	 userauth_request_msg/1, handle_userauth_request/3,
+-	 handle_userauth_info_request/3, handle_userauth_info_response/2
++	 handle_userauth_info_request/2, handle_userauth_info_response/2
+ 	]).
+ 
+ %%--------------------------------------------------------------------
+ %%% Internal application API
+ %%--------------------------------------------------------------------
++%%%----------------------------------------------------------------
++userauth_request_msg(#ssh{userauth_methods = ServerMethods,
++			  userauth_supported_methods = UserPrefMethods, % Note: this is not documented as supported for clients
++			  userauth_preference = ClientMethods0
++			 } = Ssh0) ->
++    case sort_select_mthds(ClientMethods0, UserPrefMethods, ServerMethods) of
++	[] ->
++	    Msg = #ssh_msg_disconnect{code = ?SSH_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE,
++				      description = "Unable to connect using the available authentication methods",
++				      language = "en"},
++	    {disconnect, Msg, ssh_transport:ssh_packet(Msg, Ssh0)};
++	
++	[{Pref,Module,Function,Args} | Prefs] ->
++	    Ssh = case Pref of
++		      "keyboard-interactive" -> Ssh0;
++		      _ -> Ssh0#ssh{userauth_preference = Prefs}
++		  end,
++	    case Module:Function(Args ++ [Ssh]) of
++		{not_ok, Ssh1} ->
++		    userauth_request_msg(Ssh1#ssh{userauth_preference = Prefs});
++		Result ->
++		    {Pref,Result}
++	    end
++    end.
++
++
++
++sort_select_mthds(Clients, undefined, Servers) ->
++    %% User has not expressed an opinion via option "auth_methods", use the server's prefs
++    sort_select_mthds1(Clients, Servers, string:tokens(?SUPPORTED_AUTH_METHODS,","));
++
++sort_select_mthds(Clients, Users0, Servers0) ->
++    %% The User has an opinion, use the intersection of that and the Servers whishes but
++    %% in the Users order
++    sort_select_mthds1(Clients, string:tokens(Users0,","), Servers0).
++
++
++sort_select_mthds1(Clients, Users0, Servers0) ->
++    Servers = unique(Servers0),
++    Users = unique(Users0),
++    [C || Key <- Users,
++	  lists:member(Key, Servers),
++	  C <- Clients,
++	  element(1,C) == Key].
++
++unique(L) -> 
++    lists:reverse(
++      lists:foldl(fun(E,Acc) -> 
++			  case lists:member(E,Acc) of
++			      true -> Acc;
++			      false -> [E|Acc]
++			  end
++		  end, [], L)).
++    
++
++%%%---- userauth_request_msg "callbacks"
++password_msg([#ssh{opts = Opts, io_cb = IoCb,
++		   user = User, service = Service} = Ssh0]) ->
++    {Password,Ssh} = 
++	case proplists:get_value(password, Opts) of
++	    undefined when IoCb == ssh_no_io ->
++		{not_ok, Ssh0};
++	    undefined -> 
++		{IoCb:read_password("ssh password: ",Ssh0), Ssh0};
++	    PW ->
++		%% If "password" option is given it should not be tried again
++		{PW, Ssh0#ssh{opts = lists:keyreplace(password,1,Opts,{password,not_ok})}}
++	end,
++    case Password of
++	not_ok ->
++	    {not_ok, Ssh};
++	_  ->
++	    ssh_transport:ssh_packet(
++	      #ssh_msg_userauth_request{user = User,
++					service = Service,
++					method = "password",
++					data =
++					    <<?BOOLEAN(?FALSE),
++					      ?STRING(unicode:characters_to_binary(Password))>>},
++	      Ssh)
++    end.
++
++%% See RFC 4256 for info on keyboard-interactive
++keyboard_interactive_msg([#ssh{user = User,
++			       opts = Opts,
++			       service = Service} = Ssh]) ->
++    case proplists:get_value(password, Opts) of
++	not_ok ->
++	    {not_ok,Ssh};       % No need to use a failed pwd once more
++	_ ->
++	    ssh_transport:ssh_packet(
++	      #ssh_msg_userauth_request{user = User,
++					service = Service,
++					method = "keyboard-interactive",
++					data = << ?STRING(<<"">>),
++						  ?STRING(<<>>) >> },
++	      Ssh)
++    end.
++
+ publickey_msg([Alg, #ssh{user = User,
+ 		       session_id = SessionId,
+ 		       service = Service,
+@@ -48,7 +147,7 @@ publickey_msg([Alg, #ssh{user = User,
+ 	    StrAlgo = atom_to_list(Alg),
+             case encode_public_key(StrAlgo, ssh_transport:extract_public_key(PrivKey)) of
+ 		not_ok ->
+-		    not_ok;
++		    {not_ok, Ssh};
+ 		PubKeyBlob ->
+ 		    SigData = build_sig_data(SessionId, 
+ 					     User, Service, PubKeyBlob, StrAlgo),
+@@ -65,52 +164,15 @@ publickey_msg([Alg, #ssh{user = User,
+ 		      Ssh)
+ 	    end;
+      	_Error ->
+-	    not_ok
+-    end.
+-
+-password_msg([#ssh{opts = Opts, io_cb = IoCb,
+-		   user = User, service = Service} = Ssh]) ->
+-    Password = case proplists:get_value(password, Opts) of
+-		   undefined -> 
+-		       user_interaction(IoCb, Ssh);
+-		   PW -> 
+-		       PW
+-	       end,
+-    case Password of
+-	not_ok ->
+-	    not_ok;
+-	_  ->
+-	    ssh_transport:ssh_packet(
+-	      #ssh_msg_userauth_request{user = User,
+-					service = Service,
+-					method = "password",
+-					data =
+-					    <<?BOOLEAN(?FALSE),
+-					      ?STRING(unicode:characters_to_binary(Password))>>},
+-	      Ssh)
++	    {not_ok, Ssh}
+     end.
+ 
+-user_interaction(ssh_no_io, _) ->
+-    not_ok;
+-user_interaction(IoCb, Ssh) ->
+-    IoCb:read_password("ssh password: ", Ssh).
+-
+-
+-%% See RFC 4256 for info on keyboard-interactive
+-keyboard_interactive_msg([#ssh{user = User,
+-			       service = Service} = Ssh]) ->
+-    ssh_transport:ssh_packet(
+-      #ssh_msg_userauth_request{user = User,
+-				service = Service,
+-				method = "keyboard-interactive",
+-				data = << ?STRING(<<"">>),
+-					  ?STRING(<<>>) >> },
+-      Ssh).
+-
++%%%----------------------------------------------------------------
+ service_request_msg(Ssh) ->
+     ssh_transport:ssh_packet(#ssh_msg_service_request{name = "ssh-userauth"},
+ 			   Ssh#ssh{service = "ssh-userauth"}).
+ 
++%%%----------------------------------------------------------------
+ init_userauth_request_msg(#ssh{opts = Opts} = Ssh) ->
+     case user_name(Opts) of
+ 	{ok, User} ->
+@@ -140,34 +202,9 @@ init_userauth_request_msg(#ssh{opts = Opts} = Ssh) ->
+ 				  description = ErrStr})
+     end.
+ 
+-userauth_request_msg(#ssh{userauth_preference = []} = Ssh) ->    
+-    Msg = #ssh_msg_disconnect{code = 
+-			      ?SSH_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE,
+-			      description = "Unable to connect using the available"
+-			      " authentication methods",
+-			      language = "en"},
+-    {disconnect, Msg, ssh_transport:ssh_packet(Msg, Ssh)};
+-
+-userauth_request_msg(#ssh{userauth_methods = Methods, 
+-			  userauth_preference = [{Pref, Module,
+-					      Function, Args} | Prefs]} 
+-		     = Ssh0) ->
+-    Ssh = Ssh0#ssh{userauth_preference = Prefs},
+-    case lists:member(Pref, Methods) of
+-	true ->
+-	    case Module:Function(Args ++ [Ssh]) of
+-		not_ok ->
+-		    userauth_request_msg(Ssh);
+-		Result ->
+-		    {Pref,Result}
+-	    end;
+-	false ->
+-	    userauth_request_msg(Ssh)
+-    end.
+-
+-
+-handle_userauth_request(#ssh_msg_service_request{name = 
+-						 Name = "ssh-userauth"},
++%%%----------------------------------------------------------------
++%%% called by server
++handle_userauth_request(#ssh_msg_service_request{name = Name = "ssh-userauth"},
+ 			_, Ssh) ->
+     {ok, ssh_transport:ssh_packet(#ssh_msg_service_accept{name = Name},
+ 				  Ssh#ssh{service = "ssh-connection"})};
+@@ -319,21 +356,28 @@ handle_userauth_request(#ssh_msg_userauth_request{user = User,
+ 				 partial_success = false}, Ssh)}.
+ 
+ 
+-
+-handle_userauth_info_request(
+-  #ssh_msg_userauth_info_request{name = Name,
+-				 instruction = Instr,
+-				 num_prompts = NumPrompts,
+-				 data  = Data}, IoCb, 
+-  #ssh{opts = Opts} = Ssh) ->
++%%%----------------------------------------------------------------
++%%% keyboard-interactive client
++handle_userauth_info_request(#ssh_msg_userauth_info_request{name = Name,
++							    instruction = Instr,
++							    num_prompts = NumPrompts,
++							    data  = Data},
++			     #ssh{opts = Opts,
++				  io_cb = IoCb
++				 } = Ssh) ->
+     PromptInfos = decode_keyboard_interactive_prompts(NumPrompts,Data),
+-    Responses = keyboard_interact_get_responses(IoCb, Opts,
+-					    Name, Instr, PromptInfos),
+-    {ok, 
+-     ssh_transport:ssh_packet(
+-       #ssh_msg_userauth_info_response{num_responses = NumPrompts,
+-				       data = Responses}, Ssh)}.
++    case keyboard_interact_get_responses(IoCb, Opts, Name, Instr, PromptInfos) of
++	not_ok ->
++	    not_ok;
++	Responses ->
++	    {ok, 
++	     ssh_transport:ssh_packet(
++	       #ssh_msg_userauth_info_response{num_responses = NumPrompts,
++					       data = Responses}, Ssh)}
++    end.
+ 
++%%%----------------------------------------------------------------
++%%% keyboard-interactive server
+ handle_userauth_info_response(#ssh_msg_userauth_info_response{num_responses = 1,
+ 							      data = <<?UINT32(Sz), Password:Sz/binary>>},
+ 			      #ssh{opts = Opts,
+@@ -369,11 +413,6 @@ method_preference(Algs) ->
+ 		       [{"publickey", ?MODULE, publickey_msg, [A]} | Acc]
+ 	       end, 
+ 	       [{"password", ?MODULE, password_msg, []},
+-		{"keyboard-interactive", ?MODULE, keyboard_interactive_msg, []},
+-		{"keyboard-interactive", ?MODULE, keyboard_interactive_msg, []},
+-		{"keyboard-interactive", ?MODULE, keyboard_interactive_msg, []},
+-		{"keyboard-interactive", ?MODULE, keyboard_interactive_msg, []},
+-		{"keyboard-interactive", ?MODULE, keyboard_interactive_msg, []},
+ 		{"keyboard-interactive", ?MODULE, keyboard_interactive_msg, []}
+ 	       ],
+ 	       Algs).
+@@ -473,6 +512,9 @@ keyboard_interact_get_responses(IoCb, Opts, Name, Instr, PromptInfos) ->
+ 				    proplists:get_value(password, Opts, undefined), IoCb, Name,
+ 				    Instr, PromptInfos, Opts, NumPrompts).
+ 
++
++keyboard_interact_get_responses(_, _, not_ok, _, _, _, _, _, _) ->
++    not_ok;
+ keyboard_interact_get_responses(_, undefined, Password, _, _, _, _, _,
+ 				1) when Password =/= undefined ->
+     [Password]; %% Password auth implemented with keyboard-interaction and passwd is known
+@@ -486,17 +528,18 @@ keyboard_interact_get_responses(true, Fun, _Pwd, _IoCb, Name, Instr, PromptInfos
+     keyboard_interact_fun(Fun, Name, Instr, PromptInfos, NumPrompts).
+ 
+ keyboard_interact(IoCb, Name, Instr, Prompts, Opts) ->
+-    if Name /= "" -> IoCb:format("~s~n", [Name]);
+-       true       -> ok
+-    end,
+-    if Instr /= "" -> IoCb:format("~s~n", [Instr]);
+-       true        -> ok
+-    end,
++    write_if_nonempty(IoCb, Name),
++    write_if_nonempty(IoCb, Instr),
+     lists:map(fun({Prompt, true})  -> IoCb:read_line(Prompt, Opts);
+ 		 ({Prompt, false}) -> IoCb:read_password(Prompt, Opts)
+ 	      end,
+ 	      Prompts).
+ 
++write_if_nonempty(_, "") -> ok;
++write_if_nonempty(_, <<>>) -> ok;
++write_if_nonempty(IoCb, Text) -> IoCb:format("~s~n",[Text]).
++
++
+ keyboard_interact_fun(KbdInteractFun, Name, Instr,  PromptInfos, NumPrompts) ->
+     Prompts = lists:map(fun({Prompt, _Echo}) -> Prompt end,
+ 			PromptInfos),
+--- a/lib/ssh/src/ssh_connection_handler.erl
++++ b/lib/ssh/src/ssh_connection_handler.erl
+@@ -428,7 +428,12 @@ init_connection(server, C = #connection{}, Opts) ->
+ init_ssh_record(Role, Socket, Opts) ->
+     {ok, PeerAddr} = inet:peername(Socket),
+     KeyCb = proplists:get_value(key_cb, Opts, ssh_file),
+-    AuthMethods = proplists:get_value(auth_methods, Opts, ?SUPPORTED_AUTH_METHODS),
++    AuthMethods = proplists:get_value(auth_methods,
++				      Opts,
++				      case Role of
++					  server -> ?SUPPORTED_AUTH_METHODS;
++					  client -> undefined
++				      end),
+     S0 = #ssh{role = Role,
+ 	      key_cb = KeyCb,
+ 	      opts = Opts,
+@@ -794,9 +799,13 @@ handle_event(_, #ssh_msg_userauth_banner{message = Msg}, {userauth,client}, D) -
+ 
+ handle_event(_, #ssh_msg_userauth_info_request{} = Msg, {userauth_keyboard_interactive, client},
+ 	     #data{ssh_params = Ssh0} = D) ->
+-    {ok, {Reply, Ssh}} = ssh_auth:handle_userauth_info_request(Msg, Ssh0#ssh.io_cb, Ssh0),
+-    send_bytes(Reply, D),
+-    {next_state, {userauth_keyboard_interactive_info_response,client}, D#data{ssh_params = Ssh}};
++    case ssh_auth:handle_userauth_info_request(Msg, Ssh0) of
++	{ok, {Reply, Ssh}} ->
++	    send_bytes(Reply, D),
++	    {next_state, {userauth_keyboard_interactive_info_response,client}, D#data{ssh_params = Ssh}};
++	not_ok ->
++	    {next_state, {userauth,client}, D, [{next_event, internal, Msg}]}
++    end;
+ 
+ handle_event(_, #ssh_msg_userauth_info_response{} = Msg, {userauth_keyboard_interactive, server}, D) ->
+     case ssh_auth:handle_userauth_info_response(Msg, D#data.ssh_params) of
+@@ -819,7 +828,18 @@ handle_event(_, Msg = #ssh_msg_userauth_failure{}, {userauth_keyboard_interactiv
+     D = D0#data{ssh_params = Ssh0#ssh{userauth_preference=Prefs}},
+     {next_state, {userauth,client}, D, [{next_event, internal, Msg}]};
+ 
+-handle_event(_, Msg=#ssh_msg_userauth_failure{}, {userauth_keyboard_interactive_info_response, client}, D) ->
++handle_event(_, Msg=#ssh_msg_userauth_failure{}, {userauth_keyboard_interactive_info_response, client},
++	     #data{ssh_params = Ssh0} = D0) ->
++    Opts = Ssh0#ssh.opts,
++    D = case proplists:get_value(password, Opts) of
++	    undefined ->
++		D0;
++	    _ ->
++		D0#data{ssh_params =
++			    Ssh0#ssh{opts =
++					 lists:keyreplace(password,1,Opts,
++							  {password,not_ok})}} % FIXME:intermodule dependency
++	end,
+     {next_state, {userauth,client}, D, [{next_event, internal, Msg}]};
+ 
+ handle_event(_, Msg=#ssh_msg_userauth_success{}, {userauth_keyboard_interactive_info_response, client}, D) ->
+@@ -1006,13 +1026,13 @@ handle_event({call,From}, get_print_info, StateName, D) ->
+     {keep_state_and_data, [{reply,From,Reply}]};
+ 
+ handle_event({call,From}, {connection_info, Options}, _, D) ->
+-    Info = ssh_info(Options, D, []),
++    Info = fold_keys(Options, fun conn_info/2, D),
+     {keep_state_and_data, [{reply,From,Info}]};
+ 
+ handle_event({call,From}, {channel_info,ChannelId,Options}, _, D) ->
+     case ssh_channel:cache_lookup(cache(D), ChannelId) of
+ 	#channel{} = Channel ->
+-	    Info = ssh_channel_info(Options, Channel, []),
++	    Info = fold_keys(Options, fun chann_info/2, Channel),
+ 	    {keep_state_and_data, [{reply,From,Info}]};
+ 	undefined ->
+ 	    {keep_state_and_data, [{reply,From,[]}]}
+@@ -1206,8 +1226,9 @@ handle_event(internal, prepare_next_packet, _, D) ->
+ 	Sz when Sz >= Enough ->
+ 	    self() ! {D#data.transport_protocol, D#data.socket, <<>>};
+ 	_ ->
+-	    inet:setopts(D#data.socket, [{active, once}])
++	    ok
+     end,
++    inet:setopts(D#data.socket, [{active, once}]),
+     keep_state_and_data;
+ 
+ handle_event(info, {CloseTag,Socket}, StateName,
+@@ -1315,12 +1336,10 @@ terminate(shutdown, StateName, State0) ->
+     State = send_msg(#ssh_msg_disconnect{code = ?SSH_DISCONNECT_BY_APPLICATION,
+ 					 description = "Application shutdown"},
+ 		     State0),
+-timer:sleep(400),  %% FIXME!!! gen_tcp:shutdown instead
+     finalize_termination(StateName, State);
+ 
+ %% terminate({shutdown,Msg}, StateName, State0) when is_record(Msg,ssh_msg_disconnect)->
+ %%     State = send_msg(Msg, State0),
+-%% timer:sleep(400),  %% FIXME!!! gen_tcp:shutdown instead
+ %%     finalize_termination(StateName, Msg, State);
+ 
+ terminate({shutdown,_R}, StateName, State) ->
+@@ -1635,7 +1654,6 @@ new_channel_id(#data{connection_state = #connection{channel_id_seed = Id} =
+ disconnect(Msg=#ssh_msg_disconnect{description=Description}, _StateName, State0) ->
+     State = send_msg(Msg, State0),
+     disconnect_fun(Description, State),
+-timer:sleep(400),
+     {stop, {shutdown,Description}, State}.
+ 
+ %%%----------------------------------------------------------------
+@@ -1644,43 +1662,43 @@ counterpart_versions(NumVsn, StrVsn, #ssh{role = server} = Ssh) ->
+ counterpart_versions(NumVsn, StrVsn, #ssh{role = client} = Ssh) ->
+     Ssh#ssh{s_vsn = NumVsn , s_version = StrVsn}.
+ 
+-ssh_info([], _State, Acc) ->
+-    Acc;
+-ssh_info([client_version | Rest], #data{ssh_params = #ssh{c_vsn = IntVsn,
+-							   c_version = StringVsn}} = State, Acc) ->
+-    ssh_info(Rest, State, [{client_version, {IntVsn, StringVsn}} | Acc]);
+-
+-ssh_info([server_version | Rest], #data{ssh_params =#ssh{s_vsn = IntVsn,
+-							  s_version = StringVsn}} = State, Acc) ->
+-    ssh_info(Rest, State, [{server_version, {IntVsn, StringVsn}} | Acc]);
+-ssh_info([peer | Rest], #data{ssh_params = #ssh{peer = Peer}} = State, Acc) ->
+-    ssh_info(Rest, State, [{peer, Peer} | Acc]);
+-ssh_info([sockname | Rest], #data{socket = Socket} = State, Acc) ->
+-    {ok, SockName} = inet:sockname(Socket),
+-   ssh_info(Rest, State, [{sockname, SockName}|Acc]);
+-ssh_info([user | Rest], #data{auth_user = User} = State, Acc) ->
+-    ssh_info(Rest, State, [{user, User}|Acc]);
+-ssh_info([ _ | Rest], State, Acc) ->
+-    ssh_info(Rest, State, Acc).
+-
+-
+-ssh_channel_info([], _, Acc) ->
+-    Acc;
++%%%----------------------------------------------------------------
++conn_info(client_version, #data{ssh_params=S}) -> {S#ssh.c_vsn, S#ssh.c_version};
++conn_info(server_version, #data{ssh_params=S}) -> {S#ssh.s_vsn, S#ssh.s_version};
++conn_info(peer,           #data{ssh_params=S}) -> S#ssh.peer;
++conn_info(user,                             D) -> D#data.auth_user;
++conn_info(sockname, D) -> {ok, SockName} = inet:sockname(D#data.socket),
++			  SockName;
++%% dbg options ( = not documented):
++conn_info(socket, D) -> D#data.socket;
++conn_info(chan_ids, D) -> 
++    ssh_channel:cache_foldl(fun(#channel{local_id=Id}, Acc) ->
++				    [Id | Acc]
++			    end, [], cache(D)).
+ 
+-ssh_channel_info([recv_window | Rest], #channel{recv_window_size = WinSize,
+-						   recv_packet_size = Packsize
+-						  } = Channel, Acc) ->
+-    ssh_channel_info(Rest, Channel, [{recv_window, {{win_size, WinSize},
+-						      {packet_size, Packsize}}} | Acc]);
+-ssh_channel_info([send_window | Rest], #channel{send_window_size = WinSize,
+-						send_packet_size = Packsize
+-					       } = Channel, Acc) ->
+-    ssh_channel_info(Rest, Channel, [{send_window, {{win_size, WinSize},
+-						      {packet_size, Packsize}}} | Acc]);
+-ssh_channel_info([ _ | Rest], Channel, Acc) ->
+-    ssh_channel_info(Rest, Channel, Acc).
++%%%----------------------------------------------------------------
++chann_info(recv_window, C) ->
++    {{win_size,    C#channel.recv_window_size},
++     {packet_size, C#channel.recv_packet_size}};
++chann_info(send_window, C) ->
++    {{win_size,    C#channel.send_window_size},
++     {packet_size, C#channel.send_packet_size}};
++%% dbg options ( = not documented):
++chann_info(pid, C) ->
++    C#channel.user.
+ 
++%%%----------------------------------------------------------------
++%% Assisting meta function for the *_info functions
++fold_keys(Keys, Fun, Extra) ->
++    lists:foldr(fun(Key, Acc) ->
++			try Fun(Key, Extra) of
++			    Value -> [{Key,Value}|Acc]
++			catch
++			    _:_ -> Acc
++			end
++		end, [], Keys).
+ 
++%%%----------------------------------------------------------------
+ log_error(Reason) ->
+     Report = io_lib:format("Erlang ssh connection handler failed with reason:~n"
+ 			   "    ~p~n"
+@@ -1689,7 +1707,6 @@ log_error(Reason) ->
+ 			   [Reason, erlang:get_stacktrace()]),
+     error_logger:error_report(Report).
+ 
+-
+ %%%----------------------------------------------------------------
+ not_connected_filter({connection_reply, _Data}) -> true;
+ not_connected_filter(_) -> false.
+--- a/lib/ssh/src/ssh_dbg.erl
++++ b/lib/ssh/src/ssh_dbg.erl
+@@ -24,6 +24,7 @@
+ 
+ -export([messages/0,
+ 	 messages/1,
++	 messages/2,
+ 	 stop/0
+ 	]).
+ 
+@@ -36,12 +37,16 @@
+ 	  writer,
+ 	  acc = []}).
+ %%%================================================================
+-messages() -> messages(fun(String,_D) -> io:format(String) end).
+-%% messages() -> messages(fun(String,Acc) -> [String|Acc] end)
++messages() ->
++    messages(fun(String,_D) -> io:format(String) end).
+ 
+ messages(Write) when is_function(Write,2) ->
++    messages(Write, fun(X) -> X end).
++
++messages(Write, MangleArg) when is_function(Write,2),
++				is_function(MangleArg,1) ->
+     catch dbg:start(),
+-    setup_tracer(Write),
++    setup_tracer(Write, MangleArg),
+     dbg:p(new,c),
+     dbg_ssh_messages().
+ 
+@@ -63,18 +68,30 @@ msg_formater({trace,_Pid,return_from,{ssh_message,encode,1},_Res}, D) ->
+ msg_formater({trace,_Pid,call,{ssh_message,decode,_}}, D) ->
+     D;
+ msg_formater({trace,Pid,return_from,{ssh_message,decode,1},Msg}, D) -> 
+-    fmt("~nRECV ~p ~s~n", [Pid,wr_record(shrink_bin(Msg))], D);
++    fmt("~n~p RECV ~s~n", [Pid,wr_record(shrink_bin(Msg))], D);
+ 	
+ msg_formater({trace,_Pid,call,{ssh_transport,select_algorithm,_}}, D) ->
+     D;
+ msg_formater({trace,Pid,return_from,{ssh_transport,select_algorithm,3},{ok,Alg}}, D) ->
+-    fmt("~nALGORITHMS ~p~n~s~n", [Pid, wr_record(Alg)], D);
++    fmt("~n~p ALGORITHMS~n~s~n", [Pid, wr_record(Alg)], D);
++
++
++msg_formater({trace,Pid,send,{tcp,Sock,Bytes},Pid}, D) ->
++    fmt("~n~p TCP SEND on ~p~n ~p~n", [Pid,Sock, shrink_bin(Bytes)], D);
++
++msg_formater({trace,Pid,send,{tcp,Sock,Bytes},Dest}, D) ->
++    fmt("~n~p TCP SEND from ~p TO ~p~n ~p~n", [Pid,Sock,Dest, shrink_bin(Bytes)], D);
+ 
+ msg_formater({trace,Pid,send,ErlangMsg,Dest}, D) ->
+-    fmt("~nERL MSG ~p SEND TO ~p~n ~p~n", [Pid,Dest, shrink_bin(ErlangMsg)], D);
++    fmt("~n~p ERL MSG SEND TO ~p~n ~p~n", [Pid,Dest, shrink_bin(ErlangMsg)], D);
++
++
++msg_formater({trace,Pid,'receive',{tcp,Sock,Bytes}}, D) ->
++    fmt("~n~p TCP RECEIVE on ~p~n ~p~n", [Pid,Sock,shrink_bin(Bytes)], D);
+ 
+ msg_formater({trace,Pid,'receive',ErlangMsg}, D) ->
+-    fmt("~nERL MSG ~p RECIEVE~n ~p~n", [Pid,shrink_bin(ErlangMsg)], D);
++    fmt("~n~p ERL MSG RECEIVE~n ~p~n", [Pid,shrink_bin(ErlangMsg)], D);
++
+ 
+ msg_formater(M, D) ->
+     fmt("~nDBG ~n~p~n", [shrink_bin(M)], D).
+@@ -87,8 +104,10 @@ fmt(Fmt, Args,  D=#data{writer=Write,acc=Acc}) ->
+     D#data{acc = Write(io_lib:format(Fmt, Args), Acc)}.
+ 
+ %%%----------------------------------------------------------------
+-setup_tracer(Write) ->
+-    Handler = fun msg_formater/2,
++setup_tracer(Write, MangleArg) ->
++    Handler = fun(Arg, D) ->
++		      msg_formater(MangleArg(Arg), D)
++	      end,
+     InitialData = #data{writer = Write},
+     {ok,_} = dbg:tracer(process, {Handler, InitialData}),
+     ok.
+--- a/lib/ssh/src/ssh_io.erl
++++ b/lib/ssh/src/ssh_io.erl
+@@ -31,56 +31,55 @@ read_line(Prompt, Ssh) ->
+     format("~s", [listify(Prompt)]),
+     proplists:get_value(user_pid, Ssh) ! {self(), question},
+     receive
+-	Answer ->
++	Answer when is_list(Answer) ->
+ 	    Answer
+     end.
+ 
+ yes_no(Prompt, Ssh) ->
+-    io:format("~s [y/n]?", [Prompt]),
++    format("~s [y/n]?", [Prompt]),
+     proplists:get_value(user_pid, Ssh#ssh.opts) ! {self(), question},
+     receive
+-	Answer ->
++	%% I can't see that the atoms y and n are ever received, but it must
++	%% be investigated before removing
++	y -> yes;
++	n -> no;
++
++	Answer when is_list(Answer) ->
+ 	    case trim(Answer) of
+ 		"y" -> yes;
+ 		"n" -> no;
+ 		"Y" -> yes;
+ 		"N" -> no;
+-		y -> yes;
+-		n -> no;
+ 		_ ->
+-		    io:format("please answer y or n\n"),
++		    format("please answer y or n\n",[]),
+ 		    yes_no(Prompt, Ssh)
+ 	    end
+     end.
+ 
+ 
+-read_password(Prompt, Ssh) ->
++read_password(Prompt, #ssh{opts=Opts}) -> read_password(Prompt, Opts);
++read_password(Prompt, Opts) when is_list(Opts) ->
+     format("~s", [listify(Prompt)]),
+-    case is_list(Ssh) of
+-	false ->
+-	    proplists:get_value(user_pid, Ssh#ssh.opts) ! {self(), user_password};
+-	_ ->
+-	    proplists:get_value(user_pid, Ssh) ! {self(), user_password}
+-    end,
++    proplists:get_value(user_pid, Opts) ! {self(), user_password},
+     receive
+-	Answer ->
+-	    case Answer of
+-		"" ->
+-		    read_password(Prompt, Ssh);
+-		Pass -> Pass
+-	    end
++	Answer when is_list(Answer) ->
++	     case trim(Answer) of
++		 "" ->
++		     read_password(Prompt, Opts);
++		 Pwd ->
++		     Pwd
++	     end
+     end.
+ 
+-listify(A) when is_atom(A) ->
+-    atom_to_list(A);
+-listify(L) when is_list(L) ->
+-    L;
+-listify(B) when is_binary(B)  ->
+-    binary_to_list(B).
+ 
+ format(Fmt, Args) ->
+     io:format(Fmt, Args).
+ 
++%%%================================================================
++listify(A) when is_atom(A)   -> atom_to_list(A);
++listify(L) when is_list(L)   -> L;
++listify(B) when is_binary(B) -> binary_to_list(B).
++
+ 
+ trim(Line) when is_list(Line) ->
+     lists:reverse(trim1(lists:reverse(trim1(Line))));
+@@ -93,6 +92,3 @@ trim1([$\r|Cs]) -> trim(Cs);
+ trim1([$\n|Cs]) -> trim(Cs);
+ trim1([$\t|Cs]) -> trim(Cs);
+ trim1(Cs) -> Cs.
+-    
+-
+-
+--- a/lib/ssh/test/ssh_basic_SUITE.erl
++++ b/lib/ssh/test/ssh_basic_SUITE.erl
+@@ -50,7 +50,12 @@
+ 	 inet6_option/1,
+ 	 inet_option/1,
+ 	 internal_error/1,
+-	 known_hosts/1,  
++	 known_hosts/1,
++	 login_bad_pwd_no_retry1/1,
++	 login_bad_pwd_no_retry2/1,
++	 login_bad_pwd_no_retry3/1,
++	 login_bad_pwd_no_retry4/1,
++	 login_bad_pwd_no_retry5/1,
+ 	 misc_ssh_options/1,
+ 	 openssh_zlib_basic_test/1,  
+ 	 packet_size_zero/1, 
+@@ -100,7 +105,8 @@ all() ->
+      daemon_opt_fd,
+      multi_daemon_opt_fd,
+      packet_size_zero,
+-     ssh_info_print
++     ssh_info_print,
++     {group, login_bad_pwd_no_retry}
+     ].
+ 
+ groups() ->
+@@ -116,7 +122,13 @@ groups() ->
+      {dsa_pass_key, [], [pass_phrase]},
+      {rsa_pass_key, [], [pass_phrase]},
+      {key_cb, [], [key_callback, key_callback_options]},
+-     {internal_error, [], [internal_error]}
++     {internal_error, [], [internal_error]},
++     {login_bad_pwd_no_retry, [], [login_bad_pwd_no_retry1,
++				   login_bad_pwd_no_retry2,
++				   login_bad_pwd_no_retry3,
++				   login_bad_pwd_no_retry4,
++				   login_bad_pwd_no_retry5
++				  ]}
+     ].
+ 
+ 
+@@ -1090,6 +1102,72 @@ ssh_info_print(Config) ->
+ 
+ 
+ %%--------------------------------------------------------------------
++%% Check that a basd pwd is not tried more times. Could cause lock-out
++%% on server
++
++login_bad_pwd_no_retry1(Config) ->
++    login_bad_pwd_no_retry(Config, "keyboard-interactive,password").
++
++login_bad_pwd_no_retry2(Config) ->
++    login_bad_pwd_no_retry(Config, "password,keyboard-interactive").
++
++login_bad_pwd_no_retry3(Config) ->
++    login_bad_pwd_no_retry(Config, "password,publickey,keyboard-interactive").
++
++login_bad_pwd_no_retry4(Config) ->
++    login_bad_pwd_no_retry(Config, "password,other,keyboard-interactive").
++
++login_bad_pwd_no_retry5(Config) ->
++    login_bad_pwd_no_retry(Config, "password,other,keyboard-interactive,password,password").
++
++
++
++
++
++login_bad_pwd_no_retry(Config, AuthMethods) ->
++    PrivDir = proplists:get_value(priv_dir, Config),
++    UserDir = filename:join(PrivDir, nopubkey), % to make sure we don't use public-key-auth
++    file:make_dir(UserDir),
++    SysDir = proplists:get_value(data_dir, Config),
++
++    Parent = self(),
++    PwdFun = fun(_, _, _, undefined) -> {false, 1};
++		(_, _, _,         _) -> Parent ! retry_bad_pwd,
++					false
++	     end,
++
++    {DaemonRef, _Host, Port} = 
++	ssh_test_lib:daemon([{system_dir, SysDir},
++			     {user_dir, UserDir},
++			     {auth_methods, AuthMethods},
++			     {user_passwords, [{"foo","somepwd"}]},
++			     {pwdfun, PwdFun}
++			    ]),
++
++    ConnRes = ssh:connect("localhost", Port,
++			  [{silently_accept_hosts, true},
++			   {user, "foo"},
++			   {password, "badpwd"},
++			   {user_dir, UserDir},
++			   {user_interaction, false}]),
++
++    receive
++	retry_bad_pwd ->
++	    ssh:stop_daemon(DaemonRef),
++	    {fail, "Retry bad password"}
++    after 0 ->
++	    case ConnRes of
++		{error,"Unable to connect using the available authentication methods"} ->
++		    ssh:stop_daemon(DaemonRef),
++		    ok;
++		{ok,Conn} ->
++		    ssh:close(Conn),
++		    ssh:stop_daemon(DaemonRef),
++		    {fail, "Connect erroneosly succeded"}
++	    end
++    end.
++
++%%--------------------------------------------------------------------
+ %% Internal functions ------------------------------------------------
+ %%--------------------------------------------------------------------
+ %% Due to timing the error message may or may not be delivered to
+--- a/lib/ssh/vsn.mk
++++ b/lib/ssh/vsn.mk
+@@ -1,5 +1,5 @@
+ #-*-makefile-*-   ; force emacs to enter makefile-mode
+ 
+-SSH_VSN = 4.3
++SSH_VSN = 4.3.1
+ 
+ APP_VSN    = "ssh-$(SSH_VSN)"
+--- a/lib/tools/doc/src/notes.xml
++++ b/lib/tools/doc/src/notes.xml
+@@ -31,6 +31,21 @@
+   </header>
+   <p>This document describes the changes made to the Tools application.</p>
+ 
++<section><title>Tools 2.8.5</title>
++
++    <section><title>Fixed Bugs and Malfunctions</title>
++      <list>
++        <item>
++	    <p>Correct a bug when adding multiple modules to an Xref
++	    server. The bug was introduced in OTP-19.0. </p>
++          <p>
++	    Own Id: OTP-13708 Aux Id: ERL-173 </p>
++        </item>
++      </list>
++    </section>
++
++</section>
++
+ <section><title>Tools 2.8.4</title>
+ 
+     <section><title>Fixed Bugs and Malfunctions</title>
+--- a/lib/tools/src/xref_base.erl
++++ b/lib/tools/src/xref_base.erl
+@@ -746,7 +746,7 @@ read_a_module({Dir, BaseName}, AppName, Builtins, Verbose, Warnings, Mode) ->
+ 	    message(Warnings, no_debug_info, [File]),
+ 	    no;
+ 	{ok, M, Data, UnresCalls0}  ->
+-	    message(Verbose, done, [File]),
++	    message(Verbose, done_file, [File]),
+             %% Remove duplicates. Identical unresolved calls on the
+             %% same line are counted as _one_ unresolved call.
+             UnresCalls = usort(UnresCalls0),
+@@ -1842,6 +1842,8 @@ message(true, What, Arg) ->
+ 	set_up ->
+ 	    io:format("Setting up...", Arg);
+ 	done ->
++	    io:format("done~n", Arg);
++	done_file ->
+ 	    io:format("done reading ~ts~n", Arg);
+ 	error ->
+ 	    io:format("error~n", Arg);
+--- a/lib/tools/test/xref_SUITE.erl
++++ b/lib/tools/test/xref_SUITE.erl
+@@ -50,7 +50,7 @@
+ 
+ -export([analyze/1, basic/1, md/1, q/1, variables/1, unused_locals/1]).
+ 
+--export([format_error/1, otp_7423/1, otp_7831/1, otp_10192/1]).
++-export([format_error/1, otp_7423/1, otp_7831/1, otp_10192/1, otp_13708/1]).
+ 
+ -import(lists, [append/2, flatten/1, keysearch/3, member/2, sort/1, usort/1]).
+ 
+@@ -82,7 +82,7 @@ groups() ->
+        fun_mfa_r14, fun_mfa_vars, qlc]},
+      {analyses, [],
+       [analyze, basic, md, q, variables, unused_locals]},
+-     {misc, [], [format_error, otp_7423, otp_7831, otp_10192]}].
++     {misc, [], [format_error, otp_7423, otp_7831, otp_10192, otp_13708]}].
+ 
+ 
+ init_per_suite(Conf) when is_list(Conf) ->
+@@ -2393,6 +2393,19 @@ otp_10192(Conf) when is_list(Conf) ->
+     xref:stop(s),
+     ok.
+ 
++%% OTP-10192. Allow filenames with character codes greater than 126.
++otp_13708(Conf) when is_list(Conf) ->
++    {ok, _} = start(s),
++    ok = xref:set_default(s, [{verbose, true}]),
++    {ok, []} = xref:q(s,"E"),
++    xref:stop(s),
++
++    CopyDir = ?copydir,
++    Dir = fname(CopyDir,"lib_test"),
++    {ok, _} = start(s),
++    ok = xref:set_library_path(s, [Dir], [{verbose, true}]),
++    xref:stop(s).
++
+ %%%
+ %%% Utilities
+ %%%
+--- a/lib/tools/vsn.mk
++++ b/lib/tools/vsn.mk
+@@ -1 +1 @@
+-TOOLS_VSN = 2.8.4
++TOOLS_VSN = 2.8.5
+--- a/otp_versions.table
++++ b/otp_versions.table
+@@ -1,3 +1,4 @@
++OTP-19.0.1 : dialyzer-3.0.1 erts-8.0.1 inets-6.3.1 observer-2.2.1 ssh-4.3.1 tools-2.8.5 # asn1-4.0.3 common_test-1.12.2 compiler-7.0 cosEvent-2.2.1 cosEventDomain-1.2.1 cosFileTransfer-1.2.1 cosNotification-1.2.2 cosProperty-1.2.1 cosTime-1.2.2 cosTransactions-1.3.2 crypto-3.7 debugger-4.2 diameter-1.12 edoc-0.7.19 eldap-1.2.2 erl_docgen-0.5 erl_interface-3.9 et-1.6 eunit-2.3 gs-1.6.1 hipe-3.15.1 ic-4.4.1 jinterface-1.7 kernel-5.0 megaco-3.18.1 mnesia-4.14 odbc-2.11.2 orber-3.8.2 os_mon-2.4.1 otp_mibs-1.1.1 parsetools-2.1.2 percept-0.9 public_key-1.2 reltool-0.7.1 runtime_tools-1.10 sasl-3.0 snmp-5.2.3 ssl-8.0 stdlib-3.0 syntax_tools-2.0 typer-0.9.11 wx-1.7 xmerl-1.3.11 :
+ OTP-19.0 : asn1-4.0.3 common_test-1.12.2 compiler-7.0 cosEvent-2.2.1 cosEventDomain-1.2.1 cosFileTransfer-1.2.1 cosNotification-1.2.2 cosProperty-1.2.1 cosTime-1.2.2 cosTransactions-1.3.2 crypto-3.7 debugger-4.2 dialyzer-3.0 diameter-1.12 edoc-0.7.19 eldap-1.2.2 erl_docgen-0.5 erl_interface-3.9 erts-8.0 et-1.6 eunit-2.3 gs-1.6.1 hipe-3.15.1 ic-4.4.1 inets-6.3 jinterface-1.7 kernel-5.0 megaco-3.18.1 mnesia-4.14 observer-2.2 odbc-2.11.2 orber-3.8.2 os_mon-2.4.1 otp_mibs-1.1.1 parsetools-2.1.2 percept-0.9 public_key-1.2 reltool-0.7.1 runtime_tools-1.10 sasl-3.0 snmp-5.2.3 ssh-4.3 ssl-8.0 stdlib-3.0 syntax_tools-2.0 tools-2.8.4 typer-0.9.11 wx-1.7 xmerl-1.3.11 # :
+ OTP-18.3.4 : inets-6.2.4 ssl-7.3.3 # asn1-4.0.2 common_test-1.12.1 compiler-6.0.3 cosEvent-2.2 cosEventDomain-1.2 cosFileTransfer-1.2 cosNotification-1.2.1 cosProperty-1.2 cosTime-1.2.1 cosTransactions-1.3.1 crypto-3.6.3 debugger-4.1.2 dialyzer-2.9 diameter-1.11.2 edoc-0.7.18 eldap-1.2.1 erl_docgen-0.4.2 erl_interface-3.8.2 erts-7.3.1 et-1.5.1 eunit-2.2.13 gs-1.6 hipe-3.15 ic-4.4 jinterface-1.6.1 kernel-4.2 megaco-3.18 mnesia-4.13.4 observer-2.1.2 odbc-2.11.1 orber-3.8.1 os_mon-2.4 ose-1.1 otp_mibs-1.1 parsetools-2.1.1 percept-0.8.11 public_key-1.1.1 reltool-0.7 runtime_tools-1.9.3 sasl-2.7 snmp-5.2.2 ssh-4.2.2 stdlib-2.8 syntax_tools-1.7 test_server-3.10 tools-2.8.3 typer-0.9.10 webtool-0.9.1 wx-1.6.1 xmerl-1.3.10 :
+ OTP-18.3.3 : common_test-1.12.1 inets-6.2.3 ssl-7.3.2 # asn1-4.0.2 compiler-6.0.3 cosEvent-2.2 cosEventDomain-1.2 cosFileTransfer-1.2 cosNotification-1.2.1 cosProperty-1.2 cosTime-1.2.1 cosTransactions-1.3.1 crypto-3.6.3 debugger-4.1.2 dialyzer-2.9 diameter-1.11.2 edoc-0.7.18 eldap-1.2.1 erl_docgen-0.4.2 erl_interface-3.8.2 erts-7.3.1 et-1.5.1 eunit-2.2.13 gs-1.6 hipe-3.15 ic-4.4 jinterface-1.6.1 kernel-4.2 megaco-3.18 mnesia-4.13.4 observer-2.1.2 odbc-2.11.1 orber-3.8.1 os_mon-2.4 ose-1.1 otp_mibs-1.1 parsetools-2.1.1 percept-0.8.11 public_key-1.1.1 reltool-0.7 runtime_tools-1.9.3 sasl-2.7 snmp-5.2.2 ssh-4.2.2 stdlib-2.8 syntax_tools-1.7 test_server-3.10 tools-2.8.3 typer-0.9.10 webtool-0.9.1 wx-1.6.1 xmerl-1.3.10 :
diff --git a/community/erlang/0060-set-disksup_posix_only-to-true.patch b/community/erlang/0060-set-disksup_posix_only-to-true.patch
deleted file mode 100644
index a32c60c..0000000
--- a/community/erlang/0060-set-disksup_posix_only-to-true.patch
+++ /dev/null
@@ -1,22 +0,0 @@
---- otp_src_18.0/lib/os_mon/src/disksup.erl
-+++ otp_src_18.0-fixed/lib/os_mon/src/disksup.erl
-@@ -87,7 +87,7 @@
- 
- param_default(disk_space_check_interval) -> 30;
- param_default(disk_almost_full_threshold) -> 0.80;
--param_default(disksup_posix_only) -> false.
-+param_default(disksup_posix_only) -> true.
- 
- %%----------------------------------------------------------------------
- %% gen_server callbacks
---- otp_src_18.0/lib/os_mon/test/disksup_SUITE.erl
-+++ otp_src_18.0-fixed/lib/os_mon/test/disksup_SUITE.erl
-@@ -337,7 +337,7 @@
-     [];
- restart(Config) when is_list(Config) ->
-     ok = application:set_env(os_mon, start_disksup, true),
--    ok = application:set_env(os_mon, disksup_posix_only, false),
-+    ok = application:set_env(os_mon, disksup_posix_only, true),
-     {ok, _Pid} = supervisor:restart_child(os_mon_sup, disksup),
-     ok.
- 
diff --git a/community/erlang/0070-otp-update-version-18.3.2.patch b/community/erlang/0070-otp-update-version-18.3.2.patch
deleted file mode 100644
index 8e38f92..0000000
--- a/community/erlang/0070-otp-update-version-18.3.2.patch
+++ /dev/null
@@ -1,1887 +0,0 @@
---- a/OTP_VERSION
-+++ b/OTP_VERSION
-@@ -1 +1 @@
--18.3
-+18.3.2
---- a/erts/doc/src/notes.xml
-+++ b/erts/doc/src/notes.xml
-@@ -32,6 +32,71 @@
-   <p>This document describes the changes made to the ERTS application.</p>
- 
- 
-+<section><title>Erts 7.3.1</title>
-+
-+    <section><title>Fixed Bugs and Malfunctions</title>
-+      <list>
-+        <item>
-+          <p>
-+	    <c>process_info(Pid, last_calls)</c> did not work for
-+	    <c>Pid /= self()</c>.</p>
-+          <p>
-+	    Own Id: OTP-13418</p>
-+        </item>
-+        <item>
-+          <p>
-+	    Make sure to create a crash dump when running out of
-+	    memory. This was accidentally removed in the erts-7.3
-+	    release.</p>
-+          <p>
-+	    Own Id: OTP-13419</p>
-+        </item>
-+        <item>
-+          <p>
-+	    Schedulers could be woken by a premature timeout on
-+	    Linux. This premature wakeup was however harmless.</p>
-+          <p>
-+	    Own Id: OTP-13420</p>
-+        </item>
-+        <item>
-+          <p>
-+	    A process communicating with a port via one of the
-+	    <c>erlang:port_*</c> BIFs could potentially end up in an
-+	    inconsistent state if the port terminated during the
-+	    communication. When this occurred the process could later
-+	    block in a <c>receive</c> even though it had messages
-+	    matching in its message queue.</p>
-+          <p>
-+	    This bug was introduced in erts version 5.10 (OTP R16A).</p>
-+          <p>
-+	    Own Id: OTP-13424 Aux Id: OTP-10336 </p>
-+        </item>
-+        <item>
-+          <p>
-+	    The reference count of a process structure could under
-+	    rare circumstances be erroneously managed. When this
-+	    happened invalid memory accesses occurred.</p>
-+          <p>
-+	    Own Id: OTP-13446</p>
-+        </item>
-+        <item>
-+          <p>
-+	    Fix race between <c>process_flag(trap_exit,true)</c> and
-+	    a received exit signal.</p>
-+          <p>
-+	    A process could terminate due to exit signal even though
-+	    <c>process_flag(trap_exit,true)</c> had returned. A very
-+	    specific timing between call to <c>process_flag/2</c> and
-+	    exit signal from another scheduler was required for this
-+	    to happen.</p>
-+          <p>
-+	    Own Id: OTP-13452</p>
-+        </item>
-+      </list>
-+    </section>
-+
-+</section>
-+
- <section><title>Erts 7.3</title>
- 
-     <section><title>Fixed Bugs and Malfunctions</title>
---- a/erts/emulator/beam/bif.c
-+++ b/erts/emulator/beam/bif.c
-@@ -1605,14 +1605,17 @@ BIF_RETTYPE process_flag_2(BIF_ALIST_2)
- 	*       true. For more info, see implementation of
- 	*       erts_send_exit_signal().
- 	*/
-+       erts_smp_proc_lock(BIF_P, ERTS_PROC_LOCKS_XSIG_SEND);
-        if (trap_exit)
- 	   state = erts_smp_atomic32_read_bor_mb(&BIF_P->state,
- 						 ERTS_PSFLG_TRAP_EXIT);
-        else
- 	   state = erts_smp_atomic32_read_band_mb(&BIF_P->state,
- 						  ~ERTS_PSFLG_TRAP_EXIT);
-+       erts_smp_proc_unlock(BIF_P, ERTS_PROC_LOCKS_XSIG_SEND);
-+
- #ifdef ERTS_SMP
--       if (ERTS_PROC_PENDING_EXIT(BIF_P)) {
-+       if (state & ERTS_PSFLG_PENDING_EXIT) {
- 	   erts_handle_pending_exit(BIF_P, ERTS_PROC_LOCK_MAIN);
- 	   ERTS_BIF_EXITED(BIF_P);
-        }
---- a/erts/emulator/beam/erl_alloc.c
-+++ b/erts/emulator/beam/erl_alloc.c
-@@ -1923,7 +1923,7 @@ erts_alc_fatal_error(int error, int func, ErtsAlcType_t n, ...)
- 	va_start(argp, n);
- 	size = va_arg(argp, Uint);
- 	va_end(argp);
--	erts_exit(1,
-+	erts_exit(ERTS_DUMP_EXIT,
- 		 "%s: Cannot %s %lu bytes of memory (of type \"%s\").\n",
- 		 allctr_str, op, size, t_str);
- 	break;
---- a/erts/emulator/beam/erl_bif_info.c
-+++ b/erts/emulator/beam/erl_bif_info.c
-@@ -1534,7 +1534,7 @@ process_info_aux(Process *BIF_P,
-     }
- 
-     case am_last_calls: {
--	struct saved_calls *scb = ERTS_PROC_GET_SAVED_CALLS_BUF(BIF_P);
-+	struct saved_calls *scb = ERTS_PROC_GET_SAVED_CALLS_BUF(rp);
- 	if (!scb) {
- 	    hp = HAlloc(BIF_P, 3);
- 	    res = am_false;
---- a/erts/emulator/beam/erl_process.c
-+++ b/erts/emulator/beam/erl_process.c
-@@ -9807,12 +9807,14 @@ Process *schedule(Process *p, int calls)
- 				      | ERTS_PSFLG_PENDING_EXIT
- 				      | ERTS_PSFLG_ACTIVE_SYS))
- 			    == ERTS_PSFLG_SUSPENDED)) {
--			if (state & ERTS_PSFLG_FREE)
--			    erts_proc_dec_refc(p);
- 			if (proxy_p) {
- 			    free_proxy_proc(proxy_p);
- 			    proxy_p = NULL;
- 			}
-+			else if (state & ERTS_PSFLG_FREE) {
-+			    /* free and not queued by proxy */
-+			    erts_proc_dec_refc(p);
-+			}
- 			goto pick_next_process;
- 		    }
- 		    state = new;
---- a/erts/emulator/beam/io.c
-+++ b/erts/emulator/beam/io.c
-@@ -1529,8 +1529,19 @@ erts_schedule_proc2port_signal(Process *c_p,
- 	erts_smp_proc_lock(c_p, ERTS_PROC_LOCK_MAIN);
- 
-     if (sched_res != 0) {
--	if (refp)
-+	if (refp) {
-+	    /*
-+	     * We need to restore the message queue save
-+	     * pointer to the beginning of the message queue
-+	     * since the caller now wont wait for a message
-+	     * containing the reference created above...
-+	     */
-+	    ASSERT(c_p);
-+	    erts_smp_proc_lock(c_p, ERTS_PROC_LOCKS_MSG_RECEIVE);
-+	    JOIN_MESSAGE(c_p);
-+	    erts_smp_proc_unlock(c_p, ERTS_PROC_LOCKS_MSG_RECEIVE);
- 	    *refp = NIL;
-+	}
- 	return ERTS_PORT_OP_DROPPED;
-     }
-     return ERTS_PORT_OP_SCHEDULED;
---- a/erts/emulator/test/save_calls_SUITE.erl
-+++ b/erts/emulator/test/save_calls_SUITE.erl
-@@ -156,8 +156,19 @@ save_calls_1() ->
- 
-     ?line erlang:process_flag(self(), save_calls, 10),
-     ?line {last_calls, L3} = process_info(self(), last_calls),
-+    true = (L3 /= false),
-     ?line L31 = lists:filter(fun is_local_function/1, L3),
-     ?line [] = L31,
-+    erlang:process_flag(self(), save_calls, 0),
-+
-+    %% Also check that it works on another process ...
-+    Pid = spawn(fun () -> receive after infinity -> ok end end),
-+    erlang:process_flag(Pid, save_calls, 10),
-+    {last_calls, L4} = process_info(Pid, last_calls),
-+    true = (L4 /= false),
-+    L41 = lists:filter(fun is_local_function/1, L4),
-+    [] = L41,
-+    exit(Pid,kill),
-     ok.
- 
- do_bipp() ->
---- a/erts/lib_src/pthread/ethr_event.c
-+++ b/erts/lib_src/pthread/ethr_event.c
-@@ -94,6 +94,9 @@ wait__(ethr_event *e, int spincount, ethr_sint64_t timeout)
- 	tsp = NULL;
-     }
-     else {
-+#ifdef ETHR_HAVE_ETHR_GET_MONOTONIC_TIME
-+	start = ethr_get_monotonic_time();
-+#endif
- 	tsp = &ts;
- 	time = timeout;
- 	if (spincount == 0) {
-@@ -102,9 +105,6 @@ wait__(ethr_event *e, int spincount, ethr_sint64_t timeout)
- 		goto return_event_on;
- 	    goto set_timeout;
- 	}
--#ifdef ETHR_HAVE_ETHR_GET_MONOTONIC_TIME
--	start = ethr_get_monotonic_time();
--#endif
-     }
- 
-     while (1) {
---- a/erts/vsn.mk
-+++ b/erts/vsn.mk
-@@ -18,7 +18,7 @@
- # %CopyrightEnd%
- # 
- 
--VSN = 7.3
-+VSN = 7.3.1
- 
- # Port number 4365 in 4.2
- # Port number 4366 in 4.3
---- a/lib/inets/doc/src/mod_esi.xml
-+++ b/lib/inets/doc/src/mod_esi.xml
-@@ -23,10 +23,6 @@
-     </legalnotice>
- 
-     <title>mod_esi</title>
--    <prepared>Joakim Greben&ouml;</prepared>
--    <docno></docno>
--    <date>1997-10-14</date>
--    <rev>2.2</rev>
-     <file>mod_esi.sgml</file>
-   </header>
-   <module>mod_esi</module>
-@@ -39,6 +35,56 @@
-     <marker id="deliver"></marker>
-   </description>
- 
-+ <section>
-+    <title>DATA TYPES</title>
-+    <p>The following data types are used in the functions for mod_esi:</p>
-+
-+    <taglist>
-+      <tag><c>env() = </c></tag>
-+      <item> <p><c>{EnvKey()::atom(), Value::term()}</c></p>
-+      </item>
-+      
-+      <p>Currently supported key value pairs</p>
-+      <taglist>		
-+	
-+	<tag><c>{server_software, string()}</c></tag>
-+	<item><p>Indicates the inets version.</p></item>
-+	
-+	<tag><c>{server_name, string()}</c></tag>
-+	<item><p>The local hostname. </p></item>
-+
-+	<tag><c>{gateway_interface, string()}</c></tag>
-+	<item><p>Legacy string used in CGI, just ignore.</p> </item>
-+	
-+	<tag><c>{server_protocol, string()}</c></tag>
-+	<item><p> HTTP version, currently "HTTP/1.1"</p></item>
-+	
-+	<tag>{server_port, integer()}</tag>
-+	<item><p>Servers port number.</p></item>
-+	
-+	<tag><c>{request_method, "GET | "PUT" | "DELETE | "POST" | "PATCH"}</c></tag>
-+	
-+	<tag><c>{remote_adress, inet:ip_address()} </c></tag>
-+	<item><p>The clients ip address.</p></item>
-+
-+	<tag><c>{peer_cert, undefined | no_peercert | DER:binary()</c></tag>
-+	<item>
-+	  <p>For TLS connections where client certificates are used this will
-+	  be an ASN.1 DER-encoded X509-certificate as an Erlang binary.
-+	  If client certificates are not used the value will be <c>no_peercert</c>,
-+	  and if TLS is not used (HTTP or connection is lost due to network failure)
-+	  the value will be <c>undefined</c>.
-+	</p></item>
-+	
-+	<tag><c>{script_name, string()}</c></tag>
-+	<item><p>Request URI</p></item>
-+
-+	<tag><c>{http_LowerCaseHTTPHeaderName, string()}</c></tag>
-+	<item><p>example: {http_content_type, "text/html"}</p></item>
-+      </taglist>
-+      
-+    </taglist>
-+
-   <funcs>
-     <func>
-       <name>deliver(SessionID, Data) -> ok | {error, Reason}</name>
-@@ -63,11 +109,11 @@
- 	  overhead. Do not assume anything about the data type of 
- 	  <c>SessionID</c>. <c>SessionID</c> must be the value given 
- 	  as input to the ESI callback function that you implemented.</p>
--	</note>
-+	  </note>
-       </desc>
-     </func>
-   </funcs>
--
-+  </section>
-   <section>
-     <title>ESI Callback Functions</title>
-   </section>
-@@ -78,9 +124,7 @@
-       to the server process by calling <c>mod_esi:deliver/2</c>.</fsummary>
-       <type>
-         <v>SessionID = term()</v>
--        <v>Env = [EnvironmentDirectives] ++ ParsedHeader</v>
--        <v>EnvironmentDirectives = {Key,Value}</v>
--        <v>Key = query_string | content_length | server_software | gateway_interface | server_protocol | server_port | request_method | remote_addr | script_name</v>
-+        <v>Env = env()</v>
-         <v>Input = string()</v>
-       </type>
-       <desc>
-@@ -111,9 +155,7 @@
-       <fsummary>Creates a dynamic web page and returns it as a list. 
-       This function is deprecated and is only kept for backwards compatibility.</fsummary>
-       <type>
--        <v>Env = [EnvironmentDirectives] ++ ParsedHeader</v>
--        <v>EnvironmentDirectives = {Key,Value}</v>
--		  <v>Key = query_string | content_length | server_software | gateway_interface | server_protocol | server_port | request_method | remote_addr | script_name.</v>
-+        <v>Env = env()</v>
-         <v>Input = string()</v>
-         <v>Response = string()</v>
-       </type>
---- a/lib/inets/doc/src/notes.xml
-+++ b/lib/inets/doc/src/notes.xml
-@@ -33,7 +33,37 @@
-     <file>notes.xml</file>
-   </header>
-   
--  <section><title>Inets 6.2</title>
-+  <section><title>Inets 6.2.2</title>
-+
-+    <section><title>Improvements and New Features</title>
-+      <list>
-+        <item>
-+          <p>
-+	    Add environment information item peer_cert to mod_esi</p>
-+          <p>
-+	    Own Id: OTP-13510</p>
-+        </item>
-+      </list>
-+    </section>
-+
-+</section>
-+
-+<section><title>Inets 6.2.1</title>
-+
-+    <section><title>Fixed Bugs and Malfunctions</title>
-+      <list>
-+        <item>
-+          <p>
-+	    Mend ipv6_host_with_brackets option in httpc</p>
-+          <p>
-+	    Own Id: OTP-13417</p>
-+        </item>
-+      </list>
-+    </section>
-+
-+</section>
-+
-+<section><title>Inets 6.2</title>
- 
-     <section><title>Fixed Bugs and Malfunctions</title>
-       <list>
---- a/lib/inets/src/http_client/httpc.erl
-+++ b/lib/inets/src/http_client/httpc.erl
-@@ -556,7 +556,7 @@ handle_request(Method, Url,
- 
- 	    Request = #request{from          = Receiver,
- 			       scheme        = Scheme, 
--			       address       = {Host, Port},
-+			       address       = {host_address(Host, BracketedHost), Port},
- 			       path          = MaybeEscPath,
- 			       pquery        = MaybeEscQuery,
- 			       method        = Method,
-@@ -1268,3 +1268,7 @@ child_name(Pid, [_ | Children]) ->
- %% d(_, _, _) ->
- %%     ok.
- 
-+host_address(Host, false) ->
-+    Host;
-+host_address(Host, true) ->
-+    string:strip(string:strip(Host, right, $]), left, $[).
---- a/lib/inets/src/http_server/httpd_example.erl
-+++ b/lib/inets/src/http_server/httpd_example.erl
-@@ -20,7 +20,7 @@
- %%
- -module(httpd_example).
- -export([print/1]).
---export([get/2, post/2, yahoo/2, test1/2, get_bin/2]).
-+-export([get/2, post/2, yahoo/2, test1/2, get_bin/2, peer/2]).
- 
- -export([newformat/3]).
- %% These are used by the inets test-suite
-@@ -94,10 +94,26 @@ default(Env,Input) ->
-    io_lib:format("~p",[httpd:parse_query(Input)]),"\n",
-    footer()].
- 
-+peer(Env, Input) ->
-+   Header = 
-+     case proplists:get_value(peer_cert, Env) of
-+       undefined ->
-+   	 header("text/html", "Peer-Cert-Exist:false");
-+      _ ->
-+         header("text/html", "Peer-Cert-Exist:true")
-+     end,
-+   [Header,
-+   top("Test peer_cert environment option"),
-+   "<B>Peer cert:</B> ",
-+   io_lib:format("~p",[proplists:get_value(peer_cert, Env)]),"\n",
-+   footer()].	   	 
-+
- header() ->
-   header("text/html").
- header(MimeType) ->
-   "Content-type: " ++ MimeType ++ "\r\n\r\n".
-+header(MimeType, Other) ->
-+  "Content-type: " ++ MimeType ++ "\r\n" ++ Other ++ "\r\n\r\n".			 
- 
- top(Title) ->
-   "<HTML>
---- a/lib/inets/src/http_server/httpd_script_env.erl
-+++ b/lib/inets/src/http_server/httpd_script_env.erl
-@@ -61,6 +61,19 @@ which_port(#mod{config_db = ConfigDb}) ->
- which_peername(#mod{init_data = #init_data{peername = {_, RemoteAddr}}}) ->
-     RemoteAddr.
- 
-+which_peercert(#mod{socket_type = {Type, _}, socket = Socket}) when Type == essl;
-+								    Type == ssl ->
-+    case ssl:peercert(Socket) of
-+	{ok, Cert} ->
-+	    Cert;
-+	{error, no_peercert} -> 
-+	    no_peercert;
-+	_  ->
-+	    undefined
-+    end;
-+which_peercert(_) -> %% Not an ssl connection
-+    undefined.
-+
- which_resolve(#mod{init_data = #init_data{resolve = Resolve}}) ->
-     Resolve.
- 
-@@ -78,6 +91,7 @@ create_basic_elements(esi, ModData) ->
-      {server_port,       which_port(ModData)},
-      {request_method,    which_method(ModData)},
-      {remote_addr,       which_peername(ModData)},
-+     {peer_cert,         which_peercert(ModData)},
-      {script_name,       which_request_uri(ModData)}];
- 
- create_basic_elements(cgi, ModData) ->
---- a/lib/inets/src/inets_app/inets.appup.src
-+++ b/lib/inets/src/inets_app/inets.appup.src
-@@ -18,10 +18,16 @@
- %% %CopyrightEnd%
- {"%VSN%",
-  [
-+  {<<"6.2.1">>, [{load_module, httpd_script_env, soft_purge, soft_purge, []}]},
-+  {<<"6.2">>,   [{load_module, httpd_script_env, soft_purge, soft_purge, []},
-+		 {load_module, httpc, soft_purge, soft_purge, []}]},
-   {<<"6\\..*">>,[{restart_application, inets}]},
-   {<<"5\\..*">>,[{restart_application, inets}]}
-  ],
-  [
-+  {<<"6.2.1">>, [{load_module, httpd_script_env, soft_purge, soft_purge, []}]},
-+  {<<"6.2">>,   [{load_module, httpd_script_env, soft_purge, soft_purge, []},
-+		 {load_module, httpc, soft_purge, soft_purge, []}]},
-   {<<"6\\..*">>,[{restart_application, inets}]},
-   {<<"5\\..*">>,[{restart_application, inets}]}
-  ]
---- a/lib/inets/test/httpd_SUITE.erl
-+++ b/lib/inets/test/httpd_SUITE.erl
-@@ -755,7 +755,11 @@ esi(Config) when is_list(Config) ->
-     %% Check "ErlScriptNoCache" directive (default: false)
-     ok = http_status("GET /cgi-bin/erl/httpd_example:get ",
- 		     Config, [{statuscode, 200},
--		      {no_header, "cache-control"}]).
-+		      {no_header, "cache-control"}]),
-+    ok = http_status("GET /cgi-bin/erl/httpd_example:peer ",
-+	  	     Config, [{statuscode, 200},
-+	 	      {header, "peer-cert-exist", peer(Config)}]).
-+ 
- %%-------------------------------------------------------------------------
- mod_esi_chunk_timeout(Config) when is_list(Config) -> 
-     ok = httpd_1_1:mod_esi_chunk_timeout(?config(type, Config), 
-@@ -2065,3 +2069,11 @@ response_default_headers() ->
-      {"X-Frame-Options", "SAMEORIGIN"},
-      %% Override built-in default
-      {"Date", "Override-date"}].
-+
-+peer(Config) ->
-+   case proplists:get_value(type, Config) of
-+      ssl ->
-+        "true";
-+      _ ->
-+        "false"
-+   end.   
-\ No newline at end of file
---- a/lib/inets/vsn.mk
-+++ b/lib/inets/vsn.mk
-@@ -19,6 +19,6 @@
- # %CopyrightEnd%
- 
- APPLICATION = inets
--INETS_VSN   = 6.2
-+INETS_VSN   = 6.2.2
- PRE_VSN     =
- APP_VSN     = "$(APPLICATION)-$(INETS_VSN)$(PRE_VSN)"
---- a/lib/mnesia/doc/src/notes.xml
-+++ b/lib/mnesia/doc/src/notes.xml
-@@ -39,7 +39,23 @@
-     thus constitutes one section in this document. The title of each
-     section is the version number of Mnesia.</p>
- 
--  <section><title>Mnesia 4.13.3</title>
-+  <section><title>Mnesia 4.13.4</title>
-+
-+    <section><title>Fixed Bugs and Malfunctions</title>
-+      <list>
-+        <item>
-+          <p>
-+	    Mnesia transactions could hang while waiting on a
-+	    response from a node who had stopped.</p>
-+          <p>
-+	    Own Id: OTP-13423</p>
-+        </item>
-+      </list>
-+    </section>
-+
-+</section>
-+
-+<section><title>Mnesia 4.13.3</title>
- 
-     <section><title>Fixed Bugs and Malfunctions</title>
-       <list>
---- a/lib/mnesia/src/mnesia_tm.erl
-+++ b/lib/mnesia/src/mnesia_tm.erl
-@@ -1692,13 +1692,10 @@ commit_participant(Coord, Tid, Bin, C0, DiscNs, _RamNs) ->
- 			    ?eval_debug_fun({?MODULE, commit_participant, undo_prepare},
- 					    [{tid, Tid}]);
- 
--			{'EXIT', _, _} ->
-+			{'EXIT', _MnesiaTM, Reason} ->
-+			    reply(Coord, {do_abort, Tid, self(), {bad_commit,Reason}}),
- 			    mnesia_recover:log_decision(D#decision{outcome = aborted}),
--			    ?eval_debug_fun({?MODULE, commit_participant, exit_log_abort},
--					    [{tid, Tid}]),
--			    mnesia_schema:undo_prepare_commit(Tid, C0),
--			    ?eval_debug_fun({?MODULE, commit_participant, exit_undo_prepare},
--					    [{tid, Tid}]);
-+			    mnesia_schema:undo_prepare_commit(Tid, C0);
- 
- 			Msg ->
- 			    verbose("** ERROR ** commit_participant ~p, got unexpected msg: ~p~n",
-@@ -2210,8 +2207,6 @@ reconfigure_coordinators(N, [{Tid, [Store | _]} | Coordinators]) ->
- 		true ->
- 		    send_mnesia_down(Tid, Store, N)
- 	    end;
--	aborted ->
--	    ignore; % avoid spurious mnesia_down messages
- 	_ ->
- 	    %% Tell the coordinator about the mnesia_down
- 	    send_mnesia_down(Tid, Store, N)
---- a/lib/mnesia/vsn.mk
-+++ b/lib/mnesia/vsn.mk
-@@ -1 +1 @@
--MNESIA_VSN = 4.13.3
-+MNESIA_VSN = 4.13.4
---- a/lib/ssl/doc/src/notes.xml
-+++ b/lib/ssl/doc/src/notes.xml
-@@ -28,6 +28,36 @@
-   <p>This document describes the changes made to the SSL application.</p>
- 
- 
-+<section><title>SSL 7.3.1</title>
-+
-+    <section><title>Fixed Bugs and Malfunctions</title>
-+      <list>
-+        <item>
-+          <p>
-+	    Corrections to cipher suite handling using the 3 and 4
-+	    tuple format in addition to commit
-+	    89d7e21cf4ae988c57c8ef047bfe85127875c70c</p>
-+          <p>
-+	    Own Id: OTP-13511</p>
-+        </item>
-+      </list>
-+    </section>
-+
-+
-+    <section><title>Improvements and New Features</title>
-+      <list>
-+        <item>
-+          <p>
-+	    Make values for the TLS-1.2 signature_algorithms
-+	    extension configurable</p>
-+          <p>
-+	    Own Id: OTP-13261</p>
-+        </item>
-+      </list>
-+    </section>
-+
-+</section>
-+
- <section><title>SSL 7.3</title>
- 
-     <section><title>Fixed Bugs and Malfunctions</title>
---- a/lib/ssl/doc/src/ssl.xml
-+++ b/lib/ssl/doc/src/ssl.xml
-@@ -421,7 +421,6 @@ fun(srp, Username :: string(), UserState :: term()) ->
- 
-         <warning><p>Using <c>{padding_check, boolean()}</c> makes TLS
- 	vulnerable to the Poodle attack.</p></warning>
--
-   </section>
-   
-   <section>
-@@ -522,9 +521,45 @@ fun(srp, Username :: string(), UserState :: term()) ->
- 	 be supported by the server for the prevention to work.
- 	</p></warning>
-       </item>
--    </taglist>
-+      <tag><marker id="client_signature_algs"/><c>{signature_algs, [{hash(), ecdsa | rsa | dsa}]}</c></tag>
-+	<item>
-+	<p>In addition to the algorithms negotiated by the cipher
-+	suite used for key exchange, payload encryption, message
-+	authentication and pseudo random calculation, the TLS signature
-+	algorithm extension <url
-+	href="http://www.ietf.org/rfc/rfc5246.txt">Section 7.4.1.4.1 in RFC 5246</url> may be
-+	used, from TLS 1.2, to negotiate which signature algorithm to use during the
-+	TLS handshake. If no lower TLS versions than 1.2 are supported,
-+	the client will send a TLS signature algorithm extension
-+	with the algorithms specified by this option.
-+	Defaults to
-+	
-+	<code>[
-+%% SHA2
-+{sha512, ecdsa},
-+{sha512, rsa},
-+{sha384, ecdsa},
-+{sha384, rsa},
-+{sha256, ecdsa},
-+{sha256, rsa},
-+{sha224, ecdsa},
-+{sha224, rsa},
-+%% SHA
-+{sha, ecdsa},
-+{sha, rsa},
-+{sha, dsa},
-+%% MD5
-+{md5, rsa}
-+]</code>
-+	
-+	The algorithms should be in the preferred order.
-+	Selected signature algorithm can restrict which hash functions
-+	that may be selected.
-+	</p>
-+	</item>
-+      </taglist>
-    </section>
--
-+   
-   <section>
-     <title>SSL OPTION DESCRIPTIONS - SERVER SIDE</title>
- 
-@@ -651,6 +686,14 @@ fun(srp, Username :: string(), UserState :: term()) ->
-       <item>If true, use the server's preference for cipher selection. If false
-       (the default), use the client's preference.
-       </item>
-+      
-+      <tag><c>{signature_algs, [{hash(), ecdsa | rsa | dsa}]}</c></tag>
-+      <item><p> The algorithms specified by
-+      this option will be the ones accepted by the server in a signature algorithm
-+      negotiation, introduced in TLS-1.2. The algorithms will also be offered to the client if a
-+      client certificate is requested. For more details see the <seealso marker="#client_signature_algs">corresponding client option</seealso>.
-+      </p> </item>
-+
-     </taglist>
-   </section>
-   
---- a/lib/ssl/src/dtls_connection.erl
-+++ b/lib/ssl/src/dtls_connection.erl
-@@ -196,8 +196,7 @@ hello(start, #state{host = Host, port = Port, role = client,
-     {Record, State} = next_record(State1),
-     next_state(hello, hello, Record, State);
- 
--hello(Hello = #client_hello{client_version = ClientVersion,
--			    extensions = #hello_extensions{hash_signs = HashSigns}},
-+hello(Hello = #client_hello{client_version = ClientVersion},
-       State = #state{connection_states = ConnectionStates0,
- 		     port = Port, session = #session{own_certificate = Cert} = Session0,
- 		     renegotiation = {Renegotiation, _},
-@@ -209,9 +208,7 @@ hello(Hello = #client_hello{client_version = ClientVersion,
-         {Version, {Type, Session},
- 	 ConnectionStates,
- 	 #hello_extensions{ec_point_formats = EcPointFormats,
--			   elliptic_curves = EllipticCurves} = ServerHelloExt} ->
--            HashSign = ssl_handshake:select_hashsign(HashSigns, Cert, 
--						     dtls_v1:corresponding_tls_version(Version)),
-+			   elliptic_curves = EllipticCurves} = ServerHelloExt, HashSign} ->
-             ssl_connection:hello({common_client_hello, Type, ServerHelloExt, HashSign},
- 				 State#state{connection_states  = ConnectionStates,
- 					     negotiated_version = Version,
---- a/lib/ssl/src/dtls_handshake.erl
-+++ b/lib/ssl/src/dtls_handshake.erl
-@@ -94,7 +94,10 @@ hello(#server_hello{server_version = Version, random = Random,
- 
- hello(#client_hello{client_version = ClientVersion}, _Options, {_,_,_,_,ConnectionStates,_}, _Renegotiation) ->      
-     %% Return correct typ to make dialyzer happy until we have time to make the real imp.
--    {ClientVersion, {new, #session{}}, ConnectionStates, #hello_extensions{}}.
-+    HashSigns = tls_v1:default_signature_algs(dtls_v1:corresponding_tls_version(ClientVersion)),
-+    {ClientVersion, {new, #session{}}, ConnectionStates, #hello_extensions{}, 
-+     %% Placeholder for real hasign handling
-+     hd(HashSigns)}.
- 
- %% hello(Address, Port,
- %%       #ssl_tls{epoch = _Epoch, sequence_number = _Seq,
---- a/lib/ssl/src/ssl.appup.src
-+++ b/lib/ssl/src/ssl.appup.src
-@@ -1,9 +1,6 @@
- %% -*- erlang -*-
- {"%VSN%",
-  [
--  {<<"7\\.2">>, [{load_module, tls_connection, soft_purge, soft_purge, []},
--		 {load_module, ssl_tls_dist_proxy, soft_purge, soft_purge, []}
--		]},
-   {<<"7\\..*">>, [{restart_application, ssl}]},
-   {<<"6\\..*">>, [{restart_application, ssl}]},
-   {<<"5\\..*">>, [{restart_application, ssl}]},
-@@ -11,9 +8,6 @@
-   {<<"3\\..*">>, [{restart_application, ssl}]}
-  ], 
-  [
--  {<<"7\\.2">>, [{load_module, tls_connection, soft_purge, soft_purge, []},
--		 {load_module, ssl_tls_dist_proxy, soft_purge, soft_purge, []}
--		]},
-   {<<"7\\..*">>, [{restart_application, ssl}]},
-   {<<"6\\..*">>, [{restart_application, ssl}]},
-   {<<"5\\..*">>, [{restart_application, ssl}]},
---- a/lib/ssl/src/ssl.erl
-+++ b/lib/ssl/src/ssl.erl
-@@ -700,6 +700,10 @@ handle_options(Opts0, Role) ->
- 		    srp_identity = handle_option(srp_identity, Opts, undefined),
- 		    ciphers    = handle_cipher_option(proplists:get_value(ciphers, Opts, []), 
- 						      RecordCb:highest_protocol_version(Versions)),
-+		    signature_algs = handle_hashsigns_option(proplists:get_value(signature_algs, Opts, 
-+									     default_option_role(server, 
-+												 tls_v1:default_signature_algs(Versions), Role)),
-+							 RecordCb:highest_protocol_version(Versions)), 
- 		    %% Server side option
- 		    reuse_session = handle_option(reuse_session, Opts, ReuseSessionFun),
- 		    reuse_sessions = handle_option(reuse_sessions, Opts, true),
-@@ -749,7 +753,7 @@ handle_options(Opts0, Role) ->
- 		  alpn_preferred_protocols, next_protocols_advertised,
- 		  client_preferred_next_protocols, log_alert,
- 		  server_name_indication, honor_cipher_order, padding_check, crl_check, crl_cache,
--		  fallback],
-+		  fallback, signature_algs],
- 
-     SockOpts = lists:foldl(fun(Key, PropList) ->
- 				   proplists:delete(Key, PropList)
-@@ -989,6 +993,18 @@ validate_option(crl_cache, {Cb, {_Handle, Options}} = Value) when is_atom(Cb) an
- validate_option(Opt, Value) ->
-     throw({error, {options, {Opt, Value}}}).
- 
-+handle_hashsigns_option(Value, {Major, Minor} = Version) when is_list(Value) 
-+							      andalso Major >= 3 andalso Minor >= 3->
-+    case tls_v1:signature_algs(Version, Value) of
-+	[] ->
-+	    throw({error, {options, no_supported_algorithms, {signature_algs, Value}}});
-+	_ ->	
-+	    Value
-+    end;
-+handle_hashsigns_option(_, {Major, Minor} = Version) when Major >= 3 andalso Minor >= 3->
-+    handle_hashsigns_option(tls_v1:default_signature_algs(Version), Version);
-+handle_hashsigns_option(_, _Version) ->
-+    undefined.
- 
- validate_options([]) ->
- 	[];
-@@ -1089,10 +1105,7 @@ binary_cipher_suites(Version, []) ->
-     %% Defaults to all supported suites that does
-     %% not require explicit configuration
-     ssl_cipher:filter_suites(ssl_cipher:suites(Version));
--binary_cipher_suites(Version, [{_,_,_,_}| _] = Ciphers0) -> %% Backwards compatibility
--    Ciphers = [{KeyExchange, Cipher, Hash} || {KeyExchange, Cipher, Hash, _} <- Ciphers0],
--    binary_cipher_suites(Version, Ciphers);
--binary_cipher_suites(Version, [{_,_,_}| _] = Ciphers0) ->
-+binary_cipher_suites(Version, [Tuple|_] = Ciphers0) when is_tuple(Tuple) ->
-     Ciphers = [ssl_cipher:suite(C) || C <- Ciphers0],
-     binary_cipher_suites(Version, Ciphers);
- 
-@@ -1285,6 +1298,13 @@ new_ssl_options([{server_name_indication, Value} | Rest], #ssl_options{} = Opts,
-     new_ssl_options(Rest, Opts#ssl_options{server_name_indication = validate_option(server_name_indication, Value)}, RecordCB);
- new_ssl_options([{honor_cipher_order, Value} | Rest], #ssl_options{} = Opts, RecordCB) -> 
-     new_ssl_options(Rest, Opts#ssl_options{honor_cipher_order = validate_option(honor_cipher_order, Value)}, RecordCB);
-+new_ssl_options([{signature_algs, Value} | Rest], #ssl_options{} = Opts, RecordCB) -> 
-+    new_ssl_options(Rest, 
-+		    Opts#ssl_options{signature_algs = 
-+					 handle_hashsigns_option(Value, 
-+								 RecordCB:highest_protocol_version())}, 
-+		    RecordCB);
-+
- new_ssl_options([{Key, Value} | _Rest], #ssl_options{}, _) -> 
-     throw({error, {options, {Key, Value}}}).
- 
---- a/lib/ssl/src/ssl_cipher.erl
-+++ b/lib/ssl/src/ssl_cipher.erl
-@@ -43,11 +43,12 @@
- 
- -export_type([cipher_suite/0,
- 	      erl_cipher_suite/0, openssl_cipher_suite/0,
--	      key_algo/0]).
-+	      hash/0, key_algo/0, sign_algo/0]).
- 
- -type cipher()            :: null |rc4_128 | idea_cbc | des40_cbc | des_cbc | '3des_ede_cbc' 
- 			   | aes_128_cbc |  aes_256_cbc | aes_128_gcm | aes_256_gcm | chacha20_poly1305.
- -type hash()              :: null | sha | md5 | sha224 | sha256 | sha384 | sha512.
-+-type sign_algo()         :: rsa | dsa | ecdsa.
- -type key_algo()          :: null | rsa | dhe_rsa | dhe_dss | ecdhe_ecdsa| ecdh_ecdsa | ecdh_rsa| srp_rsa| srp_dss | psk | dhe_psk | rsa_psk | dh_anon | ecdh_anon | srp_anon.
- -type erl_cipher_suite()  :: {key_algo(), cipher(), hash()} % Pre TLS 1.2 
- 			     %% TLS 1.2, internally PRE TLS 1.2 will use default_prf
-@@ -841,17 +842,17 @@ suite({rsa_psk, aes_256_cbc,sha}) ->
- 
- %%% TLS 1.2 PSK Cipher Suites RFC 5487
- 
--suite({psk, aes_128_gcm, null}) ->
-+suite({psk, aes_128_gcm, null, sha256}) ->
-     ?TLS_PSK_WITH_AES_128_GCM_SHA256;
--suite({psk, aes_256_gcm, null}) ->
-+suite({psk, aes_256_gcm, null, sha384}) ->
-     ?TLS_PSK_WITH_AES_256_GCM_SHA384;
--suite({dhe_psk, aes_128_gcm, null}) ->
-+suite({dhe_psk, aes_128_gcm, null, sha256}) ->
-     ?TLS_DHE_PSK_WITH_AES_128_GCM_SHA256;
--suite({dhe_psk, aes_256_gcm, null}) ->
-+suite({dhe_psk, aes_256_gcm, null, sha384}) ->
-     ?TLS_DHE_PSK_WITH_AES_256_GCM_SHA384;
--suite({rsa_psk, aes_128_gcm, null}) ->
-+suite({rsa_psk, aes_128_gcm, null, sha256}) ->
-     ?TLS_RSA_PSK_WITH_AES_128_GCM_SHA256;
--suite({rsa_psk, aes_256_gcm, null}) ->
-+suite({rsa_psk, aes_256_gcm, null, sha384}) ->
-     ?TLS_RSA_PSK_WITH_AES_256_GCM_SHA384;
- 
- suite({psk, aes_128_cbc, sha256}) ->
-@@ -958,74 +959,74 @@ suite({ecdh_anon, aes_256_cbc, sha}) ->
-     ?TLS_ECDH_anon_WITH_AES_256_CBC_SHA;
- 
- %%% RFC 5289 EC TLS suites
--suite({ecdhe_ecdsa, aes_128_cbc, sha256}) ->
-+suite({ecdhe_ecdsa, aes_128_cbc, sha256, sha256}) ->
-     ?TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256;
--suite({ecdhe_ecdsa, aes_256_cbc, sha384}) ->
-+suite({ecdhe_ecdsa, aes_256_cbc, sha384, sha384}) ->
-     ?TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384;
--suite({ecdh_ecdsa, aes_128_cbc, sha256}) ->
-+suite({ecdh_ecdsa, aes_128_cbc, sha256, sha256}) ->
-     ?TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256;
--suite({ecdh_ecdsa, aes_256_cbc, sha384}) ->
-+suite({ecdh_ecdsa, aes_256_cbc, sha384, sha384}) ->
-     ?TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384;
--suite({ecdhe_rsa, aes_128_cbc, sha256}) ->
-+suite({ecdhe_rsa, aes_128_cbc, sha256, sha256}) ->
-     ?TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256;
--suite({ecdhe_rsa, aes_256_cbc, sha384}) ->
-+suite({ecdhe_rsa, aes_256_cbc, sha384, sha384}) ->
-     ?TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384;
--suite({ecdh_rsa, aes_128_cbc, sha256}) ->
-+suite({ecdh_rsa, aes_128_cbc, sha256, sha256}) ->
-     ?TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256;
--suite({ecdh_rsa, aes_256_cbc, sha384}) ->
-+suite({ecdh_rsa, aes_256_cbc, sha384, sha384}) ->
-     ?TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384;
- 
- %% RFC 5288 AES-GCM Cipher Suites
--suite({rsa, aes_128_gcm, null}) ->
-+suite({rsa, aes_128_gcm, null, sha256}) ->
-     ?TLS_RSA_WITH_AES_128_GCM_SHA256;
- suite({rsa, aes_256_gcm, null}) ->
-     ?TLS_RSA_WITH_AES_256_GCM_SHA384;
--suite({dhe_rsa, aes_128_gcm, null}) ->
-+suite({dhe_rsa, aes_128_gcm, null, sha384}) ->
-     ?TLS_DHE_RSA_WITH_AES_128_GCM_SHA256;
--suite({dhe_rsa, aes_256_gcm, null}) ->
-+suite({dhe_rsa, aes_256_gcm, null, sha256}) ->
-     ?TLS_DHE_RSA_WITH_AES_256_GCM_SHA384;
--suite({dh_rsa, aes_128_gcm, null}) ->
-+suite({dh_rsa, aes_128_gcm, null, sha384}) ->
-     ?TLS_DH_RSA_WITH_AES_128_GCM_SHA256;
--suite({dh_rsa, aes_256_gcm, null}) ->
-+suite({dh_rsa, aes_256_gcm, null, sha256}) ->
-     ?TLS_DH_RSA_WITH_AES_256_GCM_SHA384;
--suite({dhe_dss, aes_128_gcm, null}) ->
-+suite({dhe_dss, aes_128_gcm, null, sha384}) ->
-     ?TLS_DHE_DSS_WITH_AES_128_GCM_SHA256;
--suite({dhe_dss, aes_256_gcm, null}) ->
-+suite({dhe_dss, aes_256_gcm, null, sha256}) ->
-     ?TLS_DHE_DSS_WITH_AES_256_GCM_SHA384;
--suite({dh_dss, aes_128_gcm, null}) ->
-+suite({dh_dss, aes_128_gcm, null, sha384}) ->
-     ?TLS_DH_DSS_WITH_AES_128_GCM_SHA256;
--suite({dh_dss, aes_256_gcm, null}) ->
-+suite({dh_dss, aes_256_gcm, null, sha384}) ->
-     ?TLS_DH_DSS_WITH_AES_256_GCM_SHA384;
--suite({dh_anon, aes_128_gcm, null}) ->
-+suite({dh_anon, aes_128_gcm, null, sha256}) ->
-     ?TLS_DH_anon_WITH_AES_128_GCM_SHA256;
--suite({dh_anon, aes_256_gcm, null}) ->
-+suite({dh_anon, aes_256_gcm, null, sha384}) ->
-     ?TLS_DH_anon_WITH_AES_256_GCM_SHA384;
- 
- %% RFC 5289 ECC AES-GCM Cipher Suites
--suite({ecdhe_ecdsa, aes_128_gcm, null}) ->
-+suite({ecdhe_ecdsa, aes_128_gcm, null, sha256}) ->
-     ?TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256;
--suite({ecdhe_ecdsa, aes_256_gcm, null}) ->
-+suite({ecdhe_ecdsa, aes_256_gcm, null, sha384}) ->
-     ?TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384;
--suite({ecdh_ecdsa, aes_128_gcm, null}) ->
-+suite({ecdh_ecdsa, aes_128_gcm, null, sha256}) ->
-     ?TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256;
--suite({ecdh_ecdsa, aes_256_gcm, null}) ->
-+suite({ecdh_ecdsa, aes_256_gcm, null, sha384}) ->
-     ?TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384;
--suite({ecdhe_rsa, aes_128_gcm, null}) ->
-+suite({ecdhe_rsa, aes_128_gcm, null, sha256}) ->
-     ?TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256;
--suite({ecdhe_rsa, aes_256_gcm, null}) ->
-+suite({ecdhe_rsa, aes_256_gcm, null, sha384}) ->
-     ?TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384;
--suite({ecdh_rsa, aes_128_gcm, null}) ->
-+suite({ecdh_rsa, aes_128_gcm, null, sha256}) ->
-     ?TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256;
--suite({ecdh_rsa, aes_256_gcm, null}) ->
-+suite({ecdh_rsa, aes_256_gcm, null, sha384}) ->
-     ?TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384;
- 
- 
- %% draft-agl-tls-chacha20poly1305-04 Chacha20/Poly1305 Suites
--suite({ecdhe_rsa, chacha20_poly1305, null}) ->
-+suite({ecdhe_rsa, chacha20_poly1305, null, sha256}) ->
-     ?TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256;
--suite({ecdhe_ecdsa, chacha20_poly1305, null}) ->
-+suite({ecdhe_ecdsa, chacha20_poly1305, null, sha256}) ->
-     ?TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256;
--suite({dhe_rsa, chacha20_poly1305, null}) ->
-+suite({dhe_rsa, chacha20_poly1305, null, sha256}) ->
-     ?TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256.
- 
- %%--------------------------------------------------------------------
---- a/lib/ssl/src/ssl_connection.erl
-+++ b/lib/ssl/src/ssl_connection.erl
-@@ -304,13 +304,9 @@ hello(#hello_request{}, #state{role = client} = State0, Connection) ->
-     {Record, State} = Connection:next_record(State0),
-     Connection:next_state(hello, hello, Record, State);
- 
--hello({common_client_hello, Type, ServerHelloExt, NegotiatedHashSign},
-+hello({common_client_hello, Type, ServerHelloExt},
-       State, Connection) ->
--    do_server_hello(Type, ServerHelloExt,
--		    %% Note NegotiatedHashSign is only negotiated for real if
--		    %% if TLS version is at least TLS-1.2 
--		    State#state{hashsign_algorithm = NegotiatedHashSign}, Connection);
--
-+    do_server_hello(Type, ServerHelloExt, State, Connection);
- hello(timeout, State, _) ->
-     {next_state, hello, State, hibernate};
- 
-@@ -442,7 +438,8 @@ certify(#server_key_exchange{exchange_keys = Keys},
-        Alg == srp_dss; Alg == srp_rsa; Alg == srp_anon ->
- 
-     Params = ssl_handshake:decode_server_key(Keys, Alg, Version),
--    HashSign = negotiated_hashsign(Params#server_key_params.hashsign, Alg, Version),
-+    %% Use negotiated value if TLS-1.2 otherwhise return default
-+    HashSign = negotiated_hashsign(Params#server_key_params.hashsign, Alg, PubKeyInfo, Version),
-     case is_anonymous(Alg) of
- 	true ->
- 	    calculate_secret(Params#server_key_params.params,
-@@ -464,11 +461,18 @@ certify(#server_key_exchange{} = Msg,
- 
- certify(#certificate_request{hashsign_algorithms = HashSigns},
- 	#state{session = #session{own_certificate = Cert},
--        negotiated_version = Version} = State0, Connection) ->
--    HashSign = ssl_handshake:select_hashsign(HashSigns, Cert, Version),
--    {Record, State} = Connection:next_record(State0#state{client_certificate_requested = true}),
--    Connection:next_state(certify, certify, Record,
--			  State#state{cert_hashsign_algorithm = HashSign});
-+	       key_algorithm = KeyExAlg,
-+	       ssl_options = #ssl_options{signature_algs = SupportedHashSigns},
-+	       negotiated_version = Version} = State0, Connection) ->
-+
-+    case ssl_handshake:select_hashsign(HashSigns, Cert, KeyExAlg, SupportedHashSigns, Version) of
-+	#alert {} = Alert ->
-+	    Connection:handle_own_alert(Alert, Version, certify, State0);
-+	NegotiatedHashSign -> 
-+	    {Record, State} = Connection:next_record(State0#state{client_certificate_requested = true}),
-+	    Connection:next_state(certify, certify, Record,
-+				  State#state{cert_hashsign_algorithm = NegotiatedHashSign})
-+    end;
- 
- %% PSK and RSA_PSK might bypass the Server-Key-Exchange
- certify(#server_hello_done{},
-@@ -576,13 +580,15 @@ cipher(#hello_request{}, State0, Connection) ->
- 
- cipher(#certificate_verify{signature = Signature, hashsign_algorithm = CertHashSign},
-        #state{role = server,
--	      public_key_info = {Algo, _, _} =PublicKeyInfo,
-+	      key_algorithm = KexAlg,
-+	      public_key_info = PublicKeyInfo,
- 	      negotiated_version = Version,
- 	      session = #session{master_secret = MasterSecret},
- 	      tls_handshake_history = Handshake
- 	     } = State0, Connection) ->
--
--    HashSign = ssl_handshake:select_hashsign_algs(CertHashSign, Algo, Version),
-+    
-+    %% Use negotiated value if TLS-1.2 otherwhise return default
-+    HashSign = negotiated_hashsign(CertHashSign, KexAlg, PublicKeyInfo, Version),
-     case ssl_handshake:certificate_verify(Signature, PublicKeyInfo,
- 					  Version, HashSign, MasterSecret, Handshake) of
- 	valid ->
-@@ -1448,7 +1454,8 @@ rsa_psk_key_exchange(Version, PskIdentity, PremasterSecret, PublicKeyInfo = {Alg
- rsa_psk_key_exchange(_, _, _, _) ->
-     throw (?ALERT_REC(?FATAL,?HANDSHAKE_FAILURE)).
- 
--request_client_cert(#state{ssl_options = #ssl_options{verify = verify_peer},
-+request_client_cert(#state{ssl_options = #ssl_options{verify = verify_peer, 
-+						      signature_algs = SupportedHashSigns},
- 			   connection_states = ConnectionStates0,
- 			   cert_db = CertDbHandle,
- 			   cert_db_ref = CertDbRef,
-@@ -1456,7 +1463,9 @@ request_client_cert(#state{ssl_options = #ssl_options{verify = verify_peer},
-     #connection_state{security_parameters =
- 			  #security_parameters{cipher_suite = CipherSuite}} =
- 	ssl_record:pending_connection_state(ConnectionStates0, read),
--    Msg = ssl_handshake:certificate_request(CipherSuite, CertDbHandle, CertDbRef, Version),
-+    HashSigns = ssl_handshake:available_signature_algs(SupportedHashSigns, Version, [Version]),
-+    Msg = ssl_handshake:certificate_request(CipherSuite, CertDbHandle, CertDbRef, 
-+					    HashSigns, Version),
-     State = Connection:send_handshake(Msg, State0),
-     State#state{client_certificate_requested = true};
- 
-@@ -1881,15 +1890,16 @@ make_premaster_secret({MajVer, MinVer}, rsa) ->
- make_premaster_secret(_, _) ->
-     undefined.
- 
--negotiated_hashsign(undefined, Alg, Version) ->
-+negotiated_hashsign(undefined, KexAlg, PubKeyInfo, Version) ->
-     %% Not negotiated choose default 
--    case is_anonymous(Alg) of
-+    case is_anonymous(KexAlg) of
- 	true ->
- 	    {null, anon};
- 	false ->
--	    ssl_handshake:select_hashsign_algs(Alg, Version)
-+	    {PubAlg, _, _} = PubKeyInfo,
-+	    ssl_handshake:select_hashsign_algs(undefined, PubAlg, Version)
-     end;
--negotiated_hashsign(HashSign = {_, _}, _, _) ->
-+negotiated_hashsign(HashSign = {_, _}, _, _, _) ->
-     HashSign.
- 
- ssl_options_list(SslOptions) ->
---- a/lib/ssl/src/ssl_handshake.erl
-+++ b/lib/ssl/src/ssl_handshake.erl
-@@ -46,7 +46,7 @@
- 
- %% Handshake messages
- -export([hello_request/0, server_hello/4, server_hello_done/0,
--	 certificate/4, certificate_request/4, key_exchange/3,
-+	 certificate/4, certificate_request/5, key_exchange/3,
- 	 finished/5,  next_protocol/1]).
- 
- %% Handle handshake messages
-@@ -64,8 +64,8 @@
- 	]).
- 
- %% Cipher suites handling
---export([available_suites/2, cipher_suites/2,
--	 select_session/10, supported_ecc/1]).
-+-export([available_suites/2, available_signature_algs/3, cipher_suites/2,
-+	 select_session/11, supported_ecc/1]).
- 
- %% Extensions handling
- -export([client_hello_extensions/6,
-@@ -74,8 +74,8 @@
- 	]).
- 
- %% MISC
---export([select_version/3, prf/5, select_hashsign/3, 
--	 select_hashsign_algs/2, select_hashsign_algs/3,
-+-export([select_version/3, prf/5, select_hashsign/5, 
-+	 select_hashsign_algs/3,
- 	 premaster_secret/2, premaster_secret/3, premaster_secret/4]).
- 
- %%====================================================================
-@@ -120,7 +120,8 @@ server_hello(SessionId, Version, ConnectionStates, Extensions) ->
- server_hello_done() ->
-     #server_hello_done{}.
- 
--client_hello_extensions(Host, Version, CipherSuites, SslOpts, ConnectionStates, Renegotiation) ->
-+client_hello_extensions(Host, Version, CipherSuites, 
-+			#ssl_options{signature_algs = SupportedHashSigns, versions = AllVersions} = SslOpts, ConnectionStates, Renegotiation) ->
-     {EcPointFormats, EllipticCurves} =
- 	case advertises_ec_ciphers(lists:map(fun ssl_cipher:suite_definition/1, CipherSuites)) of
- 	    true ->
-@@ -134,7 +135,7 @@ client_hello_extensions(Host, Version, CipherSuites, SslOpts, ConnectionStates,
-        renegotiation_info = renegotiation_info(tls_record, client,
- 					       ConnectionStates, Renegotiation),
-        srp = SRP,
--       hash_signs = advertised_hash_signs(Version),
-+       signature_algs = available_signature_algs(SupportedHashSigns, Version, AllVersions),
-        ec_point_formats = EcPointFormats,
-        elliptic_curves = EllipticCurves,
-        alpn = encode_alpn(SslOpts#ssl_options.alpn_advertised_protocols, Renegotiation),
-@@ -203,14 +204,14 @@ client_certificate_verify(OwnCert, MasterSecret, Version,
-     end.
- 
- %%--------------------------------------------------------------------
---spec certificate_request(ssl_cipher:cipher_suite(), db_handle(), certdb_ref(), ssl_record:ssl_version()) ->
--    #certificate_request{}.
-+-spec certificate_request(ssl_cipher:cipher_suite(), db_handle(), 
-+			  certdb_ref(),  #hash_sign_algos{}, ssl_record:ssl_version()) ->
-+				 #certificate_request{}.
- %%
- %% Description: Creates a certificate_request message, called by the server.
- %%--------------------------------------------------------------------
--certificate_request(CipherSuite, CertDbHandle, CertDbRef, Version) ->
-+certificate_request(CipherSuite, CertDbHandle, CertDbRef, HashSigns, Version) ->
-     Types = certificate_types(ssl_cipher:suite_definition(CipherSuite), Version),
--    HashSigns = advertised_hash_signs(Version),
-     Authorities = certificate_authorities(CertDbHandle, CertDbRef),
-     #certificate_request{
- 		    certificate_types = Types,
-@@ -351,6 +352,9 @@ verify_server_key(#server_key_params{params_bin = EncParams,
- %%
- %% Description: Checks that the certificate_verify message is valid.
- %%--------------------------------------------------------------------
-+certificate_verify(_, _, _, undefined, _, _) ->
-+    ?ALERT_REC(?FATAL, ?HANDSHAKE_FAILURE);
-+
- certificate_verify(Signature, PublicKeyInfo, Version,
- 		   HashSign = {HashAlgo, _}, MasterSecret, {_, Handshake}) ->
-     Hash = calc_certificate_verify(Version, HashAlgo, MasterSecret, Handshake),
-@@ -379,10 +383,11 @@ verify_signature(_Version, Hash, _HashAlgo, Signature, {?rsaEncryption, PubKey,
-     end;
- verify_signature(_Version, Hash, {HashAlgo, dsa}, Signature, {?'id-dsa', PublicKey, PublicKeyParams}) ->
-     public_key:verify({digest, Hash}, HashAlgo, Signature, {PublicKey, PublicKeyParams});
--verify_signature(_Version, Hash, {HashAlgo, ecdsa}, Signature,
-+verify_signature(_, Hash, {HashAlgo, _SignAlg}, Signature,
- 		 {?'id-ecPublicKey', PublicKey, PublicKeyParams}) ->
-     public_key:verify({digest, Hash}, HashAlgo, Signature, {PublicKey, PublicKeyParams}).
- 
-+
- %%--------------------------------------------------------------------
- -spec certify(#certificate{}, db_handle(), certdb_ref(), integer() | nolimit,
- 	      verify_peer | verify_none, {fun(), term}, fun(), term(), term(),
-@@ -573,43 +578,46 @@ prf({3,_N}, Secret, Label, Seed, WantedLength) ->
- 
- 
- %%--------------------------------------------------------------------
---spec select_hashsign(#hash_sign_algos{}| undefined,  undefined | binary(), ssl_record:ssl_version()) ->
--			      {atom(), atom()} | undefined.
-+-spec select_hashsign(#hash_sign_algos{} | undefined,  undefined | binary(), 
-+		      atom(), [atom()], ssl_record:ssl_version()) ->
-+			     {atom(), atom()} | undefined  | #alert{}.
- 
- %%
--%% Description:
-+%% Description: Handles signature_algorithms extension
- %%--------------------------------------------------------------------
--select_hashsign(_, undefined, _Version) ->
-+select_hashsign(_, undefined, _,  _, _Version) ->
-     {null, anon};
- %% The signature_algorithms extension was introduced with TLS 1.2. Ignore it if we have
- %% negotiated a lower version.
--select_hashsign(#hash_sign_algos{hash_sign_algos = HashSigns}, Cert, {Major, Minor} = Version)
--  when Major >= 3 andalso Minor >= 3 ->
--    #'OTPCertificate'{tbsCertificate = TBSCert} =public_key:pkix_decode_cert(Cert, otp),
-+select_hashsign(HashSigns, Cert, KeyExAlgo, 
-+		undefined, {Major, Minor} = Version)  when Major >= 3 andalso Minor >= 3->
-+    select_hashsign(HashSigns, Cert, KeyExAlgo, tls_v1:default_signature_algs(Version), Version);
-+select_hashsign(#hash_sign_algos{hash_sign_algos = HashSigns}, Cert, KeyExAlgo, SupportedHashSigns,
-+		{Major, Minor}) when Major >= 3 andalso Minor >= 3 ->
-+    #'OTPCertificate'{tbsCertificate = TBSCert} = public_key:pkix_decode_cert(Cert, otp),
-     #'OTPSubjectPublicKeyInfo'{algorithm = {_,Algo, _}} = TBSCert#'OTPTBSCertificate'.subjectPublicKeyInfo,
--    DefaultHashSign = {_, Sign} = select_hashsign_algs(undefined, Algo, Version),
--    case lists:filter(fun({sha, dsa}) ->
-+    Sign = cert_sign(Algo),
-+    case lists:filter(fun({sha, dsa = S}) when S == Sign ->
- 			      true;
- 			 ({_, dsa}) ->
- 			      false;
--			 ({Hash, S}) when  S == Sign ->
--			      ssl_cipher:is_acceptable_hash(Hash,
--							    proplists:get_value(hashs, crypto:supports()));
-+			 ({_, _} = Algos) ->
-+			      is_acceptable_hash_sign(Algos, Sign, KeyExAlgo, SupportedHashSigns);
- 			 (_)  ->
- 			      false
- 		      end, HashSigns) of
- 	[] ->
--	    DefaultHashSign;
--	[HashSign| _] ->
-+	    ?ALERT_REC(?FATAL, ?INSUFFICIENT_SECURITY);
-+	[HashSign | _] ->
- 	    HashSign
-     end;
--select_hashsign(_, Cert, Version) ->
-+select_hashsign(_, Cert, _, _, Version) ->
-     #'OTPCertificate'{tbsCertificate = TBSCert} = public_key:pkix_decode_cert(Cert, otp),
-     #'OTPSubjectPublicKeyInfo'{algorithm = {_,Algo, _}} = TBSCert#'OTPTBSCertificate'.subjectPublicKeyInfo,
-     select_hashsign_algs(undefined, Algo, Version).
- 
- %%--------------------------------------------------------------------
---spec select_hashsign_algs(#hash_sign_algos{}| undefined, oid(), ssl_record:ssl_version()) ->
-+-spec select_hashsign_algs({atom(), atom()}| undefined, oid(), ssl_record:ssl_version()) ->
- 				  {atom(), atom()}.
- 
- %% Description: For TLS 1.2 hash function and signature algorithm pairs can be
-@@ -642,24 +650,6 @@ select_hashsign_algs(undefined, ?rsaEncryption, _) ->
- select_hashsign_algs(undefined, ?'id-dsa', _) ->
-     {sha, dsa}.
- 
---spec select_hashsign_algs(atom(),  ssl_record:ssl_version()) -> {atom(), atom()}.
--%% Wrap function to keep the knowledge of the default values in
--%% one place only 
--select_hashsign_algs(Alg, Version) when (Alg == rsa orelse
--				    Alg == dhe_rsa orelse
--				    Alg == dh_rsa orelse
--				    Alg == ecdhe_rsa orelse
--				    Alg == ecdh_rsa orelse
--				    Alg == srp_rsa) ->    
--    select_hashsign_algs(undefined, ?rsaEncryption, Version);
--select_hashsign_algs(Alg, Version) when (Alg == dhe_dss orelse
--				    Alg == dh_dss orelse
--				    Alg == srp_dss) ->
--    select_hashsign_algs(undefined, ?'id-dsa', Version);
--select_hashsign_algs(Alg, Version) when (Alg == ecdhe_ecdsa orelse
--					 Alg == ecdh_ecdsa) ->
--    select_hashsign_algs(undefined, ?'id-ecPublicKey', Version).
--
- %%--------------------------------------------------------------------
- -spec master_secret(atom(), ssl_record:ssl_version(), #session{} | binary(), #connection_states{},
- 		   client | server) -> {binary(), #connection_states{}} | #alert{}.
-@@ -1063,9 +1053,56 @@ available_suites(UserSuites, Version) ->
- 			    lists:member(Suite, ssl_cipher:all_suites(Version))
- 		    end, UserSuites).
- 
--available_suites(ServerCert, UserSuites, Version, Curve) ->
-+available_suites(ServerCert, UserSuites, Version, undefined, Curve) ->
-     ssl_cipher:filter(ServerCert, available_suites(UserSuites, Version))
--	-- unavailable_ecc_suites(Curve).
-+	-- unavailable_ecc_suites(Curve);
-+available_suites(ServerCert, UserSuites, Version, HashSigns, Curve) ->
-+    Suites = available_suites(ServerCert, UserSuites, Version, undefined, Curve),
-+    filter_hashsigns(Suites, [ssl_cipher:suite_definition(Suite) || Suite <- Suites], HashSigns, []).
-+filter_hashsigns([], [], _, Acc) ->
-+    lists:reverse(Acc);
-+filter_hashsigns([Suite | Suites], [{KeyExchange,_,_,_} | Algos], HashSigns,
-+		 Acc) when KeyExchange == dhe_ecdsa;
-+			   KeyExchange == ecdhe_ecdsa ->
-+    do_filter_hashsigns(ecdsa, Suite, Suites, Algos, HashSigns, Acc);
-+
-+filter_hashsigns([Suite | Suites], [{KeyExchange,_,_,_} | Algos], HashSigns,
-+		 Acc) when KeyExchange == rsa;
-+			   KeyExchange == dhe_rsa;
-+			   KeyExchange == ecdhe_rsa;
-+			   KeyExchange == srp_rsa;
-+			   KeyExchange == rsa_psk ->
-+    do_filter_hashsigns(rsa, Suite, Suites, Algos, HashSigns, Acc);
-+filter_hashsigns([Suite | Suites], [{KeyExchange,_,_,_} | Algos], HashSigns, Acc) when 
-+      KeyExchange == dhe_dss;
-+      KeyExchange == srp_dss ->							       
-+    do_filter_hashsigns(dsa, Suite, Suites, Algos, HashSigns, Acc);
-+filter_hashsigns([Suite | Suites], [{KeyExchange,_,_,_} | Algos], HashSigns, Acc) when 
-+      KeyExchange == dh_dss; 
-+      KeyExchange == dh_rsa; 
-+      KeyExchange == dh_ecdsa;
-+      KeyExchange == ecdh_rsa;    
-+      KeyExchange == ecdh_ecdsa ->
-+      %%  Fixed DH certificates MAY be signed with any hash/signature
-+      %%  algorithm pair appearing in the hash_sign extension.  The names
-+    %%  DH_DSS, DH_RSA, ECDH_ECDSA, and ECDH_RSA are historical.
-+    filter_hashsigns(Suites, Algos, HashSigns, [Suite| Acc]);
-+filter_hashsigns([Suite | Suites], [{KeyExchange,_,_,_} | Algos], HashSigns, Acc) when 
-+      KeyExchange == dh_anon;
-+      KeyExchange == ecdh_anon;
-+      KeyExchange == srp_anon;
-+      KeyExchange == psk;
-+      KeyExchange == dhe_psk ->
-+    %% In this case hashsigns is not used as the kexchange is anonaymous
-+    filter_hashsigns(Suites, Algos, HashSigns, [Suite| Acc]).
-+
-+do_filter_hashsigns(SignAlgo, Suite, Suites, Algos, HashSigns, Acc) ->
-+    case lists:keymember(SignAlgo, 2, HashSigns) of
-+	true ->
-+	    filter_hashsigns(Suites, Algos, HashSigns, [Suite| Acc]);
-+	false ->
-+	    filter_hashsigns(Suites, Algos, HashSigns, Acc)
-+    end.
- 
- unavailable_ecc_suites(no_curve) ->
-     ssl_cipher:ec_keyed_suites();
-@@ -1077,17 +1114,17 @@ cipher_suites(Suites, false) ->
- cipher_suites(Suites, true) ->
-     Suites.
- 
--select_session(SuggestedSessionId, CipherSuites, Compressions, Port, #session{ecc = ECCCurve} = 
-+select_session(SuggestedSessionId, CipherSuites, HashSigns, Compressions, Port, #session{ecc = ECCCurve} = 
- 		   Session, Version,
--	       #ssl_options{ciphers = UserSuites, honor_cipher_order = HCO} = SslOpts,
-+	       #ssl_options{ciphers = UserSuites, honor_cipher_order = HonorCipherOrder} = SslOpts,
- 	       Cache, CacheCb, Cert) ->
-     {SessionId, Resumed} = ssl_session:server_id(Port, SuggestedSessionId,
- 						 SslOpts, Cert,
- 						 Cache, CacheCb),
-     case Resumed of
-         undefined ->
--	    Suites = available_suites(Cert, UserSuites, Version, ECCCurve),
--	    CipherSuite = select_cipher_suite(CipherSuites, Suites, HCO),
-+	    Suites = available_suites(Cert, UserSuites, Version, HashSigns, ECCCurve),
-+	    CipherSuite = select_cipher_suite(CipherSuites, Suites, HonorCipherOrder),
- 	    Compression = select_compression(Compressions),
- 	    {new, Session#session{session_id = SessionId,
- 				  cipher_suite = CipherSuite,
-@@ -1155,7 +1192,7 @@ handle_client_hello_extensions(RecordCB, Random, ClientCipherSuites,
- 			       #hello_extensions{renegotiation_info = Info,
- 						 srp = SRP,
- 						 ec_point_formats = ECCFormat,
--                         alpn = ALPN,
-+						 alpn = ALPN,
- 						 next_protocol_negotiation = NextProtocolNegotiation}, Version,
- 			       #ssl_options{secure_renegotiate = SecureRenegotation,
-                                             alpn_preferred_protocols = ALPNPreferredProtocols} = Opts,
-@@ -1324,7 +1361,7 @@ handle_renegotiation_info(_RecordCB, ConnectionStates, SecureRenegotation) ->
- 
- hello_extensions_list(#hello_extensions{renegotiation_info = RenegotiationInfo,
- 					srp = SRP,
--					hash_signs = HashSigns,
-+					signature_algs = HashSigns,
- 					ec_point_formats = EcPointFormats,
- 					elliptic_curves = EllipticCurves,
-                                         alpn = ALPN,
-@@ -1799,7 +1836,7 @@ dec_hello_extensions(<<?UINT16(?SIGNATURE_ALGORITHMS_EXT), ?UINT16(Len),
-     <<?UINT16(SignAlgoListLen), SignAlgoList/binary>> = ExtData,
-     HashSignAlgos = [{ssl_cipher:hash_algorithm(Hash), ssl_cipher:sign_algorithm(Sign)} ||
- 			<<?BYTE(Hash), ?BYTE(Sign)>> <= SignAlgoList],
--    dec_hello_extensions(Rest, Acc#hello_extensions{hash_signs =
-+    dec_hello_extensions(Rest, Acc#hello_extensions{signature_algs =
- 						    #hash_sign_algos{hash_sign_algos = HashSignAlgos}});
- 
- dec_hello_extensions(<<?UINT16(?ELLIPTIC_CURVES_EXT), ?UINT16(Len),
-@@ -1899,7 +1936,7 @@ from_2bytes(<<?UINT16(N), Rest/binary>>, Acc) ->
- key_exchange_alg(rsa) ->
-     ?KEY_EXCHANGE_RSA;
- key_exchange_alg(Alg) when Alg == dhe_rsa; Alg == dhe_dss;
--			    Alg == dh_dss; Alg == dh_rsa; Alg == dh_anon ->
-+			   Alg == dh_dss; Alg == dh_rsa; Alg == dh_anon ->
-     ?KEY_EXCHANGE_DIFFIE_HELLMAN;
- key_exchange_alg(Alg) when Alg == ecdhe_rsa; Alg == ecdh_rsa;
- 			   Alg == ecdhe_ecdsa; Alg == ecdh_ecdsa;
-@@ -2008,27 +2045,16 @@ is_member(Suite, SupportedSuites) ->
- select_compression(_CompressionMetodes) ->
-     ?NULL.
- 
---define(TLSEXT_SIGALG_RSA(MD), {MD, rsa}).
---define(TLSEXT_SIGALG_DSA(MD), {MD, dsa}).
---define(TLSEXT_SIGALG_ECDSA(MD), {MD, ecdsa}).
--
---define(TLSEXT_SIGALG(MD), ?TLSEXT_SIGALG_ECDSA(MD), ?TLSEXT_SIGALG_RSA(MD)).
--
--advertised_hash_signs({Major, Minor}) when Major >= 3 andalso Minor >= 3 ->
--    HashSigns = [?TLSEXT_SIGALG(sha512),
--		 ?TLSEXT_SIGALG(sha384),
--		 ?TLSEXT_SIGALG(sha256),
--		 ?TLSEXT_SIGALG(sha224),
--		 ?TLSEXT_SIGALG(sha),
--		 ?TLSEXT_SIGALG_DSA(sha),
--		 ?TLSEXT_SIGALG_RSA(md5)],
--    CryptoSupport = crypto:supports(),
--    HasECC = proplists:get_bool(ecdsa,  proplists:get_value(public_keys, CryptoSupport)),
--    Hashs = proplists:get_value(hashs, CryptoSupport),
--    #hash_sign_algos{hash_sign_algos =
--			 lists:filter(fun({Hash, ecdsa}) -> HasECC andalso proplists:get_bool(Hash, Hashs);
--					 ({Hash, _}) -> proplists:get_bool(Hash, Hashs) end, HashSigns)};
--advertised_hash_signs(_) ->
-+available_signature_algs(undefined, _, _)  ->
-+    undefined;
-+available_signature_algs(SupportedHashSigns, {Major, Minor}, AllVersions) when Major >= 3 andalso Minor >= 3 ->
-+    case tls_record:lowest_protocol_version(AllVersions) of
-+	{3, 3} ->
-+	    #hash_sign_algos{hash_sign_algos = SupportedHashSigns};
-+	_ ->
-+	    undefined
-+    end;	
-+available_signature_algs(_, _, _) ->
-     undefined.
- 
- psk_secret(PSKIdentity, PSKLookup) ->
-@@ -2123,3 +2149,25 @@ distpoints_lookup([DistPoint | Rest], Callback, CRLDbHandle) ->
- 	CRLs ->
- 	    [{DistPoint, {CRL, public_key:der_decode('CertificateList', CRL)}} ||  CRL <- CRLs]
-     end.	
-+
-+cert_sign(?rsaEncryption) ->
-+    rsa;
-+cert_sign(?'id-ecPublicKey') ->
-+    ecdsa;
-+cert_sign(?'id-dsa') ->
-+    dsa;
-+cert_sign(Alg) ->
-+    {_, Sign} =public_key:pkix_sign_types(Alg),
-+    Sign.
-+
-+is_acceptable_hash_sign({_, Sign} = Algos, Sign, _, SupportedHashSigns) ->
-+    is_acceptable_hash_sign(Algos, SupportedHashSigns);
-+is_acceptable_hash_sign(Algos,_, KeyExAlgo, SupportedHashSigns) when KeyExAlgo == dh_ecdsa;
-+								     KeyExAlgo == ecdh_rsa;    
-+								     KeyExAlgo == ecdh_ecdsa ->
-+    is_acceptable_hash_sign(Algos, SupportedHashSigns); 
-+is_acceptable_hash_sign(_,_,_,_) ->
-+    false.
-+is_acceptable_hash_sign(Algos, SupportedHashSigns) ->
-+    lists:member(Algos, SupportedHashSigns).
-+
---- a/lib/ssl/src/ssl_handshake.hrl
-+++ b/lib/ssl/src/ssl_handshake.hrl
-@@ -95,7 +95,7 @@
- 
- -record(hello_extensions, {
- 	  renegotiation_info,
--	  hash_signs,          % supported combinations of hashes/signature algos
-+	  signature_algs,          % supported combinations of hashes/signature algos
-           alpn,
- 	  next_protocol_negotiation = undefined, % [binary()]
- 	  srp,
---- a/lib/ssl/src/ssl_internal.hrl
-+++ b/lib/ssl/src/ssl_internal.hrl
-@@ -135,7 +135,8 @@
- 	  padding_check = true       :: boolean(),
- 	  fallback = false           :: boolean(),
- 	  crl_check                  :: boolean() | peer | best_effort, 
--	  crl_cache
-+	  crl_cache,
-+	  signature_algs
- 	  }).
- 
- -record(socket_options,
---- a/lib/ssl/src/tls_connection.erl
-+++ b/lib/ssl/src/tls_connection.erl
-@@ -182,8 +182,7 @@ hello(start, #state{host = Host, port = Port, role = client,
-     next_state(hello, hello, Record, State);
- 
- hello(Hello = #client_hello{client_version = ClientVersion,
--			    extensions = #hello_extensions{hash_signs = HashSigns,
--							   ec_point_formats = EcPointFormats,
-+			    extensions = #hello_extensions{ec_point_formats = EcPointFormats,
- 							   elliptic_curves = EllipticCurves}},
-       State = #state{connection_states = ConnectionStates0,
- 		     port = Port, session = #session{own_certificate = Cert} = Session0,
-@@ -191,27 +190,28 @@ hello(Hello = #client_hello{client_version = ClientVersion,
- 		     session_cache = Cache,
- 		     session_cache_cb = CacheCb,
- 		     negotiated_protocol = CurrentProtocol,
-+		     key_algorithm = KeyExAlg,
- 		     ssl_options = SslOpts}) ->
-+
-     case tls_handshake:hello(Hello, SslOpts, {Port, Session0, Cache, CacheCb,
--					      ConnectionStates0, Cert}, Renegotiation) of
-+					      ConnectionStates0, Cert, KeyExAlg}, Renegotiation) of
-         #alert{} = Alert ->
-             handle_own_alert(Alert, ClientVersion, hello, State);
-         {Version, {Type, Session},
--	 ConnectionStates, Protocol0, ServerHelloExt} ->
--
-+	 ConnectionStates, Protocol0, ServerHelloExt, HashSign} ->
- 	    Protocol = case Protocol0 of
--		undefined -> CurrentProtocol;
--		_ -> Protocol0
--	    end,
--
--            HashSign = ssl_handshake:select_hashsign(HashSigns, Cert, Version),
--            ssl_connection:hello({common_client_hello, Type, ServerHelloExt, HashSign},
-+			   undefined -> CurrentProtocol;
-+			   _ -> Protocol0
-+		       end,
-+	    ssl_connection:hello({common_client_hello, Type, ServerHelloExt},
- 				 State#state{connection_states  = ConnectionStates,
- 					     negotiated_version = Version,
-+					     hashsign_algorithm = HashSign,
- 					     session = Session,
- 					     client_ecc = {EllipticCurves, EcPointFormats},
- 					     negotiated_protocol = Protocol}, ?MODULE)
-     end;
-+
- hello(Hello = #server_hello{},
-       #state{connection_states = ConnectionStates0,
- 	     negotiated_version = ReqVersion,
-@@ -1069,3 +1069,4 @@ handle_sni_extension(#client_hello{extensions = HelloExtensions}, State0) ->
-     end;
- handle_sni_extension(_, State0) ->
-     State0.
-+
---- a/lib/ssl/src/tls_handshake.erl
-+++ b/lib/ssl/src/tls_handshake.erl
-@@ -56,7 +56,7 @@ client_hello(Host, Port, ConnectionStates,
-     Version = tls_record:highest_protocol_version(Versions),
-     Pending = ssl_record:pending_connection_state(ConnectionStates, read),
-     SecParams = Pending#connection_state.security_parameters,
--    AvailableCipherSuites = ssl_handshake:available_suites(UserSuites, Version), 
-+    AvailableCipherSuites = ssl_handshake:available_suites(UserSuites, Version),     
-     Extensions = ssl_handshake:client_hello_extensions(Host, Version, 
- 						       AvailableCipherSuites,
- 						       SslOpts, ConnectionStates, Renegotiation),
-@@ -80,13 +80,13 @@ client_hello(Host, Port, ConnectionStates,
- -spec hello(#server_hello{} | #client_hello{}, #ssl_options{},
- 	    #connection_states{} | {inet:port_number(), #session{}, db_handle(),
- 				    atom(), #connection_states{}, 
--				    binary() | undefined},
-+				    binary() | undefined, ssl_cipher:key_algo()},
- 	    boolean()) ->
- 		   {tls_record:tls_version(), session_id(), 
- 		    #connection_states{}, alpn | npn, binary() | undefined}|
- 		   {tls_record:tls_version(), {resumed | new, #session{}}, 
- 		    #connection_states{}, binary() | undefined, 
--		    #hello_extensions{}} |
-+		    #hello_extensions{}, {ssl_cipher:hash(), ssl_cipher:sign_algo()} | undefined} |
- 		   #alert{}.
- %%
- %% Description: Handles a recieved hello message
-@@ -149,26 +149,35 @@ get_tls_handshake(Version, Data, Buffer) ->
- %%% Internal functions
- %%--------------------------------------------------------------------
- handle_client_hello(Version, #client_hello{session_id = SugesstedId,
--				       cipher_suites = CipherSuites,
--				       compression_methods = Compressions,
--				       random = Random,
--				       extensions = #hello_extensions{elliptic_curves = Curves} = HelloExt},
--		#ssl_options{versions = Versions} = SslOpts,
--	 {Port, Session0, Cache, CacheCb, ConnectionStates0, Cert}, Renegotiation) ->
-+					   cipher_suites = CipherSuites,
-+					   compression_methods = Compressions,
-+					   random = Random,
-+					   extensions = #hello_extensions{elliptic_curves = Curves,
-+									  signature_algs = ClientHashSigns} = HelloExt},
-+		    #ssl_options{versions = Versions,
-+				 signature_algs = SupportedHashSigns} = SslOpts,
-+		    {Port, Session0, Cache, CacheCb, ConnectionStates0, Cert, _}, Renegotiation) ->
-     case tls_record:is_acceptable_version(Version, Versions) of
- 	true ->
-+	    AvailableHashSigns = available_signature_algs(ClientHashSigns, SupportedHashSigns, Cert, Version),
- 	    ECCCurve = ssl_handshake:select_curve(Curves, ssl_handshake:supported_ecc(Version)),
- 	    {Type, #session{cipher_suite = CipherSuite} = Session1}
--		= ssl_handshake:select_session(SugesstedId, CipherSuites, Compressions,
-+		= ssl_handshake:select_session(SugesstedId, CipherSuites, AvailableHashSigns, Compressions,
- 					       Port, Session0#session{ecc = ECCCurve}, Version,
- 					       SslOpts, Cache, CacheCb, Cert),
- 	    case CipherSuite of 
- 		no_suite ->
- 		    ?ALERT_REC(?FATAL, ?INSUFFICIENT_SECURITY);
- 		_ ->
--		    handle_client_hello_extensions(Version, Type, Random, CipherSuites, HelloExt,
--						   SslOpts, Session1, ConnectionStates0,
--						   Renegotiation)
-+		    {KeyExAlg,_,_,_} = ssl_cipher:suite_definition(CipherSuite),
-+		    case ssl_handshake:select_hashsign(ClientHashSigns, Cert, KeyExAlg, SupportedHashSigns, Version) of
-+			#alert{} = Alert ->
-+			    Alert;
-+			HashSign ->
-+			    handle_client_hello_extensions(Version, Type, Random, CipherSuites, HelloExt,
-+							   SslOpts, Session1, ConnectionStates0,
-+							   Renegotiation, HashSign)
-+		    end
- 	    end;
- 	false ->
- 	    ?ALERT_REC(?FATAL, ?PROTOCOL_VERSION)
-@@ -245,14 +254,14 @@ enc_handshake(HandshakeMsg, Version) ->
- 
- 
- handle_client_hello_extensions(Version, Type, Random, CipherSuites,
--			HelloExt, SslOpts, Session0, ConnectionStates0, Renegotiation) ->
-+			HelloExt, SslOpts, Session0, ConnectionStates0, Renegotiation, HashSign) ->
-     try ssl_handshake:handle_client_hello_extensions(tls_record, Random, CipherSuites,
- 						     HelloExt, Version, SslOpts,
- 						     Session0, ConnectionStates0, Renegotiation) of
- 	#alert{} = Alert ->
- 	    Alert;
- 	{Session, ConnectionStates, Protocol, ServerHelloExt} ->
--	    {Version, {Type, Session}, ConnectionStates, Protocol, ServerHelloExt}
-+	    {Version, {Type, Session}, ConnectionStates, Protocol, ServerHelloExt, HashSign}
-     catch throw:Alert ->
- 	    Alert
-     end.
-@@ -269,3 +278,12 @@ handle_server_hello_extensions(Version, SessionId, Random, CipherSuite,
- 	    {Version, SessionId, ConnectionStates, ProtoExt, Protocol}
-     end.
- 
-+available_signature_algs(undefined, SupportedHashSigns, _, {Major, Minor}) when (Major < 3) andalso (Minor < 3) ->
-+    SupportedHashSigns;
-+available_signature_algs(#hash_sign_algos{hash_sign_algos = ClientHashSigns}, SupportedHashSigns, 
-+		     _, {Major, Minor}) when (Major < 3) andalso (Minor < 3) ->
-+    ordsets:intersection(ClientHashSigns, SupportedHashSigns);
-+available_signature_algs(_, _, _, _) -> 
-+    undefined.
-+
-+
---- a/lib/ssl/src/tls_v1.erl
-+++ b/lib/ssl/src/tls_v1.erl
-@@ -31,7 +31,8 @@
- 
- -export([master_secret/4, finished/5, certificate_verify/3, mac_hash/7,
- 	 setup_keys/8, suites/1, prf/5,
--	 ecc_curves/1, oid_to_enum/1, enum_to_oid/1]).
-+	 ecc_curves/1, oid_to_enum/1, enum_to_oid/1, 
-+	 default_signature_algs/1, signature_algs/2]).
- 
- %%====================================================================
- %% Internal application API
-@@ -258,6 +259,54 @@ suites(3) ->
-     ] ++ suites(2).
- 
- 
-+
-+signature_algs({3, 3}, HashSigns) ->
-+    CryptoSupports =  crypto:supports(),
-+    Hashes = proplists:get_value(hashs, CryptoSupports),
-+    PubKeys = proplists:get_value(public_keys, CryptoSupports),
-+    Supported = lists:foldl(fun({Hash, dsa = Sign} = Alg, Acc) ->
-+				    case proplists:get_bool(dss, PubKeys) 
-+					andalso proplists:get_bool(Hash, Hashes)
-+					andalso is_pair(Hash, Sign, Hashes)
-+				    of
-+					true ->
-+					    [Alg | Acc];
-+					false ->
-+					    Acc
-+				    end;
-+			       ({Hash, Sign} = Alg, Acc) -> 
-+				    case proplists:get_bool(Sign, PubKeys) 
-+					andalso proplists:get_bool(Hash, Hashes) 
-+					andalso is_pair(Hash, Sign, Hashes)
-+				    of
-+					true ->
-+					    [Alg | Acc];
-+					false ->
-+					    Acc
-+				    end
-+			    end, [], HashSigns),
-+    lists:reverse(Supported).
-+
-+default_signature_algs({3, 3} = Version) ->
-+    Default = [%% SHA2
-+	       {sha512, ecdsa},
-+	       {sha512, rsa},
-+	       {sha384, ecdsa},
-+	       {sha384, rsa},
-+	       {sha256, ecdsa},
-+	       {sha256, rsa},
-+	       {sha224, ecdsa},
-+	       {sha224, rsa},
-+	       %% SHA
-+	       {sha, ecdsa},
-+	       {sha, rsa},
-+	       {sha, dsa},
-+	       %% MD5
-+	       {md5, rsa}],
-+    signature_algs(Version, Default);
-+default_signature_algs(_) ->
-+    undefined.
-+
- %%--------------------------------------------------------------------
- %%% Internal functions
- %%--------------------------------------------------------------------
-@@ -342,6 +391,17 @@ finished_label(client) ->
- finished_label(server) ->
-     <<"server finished">>.
- 
-+is_pair(sha, dsa, _) ->
-+    true;
-+is_pair(_, dsa, _) ->
-+    false;
-+is_pair(Hash, ecdsa, Hashs) ->
-+    AtLeastSha = Hashs -- [md2,md4,md5],
-+    lists:member(Hash, AtLeastSha);
-+is_pair(Hash, rsa, Hashs) ->
-+    AtLeastMd5 = Hashs -- [md2,md4],
-+    lists:member(Hash, AtLeastMd5).
-+
- %% list ECC curves in prefered order
- ecc_curves(_Minor) ->
-     TLSCurves = [sect571r1,sect571k1,secp521r1,brainpoolP512r1,
---- a/lib/ssl/test/ssl_basic_SUITE.erl
-+++ b/lib/ssl/test/ssl_basic_SUITE.erl
-@@ -58,7 +58,7 @@ all() ->
- groups() ->
-     [{basic, [], basic_tests()},
-      {options, [], options_tests()},
--     {'tlsv1.2', [], all_versions_groups()},
-+     {'tlsv1.2', [], all_versions_groups() ++ [conf_signature_algs, no_common_signature_algs]},
-      {'tlsv1.1', [], all_versions_groups()},
-      {'tlsv1', [], all_versions_groups() ++ rizzo_tests()},
-      {'sslv3', [], all_versions_groups() ++ rizzo_tests() ++ [ciphersuite_vs_version]},
-@@ -168,6 +168,7 @@ renegotiate_tests() ->
- 
- cipher_tests() ->
-     [cipher_suites,
-+     cipher_suites_mix,
-      ciphers_rsa_signed_certs,
-      ciphers_rsa_signed_certs_openssl_names,
-      ciphers_dsa_signed_certs,
-@@ -445,7 +446,7 @@ connection_info(Config) when is_list(Config) ->
- 			   {from, self()}, 
- 			   {mfa, {?MODULE, connection_info_result, []}},
- 			   {options, 
--			    [{ciphers,[{rsa,des_cbc,sha,no_export}]} | 
-+			    [{ciphers,[{rsa,des_cbc,sha}]} | 
- 			     ClientOpts]}]),
-     
-     ct:log("Testcase ~p, Client ~p  Server ~p ~n",
-@@ -911,6 +912,31 @@ cipher_suites(Config) when is_list(Config) ->
-     [_|_] =ssl:cipher_suites(openssl).
- 
- %%--------------------------------------------------------------------
-+cipher_suites_mix() ->
-+    [{doc,"Test to have old and new cipher suites at the same time"}].
-+
-+cipher_suites_mix(Config) when is_list(Config) -> 
-+    CipherSuites = [{ecdh_rsa,aes_128_cbc,sha256,sha256}, {rsa,aes_128_cbc,sha}],
-+    ClientOpts = ?config(client_opts, Config),
-+    ServerOpts = ?config(server_opts, Config),
-+
-+    {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
-+
-+    Server = ssl_test_lib:start_server([{node, ServerNode}, {port, 0},
-+					{from, self()},
-+					{mfa, {ssl_test_lib, send_recv_result_active, []}},
-+					{options, ServerOpts}]),
-+    Port = ssl_test_lib:inet_port(Server),
-+    Client = ssl_test_lib:start_client([{node, ClientNode}, {port, Port},
-+					{host, Hostname},
-+					{from, self()},
-+					{mfa, {ssl_test_lib, send_recv_result_active, []}},
-+					{options, [{ciphers, CipherSuites} | ClientOpts]}]),
-+
-+    ssl_test_lib:check_result(Server, ok, Client, ok),
-+    ssl_test_lib:close(Server),
-+    ssl_test_lib:close(Client).
-+%%--------------------------------------------------------------------
- socket_options() ->
-     [{doc,"Test API function getopts/2 and setopts/2"}].
- 
-@@ -2876,7 +2902,61 @@ ciphersuite_vs_version(Config) when is_list(Config) ->
- 	_ ->
- 	    ct:fail({unexpected_server_hello, ServerHello})
-     end.
--										
-+			
-+%%--------------------------------------------------------------------
-+conf_signature_algs() ->
-+    [{doc,"Test to set the signature_algs option on both client and server"}].
-+conf_signature_algs(Config) when is_list(Config) -> 
-+    ClientOpts = ?config(client_opts, Config),
-+    ServerOpts = ?config(server_opts, Config),
-+    {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
-+    Server = 
-+	ssl_test_lib:start_server([{node, ServerNode}, {port, 0}, 
-+				   {from, self()}, 
-+				   {mfa, {ssl_test_lib, send_recv_result, []}},
-+				   {options,  [{active, false}, {signature_algs, [{sha256, rsa}]} | ServerOpts]}]),
-+    Port = ssl_test_lib:inet_port(Server),
-+    Client = 
-+	ssl_test_lib:start_client([{node, ClientNode}, {port, Port}, 
-+				   {host, Hostname},
-+				   {from, self()}, 
-+				   {mfa, {ssl_test_lib, send_recv_result, []}},
-+				   {options, [{active, false}, {signature_algs, [{sha256, rsa}]} | ClientOpts]}]),
-+    
-+    ct:log("Testcase ~p, Client ~p  Server ~p ~n",
-+			 [self(), Client, Server]),
-+    
-+    ssl_test_lib:check_result(Server, ok, Client, ok),
-+    
-+    ssl_test_lib:close(Server),
-+    ssl_test_lib:close(Client).
-+
-+
-+%%--------------------------------------------------------------------
-+no_common_signature_algs()  ->
-+    [{doc,"Set the signature_algs option so that there client and server does not share any hash sign algorithms"}].
-+no_common_signature_algs(Config) when is_list(Config) ->
-+    
-+    ClientOpts = ?config(client_opts, Config),
-+    ServerOpts = ?config(server_opts, Config),
-+
-+    {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
-+
-+
-+    Server = ssl_test_lib:start_server_error([{node, ServerNode}, {port, 0},
-+					      {from, self()},
-+					      {options, [{signature_algs, [{sha256, rsa}]}
-+							 | ServerOpts]}]),
-+    Port = ssl_test_lib:inet_port(Server),
-+    Client = ssl_test_lib:start_client_error([{node, ClientNode}, {port, Port},
-+					      {host, Hostname},
-+					      {from, self()}, 
-+					      {options, [{signature_algs, [{sha384, rsa}]}
-+							 | ClientOpts]}]),
-+    
-+    ssl_test_lib:check_result(Server, {error, {tls_alert, "insufficient security"}},
-+			      Client, {error, {tls_alert, "insufficient security"}}).
-+    						
- %%--------------------------------------------------------------------
- 
- dont_crash_on_handshake_garbage() ->
---- a/lib/ssl/test/ssl_handshake_SUITE.erl
-+++ b/lib/ssl/test/ssl_handshake_SUITE.erl
-@@ -166,10 +166,10 @@ ignore_hassign_extension_pre_tls_1_2(Config) ->
-     CertFile = proplists:get_value(certfile, Opts),
-     [{_, Cert, _}] = ssl_test_lib:pem_to_der(CertFile),
-     HashSigns = #hash_sign_algos{hash_sign_algos = [{sha512, rsa}, {sha, dsa}]},
--    {sha512, rsa} = ssl_handshake:select_hashsign(HashSigns, Cert, {3,3}),
-+    {sha512, rsa} = ssl_handshake:select_hashsign(HashSigns, Cert, ecdhe_rsa, tls_v1:default_signature_algs({3,3}), {3,3}),
-     %%% Ignore
--    {md5sha, rsa} = ssl_handshake:select_hashsign(HashSigns, Cert, {3,2}),
--    {md5sha, rsa} = ssl_handshake:select_hashsign(HashSigns, Cert, {3,0}).
-+    {md5sha, rsa} = ssl_handshake:select_hashsign(HashSigns, Cert, ecdhe_rsa, tls_v1:default_signature_algs({3,2}), {3,2}),
-+    {md5sha, rsa} = ssl_handshake:select_hashsign(HashSigns, Cert, ecdhe_rsa, tls_v1:default_signature_algs({3,0}), {3,0}).
- 
- is_supported(Hash) ->
-     Algos = crypto:supports(),
---- a/lib/ssl/test/ssl_test_lib.erl
-+++ b/lib/ssl/test/ssl_test_lib.erl
-@@ -905,8 +905,8 @@ anonymous_suites() ->
- 	 {dh_anon, '3des_ede_cbc', sha},
- 	 {dh_anon, aes_128_cbc, sha},
- 	 {dh_anon, aes_256_cbc, sha},
--	 {dh_anon, aes_128_gcm, null},
--	 {dh_anon, aes_256_gcm, null},
-+	 {dh_anon, aes_128_gcm, null, sha256},
-+	 {dh_anon, aes_256_gcm, null, sha384},
- 	 {ecdh_anon,rc4_128,sha},
- 	 {ecdh_anon,'3des_ede_cbc',sha},
- 	 {ecdh_anon,aes_128_cbc,sha},
-@@ -933,12 +933,12 @@ psk_suites() ->
- 	 {rsa_psk, aes_256_cbc, sha},
- 	 {rsa_psk, aes_128_cbc, sha256},
- 	 {rsa_psk, aes_256_cbc, sha384},
--	 {psk, aes_128_gcm, null},
--	 {psk, aes_256_gcm, null},
--	 {dhe_psk, aes_128_gcm, null},
--	 {dhe_psk, aes_256_gcm, null},
--	 {rsa_psk, aes_128_gcm, null},
--	 {rsa_psk, aes_256_gcm, null}],
-+	 {psk, aes_128_gcm, null, sha256},
-+	 {psk, aes_256_gcm, null, sha384},
-+	 {dhe_psk, aes_128_gcm, null, sha256},
-+	 {dhe_psk, aes_256_gcm, null, sha384},
-+	 {rsa_psk, aes_128_gcm, null, sha256},
-+	 {rsa_psk, aes_256_gcm, null, sha384}],
-     ssl_cipher:filter_suites(Suites).
- 
- psk_anon_suites() ->
---- a/lib/ssl/vsn.mk
-+++ b/lib/ssl/vsn.mk
-@@ -1 +1 @@
--SSL_VSN = 7.3
-+SSL_VSN = 7.3.1
---- a/otp_versions.table
-+++ b/otp_versions.table
-@@ -1,3 +1,5 @@
-+OTP-18.3.2 : inets-6.2.2 ssl-7.3.1 # asn1-4.0.2 common_test-1.12 compiler-6.0.3 cosEvent-2.2 cosEventDomain-1.2 cosFileTransfer-1.2 cosNotification-1.2.1 cosProperty-1.2 cosTime-1.2.1 cosTransactions-1.3.1 crypto-3.6.3 debugger-4.1.2 dialyzer-2.9 diameter-1.11.2 edoc-0.7.18 eldap-1.2.1 erl_docgen-0.4.2 erl_interface-3.8.2 erts-7.3.1 et-1.5.1 eunit-2.2.13 gs-1.6 hipe-3.15 ic-4.4 jinterface-1.6.1 kernel-4.2 megaco-3.18 mnesia-4.13.4 observer-2.1.2 odbc-2.11.1 orber-3.8.1 os_mon-2.4 ose-1.1 otp_mibs-1.1 parsetools-2.1.1 percept-0.8.11 public_key-1.1.1 reltool-0.7 runtime_tools-1.9.3 sasl-2.7 snmp-5.2.2 ssh-4.2.2 stdlib-2.8 syntax_tools-1.7 test_server-3.10 tools-2.8.3 typer-0.9.10 webtool-0.9.1 wx-1.6.1 xmerl-1.3.10 :
-+OTP-18.3.1 : erts-7.3.1 inets-6.2.1 mnesia-4.13.4 # asn1-4.0.2 common_test-1.12 compiler-6.0.3 cosEvent-2.2 cosEventDomain-1.2 cosFileTransfer-1.2 cosNotification-1.2.1 cosProperty-1.2 cosTime-1.2.1 cosTransactions-1.3.1 crypto-3.6.3 debugger-4.1.2 dialyzer-2.9 diameter-1.11.2 edoc-0.7.18 eldap-1.2.1 erl_docgen-0.4.2 erl_interface-3.8.2 et-1.5.1 eunit-2.2.13 gs-1.6 hipe-3.15 ic-4.4 jinterface-1.6.1 kernel-4.2 megaco-3.18 observer-2.1.2 odbc-2.11.1 orber-3.8.1 os_mon-2.4 ose-1.1 otp_mibs-1.1 parsetools-2.1.1 percept-0.8.11 public_key-1.1.1 reltool-0.7 runtime_tools-1.9.3 sasl-2.7 snmp-5.2.2 ssh-4.2.2 ssl-7.3 stdlib-2.8 syntax_tools-1.7 test_server-3.10 tools-2.8.3 typer-0.9.10 webtool-0.9.1 wx-1.6.1 xmerl-1.3.10 :
- OTP-18.3 : asn1-4.0.2 common_test-1.12 compiler-6.0.3 cosNotification-1.2.1 cosTime-1.2.1 cosTransactions-1.3.1 crypto-3.6.3 debugger-4.1.2 dialyzer-2.9 diameter-1.11.2 edoc-0.7.18 eldap-1.2.1 erl_docgen-0.4.2 erl_interface-3.8.2 erts-7.3 eunit-2.2.13 hipe-3.15 inets-6.2 kernel-4.2 mnesia-4.13.3 observer-2.1.2 orber-3.8.1 public_key-1.1.1 runtime_tools-1.9.3 sasl-2.7 snmp-5.2.2 ssh-4.2.2 ssl-7.3 stdlib-2.8 test_server-3.10 tools-2.8.3 webtool-0.9.1 wx-1.6.1 xmerl-1.3.10 # cosEvent-2.2 cosEventDomain-1.2 cosFileTransfer-1.2 cosProperty-1.2 et-1.5.1 gs-1.6 ic-4.4 jinterface-1.6.1 megaco-3.18 odbc-2.11.1 os_mon-2.4 ose-1.1 otp_mibs-1.1 parsetools-2.1.1 percept-0.8.11 reltool-0.7 syntax_tools-1.7 typer-0.9.10 :
- OTP-18.2.4 : common_test-1.11.2 # asn1-4.0.1 compiler-6.0.2 cosEvent-2.2 cosEventDomain-1.2 cosFileTransfer-1.2 cosNotification-1.2 cosProperty-1.2 cosTime-1.2 cosTransactions-1.3 crypto-3.6.2 debugger-4.1.1 dialyzer-2.8.2 diameter-1.11.1 edoc-0.7.17 eldap-1.2 erl_docgen-0.4.1 erl_interface-3.8.1 erts-7.2.1 et-1.5.1 eunit-2.2.12 gs-1.6 hipe-3.14 ic-4.4 inets-6.1.1 jinterface-1.6.1 kernel-4.1.1 megaco-3.18 mnesia-4.13.2 observer-2.1.1 odbc-2.11.1 orber-3.8 os_mon-2.4 ose-1.1 otp_mibs-1.1 parsetools-2.1.1 percept-0.8.11 public_key-1.1 reltool-0.7 runtime_tools-1.9.2 sasl-2.6.1 snmp-5.2.1 ssh-4.2.1 ssl-7.2 stdlib-2.7 syntax_tools-1.7 test_server-3.9.1 tools-2.8.2 typer-0.9.10 webtool-0.9 wx-1.6 xmerl-1.3.9 :
- OTP-18.2.3 : inets-6.1.1 # asn1-4.0.1 common_test-1.11.1 compiler-6.0.2 cosEvent-2.2 cosEventDomain-1.2 cosFileTransfer-1.2 cosNotification-1.2 cosProperty-1.2 cosTime-1.2 cosTransactions-1.3 crypto-3.6.2 debugger-4.1.1 dialyzer-2.8.2 diameter-1.11.1 edoc-0.7.17 eldap-1.2 erl_docgen-0.4.1 erl_interface-3.8.1 erts-7.2.1 et-1.5.1 eunit-2.2.12 gs-1.6 hipe-3.14 ic-4.4 jinterface-1.6.1 kernel-4.1.1 megaco-3.18 mnesia-4.13.2 observer-2.1.1 odbc-2.11.1 orber-3.8 os_mon-2.4 ose-1.1 otp_mibs-1.1 parsetools-2.1.1 percept-0.8.11 public_key-1.1 reltool-0.7 runtime_tools-1.9.2 sasl-2.6.1 snmp-5.2.1 ssh-4.2.1 ssl-7.2 stdlib-2.7 syntax_tools-1.7 test_server-3.9.1 tools-2.8.2 typer-0.9.10 webtool-0.9 wx-1.6 xmerl-1.3.9 :
-@@ -14,6 +16,7 @@ OTP-18.0.3 : erts-7.0.3 # asn1-4.0 common_test-1.11 compiler-6.0 cosEvent-2.2 co
- OTP-18.0.2 : erts-7.0.2 runtime_tools-1.9.1 # asn1-4.0 common_test-1.11 compiler-6.0 cosEvent-2.2 cosEventDomain-1.2 cosFileTransfer-1.2 cosNotification-1.2 cosProperty-1.2 cosTime-1.2 cosTransactions-1.3 crypto-3.6 debugger-4.1 dialyzer-2.8 diameter-1.10 edoc-0.7.17 eldap-1.2 erl_docgen-0.4 erl_interface-3.8 et-1.5.1 eunit-2.2.10 gs-1.6 hipe-3.12 ic-4.4 inets-6.0 jinterface-1.6 kernel-4.0 megaco-3.18 mnesia-4.13 observer-2.1 odbc-2.11 orber-3.8 os_mon-2.4 ose-1.1 otp_mibs-1.1 parsetools-2.1 percept-0.8.11 public_key-1.0 reltool-0.7 sasl-2.5 snmp-5.2 ssh-4.0 ssl-7.0 stdlib-2.5 syntax_tools-1.7 test_server-3.9 tools-2.8 typer-0.9.9 webtool-0.9 wx-1.4 xmerl-1.3.8 :
- OTP-18.0.1 : erts-7.0.1 # asn1-4.0 common_test-1.11 compiler-6.0 cosEvent-2.2 cosEventDomain-1.2 cosFileTransfer-1.2 cosNotification-1.2 cosProperty-1.2 cosTime-1.2 cosTransactions-1.3 crypto-3.6 debugger-4.1 dialyzer-2.8 diameter-1.10 edoc-0.7.17 eldap-1.2 erl_docgen-0.4 erl_interface-3.8 et-1.5.1 eunit-2.2.10 gs-1.6 hipe-3.12 ic-4.4 inets-6.0 jinterface-1.6 kernel-4.0 megaco-3.18 mnesia-4.13 observer-2.1 odbc-2.11 orber-3.8 os_mon-2.4 ose-1.1 otp_mibs-1.1 parsetools-2.1 percept-0.8.11 public_key-1.0 reltool-0.7 runtime_tools-1.9 sasl-2.5 snmp-5.2 ssh-4.0 ssl-7.0 stdlib-2.5 syntax_tools-1.7 test_server-3.9 tools-2.8 typer-0.9.9 webtool-0.9 wx-1.4 xmerl-1.3.8 :
- OTP-18.0 : asn1-4.0 common_test-1.11 compiler-6.0 cosEvent-2.2 cosEventDomain-1.2 cosFileTransfer-1.2 cosNotification-1.2 cosProperty-1.2 cosTime-1.2 cosTransactions-1.3 crypto-3.6 debugger-4.1 dialyzer-2.8 diameter-1.10 edoc-0.7.17 eldap-1.2 erl_docgen-0.4 erl_interface-3.8 erts-7.0 et-1.5.1 eunit-2.2.10 gs-1.6 hipe-3.12 ic-4.4 inets-6.0 jinterface-1.6 kernel-4.0 megaco-3.18 mnesia-4.13 observer-2.1 odbc-2.11 orber-3.8 os_mon-2.4 ose-1.1 otp_mibs-1.1 parsetools-2.1 percept-0.8.11 public_key-1.0 reltool-0.7 runtime_tools-1.9 sasl-2.5 snmp-5.2 ssh-4.0 ssl-7.0 stdlib-2.5 syntax_tools-1.7 test_server-3.9 tools-2.8 typer-0.9.9 webtool-0.9 wx-1.4 xmerl-1.3.8 # :
-+OTP-17.5.6.9 : diameter-1.9.2.4 erts-6.4.1.6 ssl-6.0.1.2 # asn1-3.0.4 common_test-1.10.1 compiler-5.0.4 cosEvent-2.1.15 cosEventDomain-1.1.14 cosFileTransfer-1.1.16 cosNotification-1.1.21 cosProperty-1.1.17 cosTime-1.1.14 cosTransactions-1.2.14 crypto-3.5 debugger-4.0.3.1 dialyzer-2.7.4 edoc-0.7.16 eldap-1.1.1 erl_docgen-0.3.7 erl_interface-3.7.20 et-1.5 eunit-2.2.9 gs-1.5.16 hipe-3.11.3 ic-4.3.6 inets-5.10.9 jinterface-1.5.12 kernel-3.2.0.1 megaco-3.17.3 mnesia-4.12.5 observer-2.0.4 odbc-2.10.22 orber-3.7.1 os_mon-2.3.1 ose-1.0.2 otp_mibs-1.0.10 parsetools-2.0.12 percept-0.8.10 public_key-0.23 reltool-0.6.6 runtime_tools-1.8.16.1 sasl-2.4.1 snmp-5.1.2 ssh-3.2.4 stdlib-2.4 syntax_tools-1.6.18 test_server-3.8.1 tools-2.7.2 typer-0.9.8 webtool-0.8.10 wx-1.3.3 xmerl-1.3.7 :
- OTP-17.5.6.8 : diameter-1.9.2.3 # asn1-3.0.4 common_test-1.10.1 compiler-5.0.4 cosEvent-2.1.15 cosEventDomain-1.1.14 cosFileTransfer-1.1.16 cosNotification-1.1.21 cosProperty-1.1.17 cosTime-1.1.14 cosTransactions-1.2.14 crypto-3.5 debugger-4.0.3.1 dialyzer-2.7.4 edoc-0.7.16 eldap-1.1.1 erl_docgen-0.3.7 erl_interface-3.7.20 erts-6.4.1.5 et-1.5 eunit-2.2.9 gs-1.5.16 hipe-3.11.3 ic-4.3.6 inets-5.10.9 jinterface-1.5.12 kernel-3.2.0.1 megaco-3.17.3 mnesia-4.12.5 observer-2.0.4 odbc-2.10.22 orber-3.7.1 os_mon-2.3.1 ose-1.0.2 otp_mibs-1.0.10 parsetools-2.0.12 percept-0.8.10 public_key-0.23 reltool-0.6.6 runtime_tools-1.8.16.1 sasl-2.4.1 snmp-5.1.2 ssh-3.2.4 ssl-6.0.1.1 stdlib-2.4 syntax_tools-1.6.18 test_server-3.8.1 tools-2.7.2 typer-0.9.8 webtool-0.8.10 wx-1.3.3 xmerl-1.3.7 :
- OTP-17.5.6.7 : diameter-1.9.2.2 # asn1-3.0.4 common_test-1.10.1 compiler-5.0.4 cosEvent-2.1.15 cosEventDomain-1.1.14 cosFileTransfer-1.1.16 cosNotification-1.1.21 cosProperty-1.1.17 cosTime-1.1.14 cosTransactions-1.2.14 crypto-3.5 debugger-4.0.3.1 dialyzer-2.7.4 edoc-0.7.16 eldap-1.1.1 erl_docgen-0.3.7 erl_interface-3.7.20 erts-6.4.1.5 et-1.5 eunit-2.2.9 gs-1.5.16 hipe-3.11.3 ic-4.3.6 inets-5.10.9 jinterface-1.5.12 kernel-3.2.0.1 megaco-3.17.3 mnesia-4.12.5 observer-2.0.4 odbc-2.10.22 orber-3.7.1 os_mon-2.3.1 ose-1.0.2 otp_mibs-1.0.10 parsetools-2.0.12 percept-0.8.10 public_key-0.23 reltool-0.6.6 runtime_tools-1.8.16.1 sasl-2.4.1 snmp-5.1.2 ssh-3.2.4 ssl-6.0.1.1 stdlib-2.4 syntax_tools-1.6.18 test_server-3.8.1 tools-2.7.2 typer-0.9.8 webtool-0.8.10 wx-1.3.3 xmerl-1.3.7 :
- OTP-17.5.6.6 : erts-6.4.1.5 # asn1-3.0.4 common_test-1.10.1 compiler-5.0.4 cosEvent-2.1.15 cosEventDomain-1.1.14 cosFileTransfer-1.1.16 cosNotification-1.1.21 cosProperty-1.1.17 cosTime-1.1.14 cosTransactions-1.2.14 crypto-3.5 debugger-4.0.3.1 dialyzer-2.7.4 diameter-1.9.2.1 edoc-0.7.16 eldap-1.1.1 erl_docgen-0.3.7 erl_interface-3.7.20 et-1.5 eunit-2.2.9 gs-1.5.16 hipe-3.11.3 ic-4.3.6 inets-5.10.9 jinterface-1.5.12 kernel-3.2.0.1 megaco-3.17.3 mnesia-4.12.5 observer-2.0.4 odbc-2.10.22 orber-3.7.1 os_mon-2.3.1 ose-1.0.2 otp_mibs-1.0.10 parsetools-2.0.12 percept-0.8.10 public_key-0.23 reltool-0.6.6 runtime_tools-1.8.16.1 sasl-2.4.1 snmp-5.1.2 ssh-3.2.4 ssl-6.0.1.1 stdlib-2.4 syntax_tools-1.6.18 test_server-3.8.1 tools-2.7.2 typer-0.9.8 webtool-0.8.10 wx-1.3.3 xmerl-1.3.7 :
diff --git a/community/erlang/APKBUILD b/community/erlang/APKBUILD
index 34424f4..b968b9d 100644
--- a/community/erlang/APKBUILD
+++ b/community/erlang/APKBUILD
@@ -2,8 +2,8 @@
 # Maintainer: Marlus Saraiva <[email-masked]>
 
 pkgname=erlang
-pkgver=18.3.2
-_srcver=18.3
+pkgver=19.0.1
+_srcver=19.0
 pkgrel=0
 pkgdesc="General-purpose programming language and runtime environment"
 url="http://www.erlang.org/"
@@ -46,7 +46,6 @@ subpackages="$pkgname-dev
 	     $pkgname-odbc:odbc
 	     $pkgname-orber:orber
 	     $pkgname-os-mon:os_mon
-	     $pkgname-ose:ose
 	     $pkgname-otp-mibs:otp_mibs
 	     $pkgname-parsetools:parsetools
 	     $pkgname-percept:percept
@@ -59,23 +58,13 @@ subpackages="$pkgname-dev
 	     $pkgname-ssl:ssl
 	     $pkgname-stdlib:stdlib
 	     $pkgname-syntax-tools:syntax_tools
-	     $pkgname-test-server:test_server
 	     $pkgname-tools:tools
 	     $pkgname-typer:typer
-	     $pkgname-webtool:webtool
 	     $pkgname-xmerl:xmerl"
-# Patches 0001-0007 found: http://pkgs.fedoraproject.org/gitweb/?p=erlang.git;a=tree
 source="http://www.erlang.org/download/otp_src_$_srcver.tar.gz
-        0001-Do-not-format-man-pages-and-do-not-install-miscellan.patch
-        0002-Remove-rpath.patch
-        0003-Do-not-install-C-sources.patch
-        0004-Do-not-install-Java-sources.patch
         0005-Do-not-install-nteventlog-and-related-doc-files-on-n.patch
-        0006-Do-not-install-erlang-sources.patch
-        0007-Split-off-webtool-dependency-from-tools.patch
         0010-fix-nteventlog-remove.patch
-        0060-set-disksup_posix_only-to-true.patch
-        0070-otp-update-version-18.3.2.patch"
+        0015-otp-update-version-19.0.1.patch"
 
 _builddir="$srcdir"/otp_src_$_srcver
 
@@ -119,6 +108,7 @@ _mv_erlang_lib() {
 	depends="$pkgname"
 
 	mkdir -p "$subpkgdir"/usr/lib/erlang/lib
+        rm -f "$pkgdir"/usr/lib/erlang/lib/$lib-*/src/*.erl
 	mv "$pkgdir"/usr/lib/erlang/lib/$lib-* "$subpkgdir"/usr/lib/erlang/lib/
 }
 
@@ -155,7 +145,6 @@ observer() { _mv_erlang_lib observer; }
 odbc() { _mv_erlang_lib odbc; }
 orber() { _mv_erlang_lib orber; }
 os_mon() { _mv_erlang_lib os_mon; }
-ose() { _mv_erlang_lib ose; }
 otp_mibs() { _mv_erlang_lib otp_mibs; }
 parsetools() { _mv_erlang_lib parsetools; }
 percept() { _mv_erlang_lib percept; }
@@ -168,10 +157,8 @@ ssh() { _mv_erlang_lib ssh; }
 ssl() { _mv_erlang_lib ssl; }
 stdlib() { _mv_erlang_lib stdlib; }
 syntax_tools() { _mv_erlang_lib syntax_tools; }
-test_server() { _mv_erlang_lib test_server; }
 tools() { _mv_erlang_lib tools; }
 typer() { _mv_erlang_lib typer; }
-webtool() { _mv_erlang_lib webtool; }
 xmerl() { _mv_erlang_lib xmerl; }
 
 dev() {
@@ -209,36 +196,15 @@ dev() {
 }

-md5sums="7e4ff32f97c36fb3dab736f8d481830b  otp_src_18.3.tar.gz
-11d2bfea3dd3138409337d62f2348ff2  0001-Do-not-format-man-pages-and-do-not-install-miscellan.patch
-ef4b726309a749010553259080960753  0002-Remove-rpath.patch
-458118f96fb0c973a30630c070bd94aa  0003-Do-not-install-C-sources.patch
-1c3b158ac8408fced9a0f3630f4498f1  0004-Do-not-install-Java-sources.patch
+md5sums="f64eefc697d47193444aa224d971f367  otp_src_19.0.tar.gz
 f4aa0cc27dc57ea4dcd57191b1948a4d  0005-Do-not-install-nteventlog-and-related-doc-files-on-n.patch
-a8e9e58c2444ac3994a6b418fd387369  0006-Do-not-install-erlang-sources.patch
-b438c37818b5c82443682c3693dd7e53  0007-Split-off-webtool-dependency-from-tools.patch
 0dd300003ff68fc46dc3c839c2541d53  0010-fix-nteventlog-remove.patch
-d17fbaafa9f7820ade09b239c00aede6  0060-set-disksup_posix_only-to-true.patch
-b0d5cf3bac335964a1c8ffd98d9f105d  0070-otp-update-version-18.3.2.patch"
-sha256sums="fdab8129a1cb935db09f1832e3a7d511a4aeb2b9bb3602ca6a7ccb9730d5c9c3  otp_src_18.3.tar.gz
-536e78192f915733cbbb264883af6d9b11c9e70c2c4d3d825b58c4dbec36db86  0001-Do-not-format-man-pages-and-do-not-install-miscellan.patch
-b2e5844215d7f5f5026a77342dd698d16103cc726d23f8265bcc8399d1a82bb9  0002-Remove-rpath.patch
-81062f0eb9a72cbfac600fab56823161f92e1e5107b359f27f9f0ec511b8aec5  0003-Do-not-install-C-sources.patch
-2ed61274decb534ab4142bd0a2116a75e3fe82d33a8ff145524173ce5773b0e2  0004-Do-not-install-Java-sources.patch
+d706bb0d2b3fbd937c6a0e3e54a15dee  0015-otp-update-version-19.0.1.patch"
+sha256sums="3fdc27a2a826e7f3d9cda43302d27d98704d6b41ce29a8a5df747a161da53bb1  otp_src_19.0.tar.gz
 71c8a55fe036d5a04ba2c008b51d8950c3f18d83edaffb9bef2a9d19dd2f79f3  0005-Do-not-install-nteventlog-and-related-doc-files-on-n.patch
-fcf2c37b3eaddd3e1bea2880c1b80f010623743ab2f43e144e0ecc7be874d4ff  0006-Do-not-install-erlang-sources.patch
-9704a53bc4bd6f5624f9ce3f201128204011f4579f19b547df74d92ae22777cf  0007-Split-off-webtool-dependency-from-tools.patch
 019c62ea3fee60068caa8c3152d7f96e76591fc5dc096abfcea48ec1593eb758  0010-fix-nteventlog-remove.patch
-3ffda0b3acbde755b496c1a974c20e1ca580432c403944c1c16836f48e248429  0060-set-disksup_posix_only-to-true.patch
-ec32540b798d2b3a7b8271cf95c63423dda864b24c8765368835295bf4575c61  0070-otp-update-version-18.3.2.patch"
-sha512sums="f4a69bb14743d9f913d7060cfb6426f7c54693d07ed439506ede5160a0ba5a79a81cf08a56aaa02c68b3377cd22fed66a0fbeb216378330d7ad5c6348ed82014  otp_src_18.3.tar.gz
-172f9b0f61748bf2f04737df0451bcc9c0812db0f365f0ef7c7c244fceb991987f79a5274eea578a89cc7d077f84645d1395d9dbcbf14010268b896a080c2ccf  0001-Do-not-format-man-pages-and-do-not-install-miscellan.patch
-97c40c185b71b23ffcb924639af390b9a0be897070e396a9413e193e6d43048dfe3b86bcd0c5598b81a66ce1349de9e09f5228a452b51b6612cd947bbafb6377  0002-Remove-rpath.patch
-1cae89d1e8f9d375ae08c7de2b8f7a5143bcded90eef878e97c408542a50e9a880166311820013301e46364be0ae090d3fc515b6f915ead14e787b98290beec1  0003-Do-not-install-C-sources.patch
-b174e3c9103aa26e3b4993ae77b849a55f733e6f8e5dd7bb641a8548aea7fcc91b99d772c91ff8864fff5c30b388438f8cb41d7ac941a86fc7bb1891f9838068  0004-Do-not-install-Java-sources.patch
+5d523de091a5eff46b4ab7000b09d3668f9e3949b8b04c7d7c1b36936e6cda95  0015-otp-update-version-19.0.1.patch"
+sha512sums="fdab82883f7be04cca91041819d15e0b065bdd049b134d056fe4ea12657f1c6f77aeebd778c09b4064e6d974734fe087592739181e14fe60597dbe37f492684f  otp_src_19.0.tar.gz
 923addcb1f6472829ba13ccc91ad3cef161f269478404f0a19bc4997118e06edd7459011a60769eb393eac930f30d4bd6c5526301382a5f9815862237f4664d3  0005-Do-not-install-nteventlog-and-related-doc-files-on-n.patch
-ef9045ec689e2a6517dba7626c1225a9a265f14675d704effd324529c3d5128260ba64cebfd41185364d2c5ac9a644ccc7088d0031c14c6ff74cd60f3c5bff1f  0006-Do-not-install-erlang-sources.patch
-d65fcfc3a9441941c6292c33d354964a82da11cc7a411dd0440719e490075ed588c1e70690e80650561749010d737394567f12ff73bd460f0d00c792c77cfae3  0007-Split-off-webtool-dependency-from-tools.patch
 b7387f92f8c27a0565c7885bba4b357183c62d422616e073bc5ffad338a0e22cb5165dcb3b95bf0b920ba00831599f2216027883f4be255aa6f6150b68b7a37c  0010-fix-nteventlog-remove.patch
-f3c50f8610e08173c365a575737079b0259db6fc0dfa5b1be63c281b52358bbce9e2595132a8f6a06772785d7d38d108f8da8515e2f7706cd03b6585aab4d071  0060-set-disksup_posix_only-to-true.patch
-e472bdb4b322d66b9c0ad9627abc469b8c648145ffad1dd7f645b38b2fad43492f475d2fd4d0bab159be6110db5043bb6d792d72e8276b3c3869be46129c6616  0070-otp-update-version-18.3.2.patch"
+bbacccc2a4b85ab4c1a6a24db70b8e4ae6ddd5f2b8b3c6c3ce1c767ff2881bb35a7f6adac973ecb4469149f658ab924825ec295efe8f41fb00229db526cb4ac3  0015-otp-update-version-19.0.1.patch"
-- 
2.9.0

---
Unsubscribe:  [email-masked]
Help:         [email-masked]
---