You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by David McCreedy <mc...@us.ibm.com> on 2002/06/18 04:38:59 UTC

Re: cvs commit: apache-1.3/src/ap ap_strtol.c Makefile.tmpl

The ap_strtol function in ap_strtol.c assumes that A-Z / a-z are contiguous
ranges (and I'm glad to say it documents this assumption).
While this is true for ASCII it is NOT true for EBCDIC machines: TPF,
OS390, and BS2000.
In EBCDIC, A-I / a-i are contiguous, J-R / j-r are contiguous, and S-Z /
s-z are contiguous.
I know this is true for TPF and strongly believe it is also true for OS390
and BS2000.

This means that the new ap_strtol function should work OK for EBCDIC as
long as the base isn't greater than 19.
The internal calls to ap_strtol (that is, those under the current dev src
directory) seem to be for base 16 or less, so this probably isn't a
critical bug.
But it would be nice if ap_strtol fully worked for EBCDIC too, which could
be done using more granular letter ranges either for all platforms or just
if #ifdef CHARSET_EBCDIC  is defined.

-David



                                                                                                                                       
                      jim@apache.org                                                                                                   
                                               To:       apache-1.3-cvs@apache.org                                                     
                      06/17/2002 06:34         cc:                                                                                     
                      PM                       Subject:  cvs commit: apache-1.3/src/ap ap_strtol.c Makefile.tmpl                       
                      Please respond to                                                                                                
                      dev                                                                                                              
                                                                                                                                       
                                                                                                                                       



jim         2002/06/17 17:34:35

  Modified:    src/ap   Makefile.tmpl
  Added:       src/ap   ap_strtol.c
  Log:
  Add in our ap_strtol() implementation

  Revision  Changes    Path
  1.38      +7 -1      apache-1.3/src/ap/Makefile.tmpl

  Index: Makefile.tmpl
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/ap/Makefile.tmpl,v
  retrieving revision 1.37
  retrieving revision 1.38
  diff -u -r1.37 -r1.38
  --- Makefile.tmpl            9 Mar 2001 10:10:12 -0000           1.37
  +++ Makefile.tmpl            18 Jun 2002 00:34:35 -0000          1.38
  @@ -6,7 +6,8 @@
   LIB=libap.a

   OBJS=ap_cpystrn.o ap_execve.o ap_fnmatch.o ap_getpass.o ap_md5c.o
ap_signal.o \
  -     ap_slack.o ap_snprintf.o ap_sha1.o ap_checkpass.o ap_base64.o
ap_ebcdic.o
  +     ap_slack.o ap_snprintf.o ap_sha1.o ap_checkpass.o ap_base64.o
ap_ebcdic.o \
  +     ap_strtol.o

   .c.o:
             $(CC) -c $(INCLUDES) $(CFLAGS) $<
  @@ -72,6 +73,11 @@
    $(INCDIR)/ap_alloc.h $(INCDIR)/buff.h $(INCDIR)/ap.h \
    $(INCDIR)/util_uri.h $(INCDIR)/http_log.h
   ap_snprintf.o: ap_snprintf.c $(INCDIR)/httpd.h $(INCDIR)/ap_config.h \
  + $(INCDIR)/ap_mmn.h $(INCDIR)/ap_config_auto.h $(OSDIR)/os.h \
  + $(OSDIR)/os-inline.c $(INCDIR)/ap_ctype.h $(INCDIR)/hsregex.h \
  + $(INCDIR)/ap_alloc.h $(INCDIR)/buff.h $(INCDIR)/ap.h \
  + $(INCDIR)/util_uri.h
  +ap_strtol.o: ap_strtol.c $(INCDIR)/httpd.h $(INCDIR)/ap_config.h \
    $(INCDIR)/ap_mmn.h $(INCDIR)/ap_config_auto.h $(OSDIR)/os.h \
    $(OSDIR)/os-inline.c $(INCDIR)/ap_ctype.h $(INCDIR)/hsregex.h \
    $(INCDIR)/ap_alloc.h $(INCDIR)/buff.h $(INCDIR)/ap.h \



  1.1                  apache-1.3/src/ap/ap_strtol.c

  Index: ap_strtol.c
  ===================================================================
  /* ====================================================================
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2000-2002 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Apache" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   * Portions of this software are based upon public domain software
   * originally written at the National Center for Supercomputing
Applications,
   * University of Illinois, Urbana-Champaign.
   */
  /*-
   * Copyright (c) 1990, 1993
   *         The Regents of the University of California.  All rights
reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in the
   *    documentation and/or other materials provided with the
distribution.
   * 3. All advertising materials mentioning features or use of this
software
   *    must display the following acknowledgement:
   *         This product includes software developed by the University of
   *         California, Berkeley and its contributors.
   * 4. Neither the name of the University nor the names of its
contributors
   *    may be used to endorse or promote products derived from this
software
   *    without specific prior written permission.
   *
   * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS''
AND
   * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE
   * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
LIABLE
   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL
   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS
   * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
STRICT
   * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
WAY
   * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   */


  #include <limits.h>
  #include <ctype.h>
  #include <errno.h>
  #include <stdlib.h>


  /*
   * Convert a string to a long integer.
   *
   * Assumes that the upper and lower case
   * alphabets and digits are each contiguous.
   */
  long
  ap_strtol(nptr, endptr, base)
             const char *nptr;
             char **endptr;
             int base;
  {
             const char *s;
             unsigned long acc;
             char c;
             unsigned long cutoff;
             int neg, any, cutlim;

             /*
              * Skip white space and pick up leading +/- sign if any.
              * If base is 0, allow 0x for hex and 0 for octal, else
              * assume decimal; if base is already 16, allow 0x.
              */
             s = nptr;
             do {
                         c = *s++;
             } while (ap_isspace((unsigned char)c));
             if (c == '-') {
                         neg = 1;
                         c = *s++;
             } else {
                         neg = 0;
                         if (c == '+')
                                     c = *s++;
             }
             if ((base == 0 || base == 16) &&
                 c == '0' && (*s == 'x' || *s == 'X')) {
                         c = s[1];
                         s += 2;
                         base = 16;
             }
             if (base == 0)
                         base = c == '0' ? 8 : 10;
             acc = any = 0;
             if (base < 2 || base > 36)
                         goto noconv;

             /*
              * Compute the cutoff value between legal numbers and illegal
              * numbers.  That is the largest legal value, divided by the
              * base.  An input number that is greater than this value, if
              * followed by a legal input character, is too big.  One that
              * is equal to this value may be valid or not; the limit
              * between valid and invalid numbers is then based on the last
              * digit.  For instance, if the range for longs is
              * [-2147483648..2147483647] and the input base is 10,
              * cutoff will be set to 214748364 and cutlim to either
              * 7 (neg==0) or 8 (neg==1), meaning that if we have
accumulated
              * a value > 214748364, or equal but the next digit is > 7 (or
8),
              * the number is too big, and we will return a range error.
              *
              * Set 'any' if any `digits' consumed; make it negative to
indicate
              * overflow.
              */
             cutoff = neg ? (unsigned long)-(LONG_MIN + LONG_MAX) +
LONG_MAX
                 : LONG_MAX;
             cutlim = cutoff % base;
             cutoff /= base;
             for ( ; ; c = *s++) {
                         if (c >= '0' && c <= '9')
                                     c -= '0';
                         else if (c >= 'A' && c <= 'Z')
                                     c -= 'A' - 10;
                         else if (c >= 'a' && c <= 'z')
                                     c -= 'a' - 10;
                         else
                                     break;
                         if (c >= base)
                                     break;
                         if (any < 0 || acc > cutoff || (acc == cutoff && c
> cutlim))
                                     any = -1;
                         else {
                                     any = 1;
                                     acc *= base;
                                     acc += c;
                         }
             }
             if (any < 0) {
                         acc = neg ? LONG_MIN : LONG_MAX;
                         errno = ERANGE;
             } else if (!any) {
  noconv:
                         errno = EINVAL;
             } else if (neg)
                         acc = -acc;
             if (endptr != NULL)
                         *endptr = (char *)(any ? s - 1 : nptr);
             return (acc);
  }










Re: cvs commit: apache-1.3/src/ap ap_strtol.c Makefile.tmpl

Posted by "William A. Rowe, Jr." <wr...@rowe-clan.net>.
At 10:14 PM 6/17/2002, Justin Erenkrantz wrote:

>I guess my point was that we could use the system strtol() for
>EBCDIC machines on 1.3 to handle this special case.  Since those
>machines are typically confined to one particular compiler and
>library, we can easily verify that those strtol() implementations
>are correct.
>
>#ifdef CHARSET_EBCDIC
>#define ap_strtol strtol
>#else
>...<whatever we have now based on the BSD code>...
>#endif

Please deposit the #define in the appropriate os.h files, we will mop out
the ap_strtol declaration if the symbol is #defined when we hit ap.h.

Bill



Re: cvs commit: apache-1.3/src/ap ap_strtol.c Makefile.tmpl

Posted by Justin Erenkrantz <je...@apache.org>.
On Mon, Jun 17, 2002 at 11:06:30PM -0400, Jim Jagielski wrote:
> With 2.0, we are lucky because we require not only an ANSI compiler
> but also the full ANSI function suite. That's never been the case
> on 1.3. So, at least with 1.3, we can't assume that strtol() works
> as we require, since we don't require strict ANSI functionality.
> We could have done a NEED_STRTOL, but that would require more
> knowledge than we have right now, I'm afraid.

I guess my point was that we could use the system strtol() for
EBCDIC machines on 1.3 to handle this special case.  Since those
machines are typically confined to one particular compiler and
library, we can easily verify that those strtol() implementations
are correct.

#ifdef CHARSET_EBCDIC
#define ap_strtol strtol
#else
...<whatever we have now based on the BSD code>...
#endif

Just a thought.  -- justin

Re: cvs commit: apache-1.3/src/ap ap_strtol.c Makefile.tmpl

Posted by Justin Erenkrantz <je...@apache.org>.
On Mon, Jun 17, 2002 at 08:38:59PM -0600, David McCreedy wrote:
> 
> The ap_strtol function in ap_strtol.c assumes that A-Z / a-z are contiguous
> ranges (and I'm glad to say it documents this assumption).
> While this is true for ASCII it is NOT true for EBCDIC machines: TPF,
> OS390, and BS2000.
> In EBCDIC, A-I / a-i are contiguous, J-R / j-r are contiguous, and S-Z /
> s-z are contiguous.
> I know this is true for TPF and strongly believe it is also true for OS390
> and BS2000.

Perhaps if strtol is functional on these platforms, we can just
use the native functions?  The key requirement is that strtol
returns errno==ERANGE when an overflow occurs.  This should be
part of any ANSI C compiler and library.  

We are purposefully being overly conservative by replacing all
implementations of strtol.  For httpd-2.0, I feel we can rely on
correct implementations being provided by the system.  And, for
the EBCDIC case, we can easily verify the three-or-so machines'
adherence to the strtol() requirements.  -- justin

Re: cvs commit: apache-1.3/src/ap ap_strtol.c Makefile.tmpl

Posted by Cliff Woolley <jw...@virginia.edu>.
On Mon, 17 Jun 2002, David McCreedy wrote:

> The ap_strtol function in ap_strtol.c assumes that A-Z / a-z are contiguous
> ranges (and I'm glad to say it documents this assumption).
> While this is true for ASCII it is NOT true for EBCDIC machines: TPF,
> OS390, and BS2000.
> In EBCDIC, A-I / a-i are contiguous, J-R / j-r are contiguous, and S-Z /
> s-z are contiguous.
> I know this is true for TPF and strongly believe it is also true for OS390
> and BS2000.

Wow.  :)  Good catch.  Will you author a patch for us?  I don't consider
it a showstopper for 1.3.25, but in the long run, yeah it would be nice to
have fixed.  Just change it for the EBCDIC case... no need to add overhead
for ASCII machines.

Thanks,
Cliff