Package: crywrap
Version: 0.2.1-4.2
Severity: important

Debian Etch:

# gdb ./src/crywrap
GNU gdb 6.4.90-debian
(gdb) run -d127.0.0.1/imap2 -l192.168.2.1/imaps
-P/var/run/crywrap/crywrap-0.pid
-pcert=/etc/crywrap/server.pem,key=/etc/crywrap/server.pem -u130
Starting program: /tmp/crywrap-0.2.1/src/crywrap -d 127.0.0.1/imap2
-l /imaps -P /var/run/crywrap/crywrap-0.pid
-p cert=/etc/crywrap/server.pem,key=/etc/crywrap/server.pem -u 130
Failed to read a valid object file image from memory.

Program received signal SIGSEGV, Segmentation fault.
0x0804b36d in _crywrap_config_parse_opt (key=112, arg=0xbf9ffb11
"cert=/etc/crywrap/server.pem,key=/etc/crywrap/server.pem",
state=0xbf9fd598)
    at crywrap.c:355
355           while (*subopts != '\0')
(gdb) bt full
#0  0x0804b36d in _crywrap_config_parse_opt (key=112, arg=0xbf9ffb11
    "cert=/etc/crywrap/server.pem,key=/etc/crywrap/server.pem",
    state=0xbf9fd598) at crywrap.c:355
        cfg = <value optimized out>
        pem_cert = 0x0
        pem_key = 0x0
        subopts = 0x0
        value = 0x806ad94 "wœ\004\b\001"
#1  0xb7e4eaa6 in argp_parse () from /lib/tls/libc.so.6
No symbol table info available.
#2  0x0804a8c3 in main (argc=7, argv=0xbf9fdb94, envp=0xbf9fdbb4) at
    crywrap.c:435
        config = (crywrap_config_t *) 0x806acc8
        server_socket = <value optimized out>

Relates to "-p" argument:
Value optarg is undefined (0) and not tested in the while() expression.
Maybe, it should be arg?

Proposed patch (please verify):
#########################################
--- src/crywrap.c       15 Apr 2007 18:53:09 -0000      1.1.1.1
+++ src/crywrap.c       15 Apr 2007 20:02:57 -0000
@@ -349,10 +349,11 @@
        cfg->pidfile = NULL;
       break;
     case 'p':
-      subopts = optarg;
+      subopts = arg;
       pem_cert = NULL;
       pem_key = NULL;
-      while (*subopts != '\0')
+      while ((arg) && (*subopts != '\0'))
+      {
        switch (bhc_getsubopt (&subopts, _crywrap_p_subopts, &value))
          {
          case CRYWRAP_P_SUBOPT_CERT:
@@ -365,6 +366,7 @@
            pem_cert = bhc_strdup (value);
            break;
          }
+         }
       if (!pem_key)
        pem_key = bhc_strdup (pem_cert);
       if (!pem_cert)
#########################################

Additional, unrelated patch suggestions (please verify against the
compiler warnings and intended behaviour):
#########################################
--- Mk/Rules.mk.in      15 Apr 2007 18:53:09 -0000      1.1.1.1
+++ Mk/Rules.mk.in      15 Apr 2007 20:10:29 -0000
@@ -105,6 +105,7 @@
                -Wbad-function-cast  -Wchar-subscripts -Wcomment -Wformat \
                -Wformat-nonliteral -Wformat-security -Wimplicit \
                -Wmissing-braces -Wparentheses -Wswitch -Wunused  \
+               -Wall -Werror -pedantic -std=c99 \
                @WFLAGS_29X@ @WFLAGS_3X@
 WFLAGS_29X     = -Wsign-compare -Wmain -Wreturn-type
 WFLAGS_3X      = -Wsequence-point -Wdiv-by-zero -W -Wno-unused-parameter
@@ -456,7 +458,7 @@
 _crywrap_session_cert_select (gnutls_session session,
                              gnutls_datum *server_certs, int ncerts)
 {
-  int idx, data_length = 0, name_type, i;
+  unsigned int idx, data_length = 0, name_type, i;
   char *name;

   /* If we only have one cert, return that. */
@@ -509,7 +511,7 @@
 static gnutls_session
 _crywrap_tls_session_create (const crywrap_config_t *config)
 {
-  gnutls_session session;
+  gnutls_session_t session;
   const int comp_prio[] = { GNUTLS_COMP_ZLIB, GNUTLS_COMP_LZO,
                                GNUTLS_COMP_NULL, 0 };
   const int mac_prio[] = { GNUTLS_MAC_SHA, GNUTLS_MAC_MD5, 0 };
@@ -539,7 +541,7 @@
   gnutls_handshake_set_private_extensions (session, 1);

   gnutls_certificate_server_set_retrieve_function
-    (session, (gnutls_certificate_server_retrieve_function *)
+    ((gnutls_certificate_credentials_t) session,
(gnutls_certificate_server_retrieve_function *)
      _crywrap_session_cert_select);

   if (config->verify)
@@ -912,7 +914,7 @@
   char buffer[_CRYWRAP_MAXBUF + 2];
   fd_set fdset;
   struct sockaddr_storage faddr;
-  socklen_t socklen = sizeof (struct sockaddr_storage);
+  unsigned socklen_t socklen = sizeof (struct sockaddr_storage);
   char peer_name[NI_MAXHOST];

   /* Log the connection */
#########################################

Additional hint:
./configure does not rely on libidn11-dev, needed to build the package

Thanks for providing support,
Hans-Jürgen



Reply via email to