bin/97485: [Patch] Incorrect conversion in a64l(3)

Mikko Työläjärvi mbsd at pacbell.net
Fri May 19 06:10:15 UTC 2006


>Number:         97485
>Category:       bin
>Synopsis:       [Patch] Incorrect conversion in a64l(3)
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Fri May 19 06:10:13 GMT 2006
>Closed-Date:
>Last-Modified:
>Originator:     Mikko Tyolajarvi
>Release:        FreeBSD 6.1-STABLE i386
>Organization:
>Environment:
System: FreeBSD antec.home 6.1-STABLE FreeBSD 6.1-STABLE #10: Sun May 14 15:21:09 PDT 2006 mikko at antec.home:/x/usr/obj/usr/src/sys/ANTEC i386

 	The problem exists in both 6.1 and 7-current.

>Description:

 	Any string containing a "/" character is decoded incorrectly.

 	For example, the string "/" should decode to the value 1 (it
 	even says so in the man page), but on FreeBSD the result is 3.

>How-To-Repeat:

 	#include <assert.h>
 	int main()
 	{
 		assert(a64l("/") == 1);
 		return 0;
 	}

>Fix:

Here are some suggestions, all of which work:

1)
--- a64l.c.orig	Thu May 18 22:55:23 2006
+++ a64l.c	Thu May 18 22:55:35 2006
@@ -16,7 +16,7 @@
  #include <inttypes.h>

  #define	ADOT	46		/* ASCII '.' */
-#define	ASLASH	ADOT + 1	/* ASCII '/' */
+#define	ASLASH	(ADOT + 1)	/* ASCII '/' */
  #define	A0	48		/* ASCII '0' */
  #define	AA	65		/* ASCII 'A' */
  #define	Aa	97		/* ASCII 'a' */


2)
--- a64l.c.orig	Thu May 18 22:55:23 2006
+++ a64l.c	Thu May 18 22:56:25 2006
@@ -16,7 +16,7 @@
  #include <inttypes.h>

  #define	ADOT	46		/* ASCII '.' */
-#define	ASLASH	ADOT + 1	/* ASCII '/' */
+#define	ASLASH	47		/* ASCII '/' */
  #define	A0	48		/* ASCII '0' */
  #define	AA	65		/* ASCII 'A' */
  #define	Aa	97		/* ASCII 'a' */

3)
--- a64l.c.orig	Thu May 18 22:55:23 2006
+++ a64l.c	Thu May 18 22:57:47 2006
@@ -31,7 +31,7 @@
  	shift = 0;
  	for (i = 0; *s != '\0' && i < 6; i++, s++) {
  		if (*s <= ASLASH)
-			digit = *s - ASLASH + 1;
+			digit = *s - ADOT;
  		else if (*s <= A0 + 9)
  			digit = *s - A0 + 2;
  		else if (*s <= AA + 25)

4)
Use the unmodified code from NetBSD.


   $.02,
   /Mikko
>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-bugs mailing list