[openssl-dev] [openssl.org #4217] Fixing DJGPP port of openssl master branch.

Juan Manuel Guerrero via RT rt at openssl.org
Mon Jan 4 19:42:48 UTC 2016


Unfortunately the DJGPP port is badly brocken in the master branch.
The provided patch shall fix the issues.

Both patches will fix/improve the following issues:
1) In Configure:
       For some reason -DTERMIO is set but DJGPP has never offered TERMIO making
       the build fail.  I have changed this to -DTERMIOS as is used to be.
2) In crypto/bio/bss_dgram.c:
       The superflous macro definitions of sock_write, sock_read and sock_puts
       enclosed by WATT32 have been removed.
3) In crypto/bio/bss_sock.c:
       Here the existing macro definitions for sock_write, sock_read and sock_puts
       are necessary and must be kept but they must be undefined before they can
       be defined.  This is because newer versions of Watt-32 also redefine them.
4) In crypto/conf/conf_def.c:
       If this port is used on MS-DOS or FreeDOS it becomes necessary to check if
       the underlying file system supports long file names (aka LFN) or not.  If
       it does not then file names with a leading dot like ".rnd" or ".ca_certs"
       are ilicit.  In function def_load_bio, the macros IS_RANDFILE and IS_CERT_DIR
       are used to check if the file system offers LFN support so that the file
       names with leading dots are licit and can be used.  If the tests fail
       then the new function dosify_filename is called and will substitute
       invalid characters in the file name by valid ones before using them.
       This check and the call of dosify_filename is enclosed by OPENSSL_SYS_MSDOS.
5) In e_os.h:
       In the DJGPP section the macros IS_RANDFILE and IS_CERT_DIR are defined.
       Also some auxiliar macros like HAS_LFN_SUPPORT and FILE_EXISTS are defined.
       Because neither MS-DOS nor FreeDOS provide 'egd' sockets, the DEVRANDOM_EGD
       macro is undefined.  This shall inhibit the compilation of code that does
       not work on MS-DOS/FreeDOS.
6) In INSTALL.DJGPP:
       Update URL of WATT-32 library.

I have checked the modified version of the master branch works on linux and
Cygwin.  They are no issues.  This is no surprise because the changes are
either enclosed by the __DJGPP__ or OPENSSL_SYS_MSDOS macros.
If more informaton is required please mail me.  I have attached the patch
as gzip'ed file too.


Regards,
Juan M. Guerrero






2016-01-04  Juan Manuel Guerrero  <juan.guerrero at gmx.de>

	* Configurations/10-main.conf:  Replaced -DTERMIO by -DTERMIOS in CFLAGS.

	* crypto/bio/bss_dgram.c [WATT32]:  Remove obsolete redefinition of
	function names: sock_write, sock_read and sock_puts.

	* crypto/bio/bss_sock.c [WATT32]:  For Watt-32 2.2.11 sock_write,
	sock_read and sock_puts are redefined to their private names so their
	names must be undefined first before they can be redefined again.

	* crypto/conf/conf_def.c (def_load_bio) [OPENSSL_SYS_MSDOS]:  Call
	dosify_filename to replace leading dot if file system does not support
	it.
	(dosify_filename):  Replace leading dot in passed file name if file
	system does not support LFN.

	* e_os.h [__DJGPP__]:  Undefine macro DEVRANDOM_EGD.  Neither MS-DOS
	nor FreeDOS provides 'egd' sockets.
	New macros IS_RANDFILE and IS_CERT_DIR are defined to identify the
	RANDFILE entry in openssl.cnf and the cert_dir entry in ssleay.conf.
	New macro RFILE that is defined either to ".rnd" or "_rnd" depending
	on if LFN support is available or not.

	* INSTALL.DJGPP:  Update URL of WATT-32 library.




