From owner-freebsd-bugs Wed Sep 18 19:40:08 1996 Return-Path: owner-bugs Received: (from root@localhost) by freefall.freebsd.org (8.7.5/8.7.3) id TAA11197 for bugs-outgoing; Wed, 18 Sep 1996 19:40:08 -0700 (PDT) Received: (from gnats@localhost) by freefall.freebsd.org (8.7.5/8.7.3) id TAA11163; Wed, 18 Sep 1996 19:40:04 -0700 (PDT) Resent-Date: Wed, 18 Sep 1996 19:40:04 -0700 (PDT) Resent-Message-Id: <199609190240.TAA11163@freefall.freebsd.org> Resent-From: gnats (GNATS Management) Resent-To: freebsd-bugs Resent-Reply-To: FreeBSD-gnats@freefall.FreeBSD.org, thorpej@nas.nasa.gov Received: from nostromo.nas.nasa.gov (nostromo.nas.nasa.gov [129.99.223.15]) by freefall.freebsd.org (8.7.5/8.7.3) with ESMTP id TAA10920 for ; Wed, 18 Sep 1996 19:39:23 -0700 (PDT) Received: (from thorpej@localhost) by nostromo.nas.nasa.gov (8.7.5/8.6.9-rAT) id TAA07506; Wed, 18 Sep 1996 19:33:15 -0700 (PDT) Message-Id: <199609190233.TAA07506@nostromo.nas.nasa.gov> Date: Wed, 18 Sep 1996 19:33:15 -0700 (PDT) From: Jason Thorpe Reply-To: thorpej@nas.nasa.gov To: FreeBSD-gnats-submit@freebsd.org X-Send-Pr-Version: 3.95 Subject: bin/1640: libftpio not 64-bit safe Sender: owner-bugs@freebsd.org X-Loop: FreeBSD.org Precedence: bulk >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 - #include - #include - #include - #include #include #include #include ! #include ! #include ! #include ! #include ! #include ! #include #include #include #define SUCCESS 0 #define FAILURE -1 --- 20,42 ---- * */ #include #include + #include ! #include + + #include + #include #include + #include + #include + #include + #include + #include + #include + #include #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 + #include #include /* *************** *** 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: