From jin@iss-p10.lbl.gov  Mon Jul 17 15:45:45 2000
Return-Path: <jin@iss-p10.lbl.gov>
Received: from iss-p10.lbl.gov (iss-p10.lbl.gov [131.243.2.35])
	by hub.freebsd.org (Postfix) with ESMTP id 24A6237B65B
	for <FreeBSD-gnats-submit@freebsd.org>; Mon, 17 Jul 2000 15:45:43 -0700 (PDT)
	(envelope-from jin@iss-p10.lbl.gov)
Received: (from jin@localhost)
	by iss-p10.lbl.gov (8.9.3/8.9.3) id PAA00517;
	Mon, 17 Jul 2000 15:45:42 -0700 (PDT)
	(envelope-from jin)
Message-Id: <200007172245.PAA00517@iss-p10.lbl.gov>
Date: Mon, 17 Jul 2000 15:45:42 -0700 (PDT)
From: Jin Guojun (DSD staff) <jin@iss-p10.lbl.gov>
Reply-To: j_guojun@lbl.gov
To: FreeBSD-gnats-submit@freebsd.org
Subject: sscanf() fails on 64-bit operations
X-Send-Pr-Version: 3.2

>Number:         19994
>Category:       misc
>Synopsis:       sscanf() fails on 64-bit operations
>Confidential:   no
>Severity:       serious
>Priority:       high
>Responsible:    fenner
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Mon Jul 17 15:50:01 PDT 2000
>Closed-Date:    Tue Aug 31 01:13:50 GMT 2004
>Last-Modified:  Tue Aug 31 01:13:50 GMT 2004
>Originator:     Jin Guojun (DSD staff)
>Release:        FreeBSD 4.0-20000627-STABLE i386
>Organization:
>Environment:

	FreeBSD all releases

>Description:

	sscanf(), and maybe scanf ..., fails on 64-bit operation.

	On Solaris, IRIX and Linux systems, the code below outputs:

	% hextodec -r 963870220966261
	0x00036CA286215975

	% hextodec 0x00036CA286215975
	963870220966261

	% hextodec 0x2804C6B886215975
	2883648157250574709


	Under FreeBSD
 	% hextodec -r 963870220966261
	0x2804C6B886215975

	% hextodec 0x00036CA286215975
	2883648157250574709

	% hextodec 0x2804C6B886215975	# this seems correct
	2883648157250574709


>How-To-Repeat:

	main(argc, argv)
	{
	int rev, i = 1;
		if (!strcmp(argv[i], "-r"))	{
			rev = 1;
			i++;
		} else	rev = 0;
	{
        int64_t h;
                rev ? sscanf(argv[i], "%lld", &h) : sscanf(argv[i], "%llx", &h);
                printf(rev ? "0x%016llX\n": "%lld\n", h);
        }
	}

>Fix:

	


>Release-Note:
>Audit-Trail:

From: Bruce Evans <bde@zeta.org.au>
To: j_guojun@lbl.gov
Cc: FreeBSD-gnats-submit@FreeBSD.ORG
Subject: Re: misc/19994: sscanf() fails on 64-bit operations
Date: Tue, 18 Jul 2000 09:41:10 +1000 (EST)

 On Mon, 17 Jul 2000, Jin Guojun wrote:
 
 > >How-To-Repeat:
 > 
 > 	main(argc, argv)
 > 	{
 > 	int rev, i = 1;
 > 		if (!strcmp(argv[i], "-r"))	{
 > 			rev = 1;
 > 			i++;
 > 		} else	rev = 0;
 > 	{
 >         int64_t h;
 >                 rev ? sscanf(argv[i], "%lld", &h) : sscanf(argv[i], "%llx", &h);
 >                 printf(rev ? "0x%016llX\n": "%lld\n", h);
 >         }
 > 	}
 
 64-bit types are unportable.  FreeBSD's scanf only supports reading "quad"
 types using %qd format.
 
 FreeBSD's scanf also has some overflow handling bugs from misusing strtoq
 to handle non-quads.
 
 Bruce
 
 Bruce
 
 

From: Jin Guojun (DSD staff) <jin@george.lbl.gov>
To: bde@zeta.org.au, j_guojun@lbl.gov
Cc: FreeBSD-gnats-submit@FreeBSD.ORG
Subject: Re: misc/19994: sscanf() fails on 64-bit operations
Date: Mon, 17 Jul 2000 18:09:50 -0700 (PDT)

 On Mon, 17 Jul 2000, Bruce Evans <bde@zeta.org.au> wrote:
 
 > > >How-To-Repeat:
 > > 
 > >       main(argc, argv)
 > >       {
 > >       int rev, i = 1;
 > >               if (!strcmp(argv[i], "-r"))     {
 > >                       rev = 1;
 > >                       i++;
 > >               } else  rev = 0;
 > >       {
 > >         int64_t h;
 > >                 rev ? sscanf(argv[i], "%lld", &h) : sscanf(argv[i], "%llx", &h
 > );
 > >                 printf(rev ? "0x%016llX\n": "%lld\n", h);
 > >         }
 > >       }
 > 
 > 64-bit types are unportable.  FreeBSD's scanf only supports reading "quad"
 > types using %qd format.
 > 
 > FreeBSD's scanf also has some overflow handling bugs from misusing strtoq
 > to handle non-quads.
 
 Shall we have "%lld" in FreeBSD to make it portable with other systems?
 
 	-Jin
 