diff --git a/Configurations/10-main.conf b/Configurations/10-main.conf
index a82b95d..fad57a9 100644
--- a/Configurations/10-main.conf
+++ b/Configurations/10-main.conf
@@ -1299,7 +1299,7 @@
      "DJGPP" => {
          inherit_from     => [ asm("x86_asm") ],
          cc               => "gcc",
-        cflags           => "-I/dev/env/WATT_ROOT/inc -DTERMIO -DL_ENDIAN -fomit-frame-pointer -O2 -Wall",
+        cflags           => "-I/dev/env/WATT_ROOT/inc -DTERMIOS -DL_ENDIAN -fomit-frame-pointer -O2 -Wall",
          sys_id           => "MSDOS",
          lflags           => "-L/dev/env/WATT_ROOT/lib -lwatt",
          bn_ops           => "BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}",
diff --git a/INSTALL.DJGPP b/INSTALL.DJGPP
index 1047ec9..23aed6a 100644
--- a/INSTALL.DJGPP
+++ b/INSTALL.DJGPP
@@ -18,7 +18,7 @@
   files to download, see the DJGPP "ZIP PICKER" page at
   "http://www.delorie.com/djgpp/zip-picker.html". You also need to have
   the WATT-32 networking package installed before you try to compile
- OpenSSL. This can be obtained from "http://www.bgnett.no/~giva/".
+ OpenSSL. This can be obtained from "http://www.watt-32.net/".
   The Makefile assumes that the WATT-32 code is in the directory
   specified by the environment variable WATT_ROOT. If you have watt-32
   in directory "watt32" under your main DJGPP directory, specify
diff --git a/crypto/bio/bss_dgram.c b/crypto/bio/bss_dgram.c
index 5e934ce..ca318cf 100644
--- a/crypto/bio/bss_dgram.c
+++ b/crypto/bio/bss_dgram.c
@@ -97,12 +97,6 @@
           ((a)->s6_addr32[2] == htonl(0x0000ffff)))
  # endif

-# ifdef WATT32
-#  define sock_write SockWrite  /* Watt-32 uses same names */
-#  define sock_read  SockRead
-#  define sock_puts  SockPuts
-# endif
-
  static int dgram_write(BIO *h, const char *buf, int num);
  static int dgram_read(BIO *h, char *buf, int size);
  static int dgram_puts(BIO *h, const char *str);
diff --git a/crypto/bio/bss_sock.c b/crypto/bio/bss_sock.c
index 1673b32..5cef4f3 100644
--- a/crypto/bio/bss_sock.c
+++ b/crypto/bio/bss_sock.c
@@ -66,7 +66,11 @@
  # include <openssl/bio.h>

  # ifdef WATT32
-#  define sock_write SockWrite  /* Watt-32 uses same names */
+/* Watt-32 uses same names */
+#  undef sock_write
+#  undef sock_read
+#  undef sock_puts
+#  define sock_write SockWrite
  #  define sock_read  SockRead
  #  define sock_puts  SockPuts
  # endif
diff --git a/crypto/conf/conf_def.c b/crypto/conf/conf_def.c
index ac07405..7d33a28 100644
--- a/crypto/conf/conf_def.c
+++ b/crypto/conf/conf_def.c
@@ -87,6 +87,9 @@ static int def_load_bio(CONF *conf, BIO *bp, long *eline);
  static int def_dump(const CONF *conf, BIO *bp);
  static int def_is_number(const CONF *conf, char c);
  static int def_to_int(const CONF *conf, char c);
