Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 18 Sep 1996 19:33:15 -0700 (PDT)
From:      Jason Thorpe <thorpej@nas.nasa.gov>
To:        FreeBSD-gnats-submit@freebsd.org
Subject:   bin/1640: libftpio not 64-bit safe
Message-ID:  <199609190233.TAA07506@nostromo.nas.nasa.gov>
Resent-Message-ID: <199609190240.TAA11163@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         1640
>Category:       bin
>Synopsis:       libftpio not 64-bit safe
>Confidential:   no
>Severity:       serious
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Wed Sep 18 19:40:02 PDT 1996
>Last-Modified:
>Originator:     Jason Thorpe
>Organization:
Numerical Aerodynamic Simulation Project - NASA Ames
>Release:        FreeBSD-current 960918, built under NetBSD/alpha
>Environment:
	
System: NetBSD nostromo 1.2A NetBSD 1.2A (NOSY) #14: Wed Sep 18 14:54:10 PDT 1996 thorpej@nostromo:/work/clean-current/src/sys/arch/alpha/compile/NOSY alpha


>Description:
	The `ftpio' library is not 64-bit safe.  Err, what else is there
	to say?  :-)

>How-To-Repeat:
	Try building libftpio under NetBSD/alpha.  Lose.

>Fix:
	Diffs below to make it compile without warnings and even work!  :-)

	I made these changes some time ago, and just recently imported
	the most recent ftpio into my private tree.  Once I update the
	other utilities that use ftpio, diffs for those programs will
	follow.

	Note the prototype of an external interface changed; ftpGetSize()
	now returns an off_t rather than a size_t, since that's what
	file offsets actually are.

	Oh, ftpGet() changed, too ... the `seekto' argument should
	be an off_t, not an int.

	(You can safely ignore the $NetBSD$ tags :-)

 ----- snip -----
Index: ftpio.c
===================================================================
RCS file: /mastersrc/netbsd/src/lib/libftpio/ftpio.c,v
retrieving revision 1.1.1.2
retrieving revision 1.5
diff -c -r1.1.1.2 -r1.5
*** ftpio.c	1996/09/19 02:07:23	1.1.1.2
--- ftpio.c	1996/09/19 02:18:51	1.5
***************
*** 1,3 ****
--- 1,5 ----
+ /*	$NetBSD: $	*/
+ 
  /*
   * ----------------------------------------------------------------------------
   * "THE BEER-WARE LICENSE" (Revision 42):
***************
*** 18,39 ****
   *
   */
  
- #include <stdlib.h>
- #include <stdio.h>
- #include <unistd.h>
- #include <netdb.h>
- #include <errno.h>
  #include <sys/types.h>
  #include <sys/socket.h>
  #include <netinet/in.h>
! #include <stdarg.h>
! #include <string.h>
! #include <ctype.h>
! #include <sys/signal.h>
! #include <sys/socket.h>
! #include <netinet/in.h>
  #include <arpa/inet.h>
  #include <ftpio.h>
  
  #define SUCCESS		 0
  #define FAILURE		-1
--- 20,42 ----
   *
   */
  
  #include <sys/types.h>
  #include <sys/socket.h>
+ 
  #include <netinet/in.h>
! 
  #include <arpa/inet.h>
+ 
+ #include <ctype.h>
+ #include <errno.h>
  #include <ftpio.h>
+ #include <netdb.h>
+ #include <signal.h>
+ #include <stdarg.h>
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <string.h>
+ #include <unistd.h>
  
  #define SUCCESS		 0
  #define FAILURE		-1
***************
*** 58,64 ****
  static int	botch(char *func, char *botch_state);
  static int	cmd(FTP_t ftp, const char *fmt, ...);
  static int	ftp_login_session(FTP_t ftp, char *host, char *user, char *passwd, int port, int verbose);
! static int	ftp_file_op(FTP_t ftp, char *operation, char *file, FILE **fp, char *mode, int *seekto);
  static int	ftp_close(FTP_t ftp);
  static int	get_url_info(char *url_in, char *host_ret, int *port_ret, char *name_ret);
  
--- 61,67 ----
  static int	botch(char *func, char *botch_state);
  static int	cmd(FTP_t ftp, const char *fmt, ...);
  static int	ftp_login_session(FTP_t ftp, char *host, char *user, char *passwd, int port, int verbose);
! static int	ftp_file_op(FTP_t ftp, char *operation, char *file, FILE **fp, char *mode, off_t *seekto);
  static int	ftp_close(FTP_t ftp);
  static int	get_url_info(char *url_in, char *host_ret, int *port_ret, char *name_ret);
  
***************
*** 176,187 ****
      return("Unknown error");
  }
  
! size_t
  ftpGetSize(FILE *fp, char *name)
  {
      int i;
!     char p[BUFSIZ], *cp;
      FTP_t ftp = fcookie(fp);
  
      check_passive(fp);
      sprintf(p, "SIZE %s\r\n", name);
--- 179,191 ----
      return("Unknown error");
  }
  