From: Rolf Grossmann <grossman@securitas.net>
To: freebsd-gnats-submit@FreeBSD.org, j_guojun@lbl.gov
Cc:  
Subject: Re: misc/19994: sscanf() fails on 64-bit operations
Date: Sun, 18 Feb 2001 19:04:05 +0100 (CET)

 Hi,
 
 I really think we should support %lld with *scanf. After all, we support
 it with *printf. It bit me when trying to compile the latest ORBit (0.5.7).
 Here's a patch that does the trick.
 
 Bye, Rolf
 
 Index: stdio/vfscanf.c
 ===================================================================
 RCS file: /home/ncvs/src/lib/libc/stdio/vfscanf.c,v
 retrieving revision 1.14
 diff -c -r1.14 vfscanf.c
 *** stdio/vfscanf.c	1999/08/28 00:01:20	1.14
 --- stdio/vfscanf.c	2001/02/18 18:03:04
 ***************
 *** 165,171 ****
   			flags |= SUPPRESS;
   			goto again;
   		case 'l':
 ! 			flags |= LONG;
   			goto again;
   		case 'q':
   			flags |= QUAD;
 --- 165,174 ----
   			flags |= SUPPRESS;
   			goto again;
   		case 'l':
 ! 			if (flags & LONG)
 ! 				flags |= QUAD;
 ! 			else
 ! 				flags |= LONG;
   			goto again;
   		case 'q':
   			flags |= QUAD;
 ***************
 *** 265,276 ****
   			nconversions++;
   			if (flags & SUPPRESS)	/* ??? */
   				continue;
 ! 			if (flags & SHORT)
 ! 				*va_arg(ap, short *) = nread;
   			else if (flags & LONG)
   				*va_arg(ap, long *) = nread;
 ! 			else if (flags & QUAD)
 ! 				*va_arg(ap, quad_t *) = nread;
   			else
   				*va_arg(ap, int *) = nread;
   			continue;
 --- 268,279 ----
   			nconversions++;
   			if (flags & SUPPRESS)	/* ??? */
   				continue;
 ! 			if (flags & QUAD)
 ! 				*va_arg(ap, quad_t *) = nread;
   			else if (flags & LONG)
   				*va_arg(ap, long *) = nread;
 ! 			else if (flags & SHORT)
 ! 				*va_arg(ap, short *) = nread;
   			else
   				*va_arg(ap, int *) = nread;
   			continue;
 ***************
 *** 555,566 ****
   				if (flags & POINTER)
   					*va_arg(ap, void **) =
   						(void *)(u_long)res;
 - 				else if (flags & SHORT)
 - 					*va_arg(ap, short *) = res;
 - 				else if (flags & LONG)
 - 					*va_arg(ap, long *) = res;
   				else if (flags & QUAD)
   					*va_arg(ap, quad_t *) = res;
   				else
   					*va_arg(ap, int *) = res;
   				nassigned++;
 --- 558,569 ----
   				if (flags & POINTER)
   					*va_arg(ap, void **) =
   						(void *)(u_long)res;
   				else if (flags & QUAD)
   					*va_arg(ap, quad_t *) = res;
 + 				else if (flags & LONG)
 + 					*va_arg(ap, long *) = res;
 + 				else if (flags & SHORT)
 + 					*va_arg(ap, short *) = res;
   				else
   					*va_arg(ap, int *) = res;
   				nassigned++;
 
Responsible-Changed-From-To: freebsd-bugs->roam 
Responsible-Changed-By: mikeh 
Responsible-Changed-When: Fri Jun 29 21:07:17 PDT 2001 
Responsible-Changed-Why:  
It's rumored that Peter has been thinking about fixing this 

http://www.FreeBSD.org/cgi/query-pr.cgi?pr=19994 
Responsible-Changed-From-To: roam->fenner 
Responsible-Changed-By: fenner 
Responsible-Changed-When: Mon Feb 25 10:39:27 PST 2002 
Responsible-Changed-Why:  
I'm working on c99 support for scanf, which includes %lld. 

http://www.FreeBSD.org/cgi/query-pr.cgi?pr=19994 
State-Changed-From-To: open->patched 
State-Changed-By: fenner 
State-Changed-When: Tue May 7 11:02:12 PDT 2002 
State-Changed-Why:  
I added c99 %lld support in rev 1.22 of vfscanf.c 

http://www.freebsd.org/cgi/query-pr.cgi?pr=19994 
State-Changed-From-To: patched->closed 
State-Changed-By: linimon 
State-Changed-When: Tue Aug 31 01:13:00 GMT 2004 
State-Changed-Why:  
Committed back in 2002. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=19994 
>Unformatted:
