Package: cvsps
Version: 2.1-4
Severity: normal
Tags: patch

The direct cvs code incorrectly converts the hostname to an IP address,
by doing a wrong check with the result of the inet_addr call.

The code does (at line 201 in file cbtcommon/tcp_socket.c):
  if ( (*dest = inet_addr(addr_str)) != -1)

but here *dest is a long, which is signed and on 64 bit arches has a
different size than the actual return address of inet_addr (in_addr_t)
which is unsigned int. As such, the comparison fails, and the test is
always considered successful, and it will generate the known "Network
unreachable" message when running git-cvsimport. On 32bit arches, due to
the same size, the code will run correctly.

Per
http://www.opengroup.org/onlinepubs/000095399/functions/inet_addr.html,
it is simply enough to test the return value against (in_addr_t)(-1),
which I can confirm works on both 32 and 64 bit. Patch attached.

Side note: the function in cause also has a different codepath for
#ifdef LINUX, but this define is not used anywhere else; the same
problem can be solved (at least on Debian) by modifying in Makefile the
CFLAGS and adding -DLINUX.

-- System Information:
Debian Release: lenny/sid
  APT prefers unstable
  APT policy: (500, 'unstable'), (500, 'testing'), (500, 'stable'), (1, 
'experimental')
Architecture: amd64 (x86_64)

Kernel: Linux 2.6.25.8-teal (SMP w/2 CPU cores)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash

Versions of packages cvsps depends on:
ii  cvs                    1:1.12.13-11      Concurrent Versions System
ii  libc6                  2.7-12            GNU C Library: Shared libraries
ii  zlib1g                 1:1.2.3.3.dfsg-12 compression library - runtime

cvsps recommends no packages.

-- no debconf information
#! /bin/sh /usr/share/dpatch/dpatch-run
## 05-inet_addr_fix.dpatch by Iustin Pop <[EMAIL PROTECTED]>
##
## All lines beginning with `## DP:' are a description of the patch.
## DP: Fix the inet_addr result check with correct type casting

@DPATCH@

diff -urN cvsps-2.1.orig/cbtcommon/tcpsocket.c cvsps-2.1/cbtcommon/tcpsocket.c
--- cvsps-2.1.orig/cbtcommon/tcpsocket.c        2005-05-26 05:39:40.000000000 
+0200
+++ cvsps-2.1/cbtcommon/tcpsocket.c     2008-07-04 07:45:08.571962583 +0200
@@ -198,7 +198,7 @@
     memcpy(dest, &ip.s_addr, sizeof(ip.s_addr));
   }
 #else
-  if ( (*dest = inet_addr(addr_str)) != -1)
+  if ( (*dest = inet_addr(addr_str)) != (in_addr_t)-1)
   {
     /* nothing */
   }

Reply via email to