! off_t
  ftpGetSize(FILE *fp, char *name)
  {
      int i;
!     char p[BUFSIZ], *cp, *ep;
      FTP_t ftp = fcookie(fp);
+     off_t size;
  
      check_passive(fp);
      sprintf(p, "SIZE %s\r\n", name);
***************
*** 189,199 ****
  	fprintf(stderr, "Sending %s", p);
      i = writes(ftp->fd_ctrl, p);
      if (i)
! 	return (size_t)-1;
      i = get_a_number(ftp, &cp);
      if (check_code(ftp, i, 213))
! 	return (size_t)-1;
!     return (size_t)atoi(cp);
  }
  
  time_t
--- 193,208 ----
  	fprintf(stderr, "Sending %s", p);
      i = writes(ftp->fd_ctrl, p);
      if (i)
! 	return (off_t)-1;
      i = get_a_number(ftp, &cp);
      if (check_code(ftp, i, 213))
! 	return (off_t)-1;
! 
!     errno = 0;				/* to check for ERANGE */
!     size = (off_t)strtoq(cp, &ep, 10);
!     if (*ep != '\0' || errno == ERANGE)
! 	return (off_t)-1;
!     return size;
  }
  
  time_t
***************
*** 230,236 ****
  }
  
  FILE *
! ftpGet(FILE *fp, char *file, int *seekto)
  {
      FILE *fp2;
      FTP_t ftp = fcookie(fp);
--- 239,245 ----
  }
  
  FILE *
! ftpGet(FILE *fp, char *file, off_t *seekto)
  {
      FILE *fp2;
      FTP_t ftp = fcookie(fp);
***************
*** 646,652 ****
  }
  
  static int
! ftp_file_op(FTP_t ftp, char *operation, char *file, FILE **fp, char *mode, int *seekto)
  {
      int i,s;
      char *q;
--- 655,661 ----
  }
  
  static int
! ftp_file_op(FTP_t ftp, char *operation, char *file, FILE **fp, char *mode, off_t *seekto)
  {
      int i,s;
      char *q;
***************
*** 700,706 ****
  	    if (i < 0 || FTP_TIMEOUT(i)) {
  		close(s);
  		ftp->errno = i;
! 		*seekto = 0;
  		return i;
  	    }
  	}
--- 709,715 ----
  	    if (i < 0 || FTP_TIMEOUT(i)) {
  		close(s);
  		ftp->errno = i;
! 		*seekto = (off_t)0;
  		return i;
  	    }
  	}
***************
*** 748,754 ****
  		return i;
  	    }
  	    else if (i != 350)
! 		*seekto = 0;
  	}
  	i = cmd(ftp, "%s %s", operation, file);
  	if (i < 0 || i > 299) {
--- 757,763 ----
  		return i;
  	    }
  	    else if (i != 350)
! 		*seekto = (off_t)0;
  	}
  	i = cmd(ftp, "%s %s", operation, file);
  	if (i < 0 || i > 299) {
Index: ftpio.h
===================================================================
RCS file: /mastersrc/netbsd/src/lib/libftpio/ftpio.h,v
retrieving revision 1.1.1.2
retrieving revision 1.4
diff -c -r1.1.1.2 -r1.4
*** ftpio.h	1996/09/19 02:07:22	1.1.1.2
--- ftpio.h	1996/09/19 02:13:27	1.4
***************
*** 1,7 ****
--- 1,10 ----
+ /*	$NetBSD: $	*/
+ 
  #ifndef _FTP_H_INCLUDE
  #define _FTP_H_INCLUDE
  
  #include <sys/types.h>
+ #include <stdio.h>
  #include <time.h>
  
  /*
***************
*** 48,55 ****
  extern FILE	*ftpLogin(char *host, char *user, char *passwd, int port, int verbose);
  extern int	ftpChdir(FILE *fp, char *dir);
  extern int	ftpErrno(FILE *fp);
! extern size_t	ftpGetSize(FILE *fp, char *file);
! extern FILE	*ftpGet(FILE *fp, char *file, int *seekto);
  extern FILE	*ftpPut(FILE *fp, char *file);
  extern int	ftpAscii(FILE *fp);
  extern int	ftpBinary(FILE *fp);
--- 51,58 ----
  extern FILE	*ftpLogin(char *host, char *user, char *passwd, int port, int verbose);
  extern int	ftpChdir(FILE *fp, char *dir);
  extern int	ftpErrno(FILE *fp);
! extern off_t	ftpGetSize(FILE *fp, char *file);
! extern FILE	*ftpGet(FILE *fp, char *file, off_t *seekto);
  extern FILE	*ftpPut(FILE *fp, char *file);
  extern int	ftpAscii(FILE *fp);
  extern int	ftpBinary(FILE *fp);
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199609190233.TAA07506>