+#ifdef OPENSSL_SYS_MSDOS
+static void dosify_filename(char *filename);
+#endif

  static CONF_METHOD default_method = {
      "OpenSSL default",
@@ -370,6 +373,10 @@ static int def_load_bio(CONF *conf, BIO *in, long *line)
              if (!str_copy(conf, psection, &(v->value), start))
                  goto err;

+#ifdef OPENSSL_SYS_MSDOS
+            if (IS_RANDFILE(v->name) || IS_CERT_DIR(v->name))
+                dosify_filename(v->value);
+#endif
              if (strcmp(psection, section) != 0) {
                  if ((tv = _CONF_get_section(conf, psection))
                      == NULL)
@@ -678,3 +685,24 @@ static int def_to_int(const CONF *conf, char c)
  {
      return c - '0';
  }
+
+#ifdef OPENSSL_SYS_MSDOS
+static void dosify_filename(char *filename)
+{
+  if (filename && *filename && !HAS_LFN_SUPPORT(filename))
+  {
+    char *slash;
+    int length;
+    for (length = 0; filename[length]; length++)
+      ;
+    for (slash = filename + length - 1; slash > filename && *slash != '/'; slash--)
+      ;
+
+    /* Leading dot not allowed on plain DOS.  */
+    if (slash[0] == '.')
+      slash[0] = '_';
+    else if (slash[1] == '.')
+      slash[1] = '_';
+  }
+}
+#endif
diff --git a/e_os.h b/e_os.h
index 5ab4c89..9a5f812 100644
--- a/e_os.h
+++ b/e_os.h
@@ -141,6 +141,7 @@ extern "C" {
  #  define writesocket(s,b,n)      send((s),(b),(n),0)
  # elif defined(__DJGPP__)
  #  define WATT32
+#  define WATT32_NO_OLDIES
  #  define get_last_socket_error() errno
  #  define clear_socket_error()    errno=0
  #  define closesocket(s)          close_s(s)
@@ -194,13 +195,33 @@ extern "C" {
  #   include <unistd.h>
  #   include <sys/stat.h>
  #   include <sys/socket.h>
+#   include <sys/un.h>
  #   include <tcp.h>
  #   include <netdb.h>
  #   define _setmode setmode
  #   define _O_TEXT O_TEXT
  #   define _O_BINARY O_BINARY
+#   if defined (__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 8))
+#    define __gnuc_extension__  __extension__
+#   else
+#    define __gnuc_extension__
+#   endif
+#   define FILE_EXISTS(name)      (access((name), R_OK) == 0)
+#   define HAS_LFN_SUPPORT(name)  (pathconf((name), _PC_NAME_MAX) > 12)
+#   define RFILE                                                                        \
+    (__gnuc_extension__                                                                 \
+      ({                                                                                \
+         char *rnd = HAS_LFN_SUPPORT(".rnd") && FILE_EXISTS(".rnd") ? ".rnd" : "_rnd";  \
+         rnd;                                                                           \
+      })                                                                                \
+    )
+#   undef DEVRANDOM_EGD  /*  Neither MS-DOS nor FreeDOS provide 'egd' sockets.  */
  #   undef DEVRANDOM
  #   define DEVRANDOM "/dev/urandom\x24"
+#   define IS_RANDFILE(n)  ((n)[0] == 'R' && (n)[1] == 'A' && (n)[2] == 'N' && (n)[3] == 'D' && \
+                            (n)[4] == 'F' && (n)[5] == 'I' && (n)[6] == 'L' && (n)[7] == 'E')
+#   define IS_CERT_DIR(n)  ((n)[0] == 'c' && (n)[1] == 'e' && (n)[2] == 'r' && (n)[3] == 't' && \
+                            (n)[4] == '_' && (n)[5] == 'd' && (n)[6] == 'i' && (n)[7] == 'r')
  #  endif                        /* __DJGPP__ */

  #  ifndef S_IFDIR
@@ -327,7 +348,9 @@ extern FILE *_imp___iob;
  #  endif
  #  define OPENSSL_CONF  "openssl.cnf"
  #  define NUL_DEV       "nul"
-#  define RFILE         ".rnd"
+#  ifndef RFILE
+#   define RFILE        ".rnd"
+#  endif
  #  ifdef OPENSSL_SYS_WINCE
  #   define DEFAULT_HOME  ""
  #  else

-------------- next part --------------
A non-text attachment was scrubbed...
Name: djgpp-openssl-master.patch.gz
Type: application/x-gzip
Size: 2325 bytes
Desc: not available
URL: <http://mta.openssl.org/pipermail/openssl-dev/attachments/20160104/c178ef90/attachment.bin>
-------------- next part --------------
_______________________________________________
openssl-bugs-mod mailing list
openssl-bugs-mod at openssl.org
https://mta.openssl.org/mailman/listinfo/openssl-bugs-mod


More information about the openssl-dev mailing list