joes        2004/07/27 12:48:43

  Modified:    src      apreq_cookie.c
  Log:
  Need to add room for terminating '\0'.
  
  Revision  Changes    Path
  1.30      +12 -133   httpd-apreq-2/src/apreq_cookie.c
  
  Index: apreq_cookie.c
  ===================================================================
  RCS file: /home/cvs/httpd-apreq-2/src/apreq_cookie.c,v
  retrieving revision 1.29
  retrieving revision 1.30
  diff -u -r1.29 -r1.30
  --- apreq_cookie.c    27 Jul 2004 16:58:55 -0000      1.29
  +++ apreq_cookie.c    27 Jul 2004 19:48:42 -0000      1.30
  @@ -445,7 +445,7 @@
       /*  The format string must be large enough to accomodate all
        *  of the cookie attributes.  The current attributes sum to 
        *  ~90 characters (w/ 6-8 padding chars per attr), so anything 
  -     *  over 100 number be fine.
  +     *  over 100 should be fine.
        */
   
       char format[128] = "%s=%s";
  @@ -531,150 +531,29 @@
   APREQ_DECLARE(char*) apreq_cookie_as_string(const apreq_cookie_t *c,
                                               apr_pool_t *p)
   {
  -    char s[APREQ_COOKIE_MAX_LENGTH];
  -    int n = apreq_serialize_cookie(s, APREQ_COOKIE_MAX_LENGTH, c);
  -
  -    if (n < APREQ_COOKIE_MAX_LENGTH)
  -        return apr_pstrmemdup(p, s, n);
  -    else
  -        return NULL;
  +    int n = apreq_cookie_serialize(c, NULL, 0);
  +    char *s = apr_palloc(p, n + 1);
  +    apreq_cookie_serialize(c, s, n + 1);
  +    return s;
   }
   
   APREQ_DECLARE(apr_status_t) apreq_cookie_bake(const apreq_cookie_t *c,
                                                 void *env)
   {
       char *s = apreq_cookie_as_string(c,apreq_env_pool(env));
  -
  -    if (s == NULL) {
  -        apreq_log(APREQ_ERROR APR_EGENERAL, env, 
  -                  "Serialized cookie exceeds APREQ_COOKIE_MAX_LENGTH = %d", 
  -                    APREQ_COOKIE_MAX_LENGTH);
  -        return APR_EGENERAL;
  -    }
  -
       return apreq_env_set_cookie(env, s);
   }
   
   APREQ_DECLARE(apr_status_t) apreq_cookie_bake2(const apreq_cookie_t *c,
                                                  void *env)
   {
  -    char *s = apreq_cookie_as_string(c,apreq_env_pool(env));
  -
  -    if ( s == NULL ) {
  -        apreq_log(APREQ_ERROR APR_EGENERAL, env,
  -                  "Serialized cookie exceeds APREQ_COOKIE_MAX_LENGTH = %d", 
  -                    APREQ_COOKIE_MAX_LENGTH);
  -        return APR_EGENERAL;
  -    }
  -    else if ( c->version == NETSCAPE ) {
  -        apreq_log(APREQ_ERROR APR_EGENERAL, env,
  -                  "Cannot bake2 a Netscape cookie: %s", s);
  -        return APR_EGENERAL;
  -    }
  -
  -    return apreq_env_set_cookie2(env, s);
  -}
  -
  -
  -
  -
  -/* XXX: The functions below belong somewhere else, since they
  -   generally make use of "common conventions" for cookie values. 
  -   (whereas the cookie specs regard values as opaque) */
  -
  -#ifdef NEEDS_A_NEW_HOME
  -
  -void (apreq_cookie_push)(apreq_cookie_t *c, apreq_value_t *v)
  -{
  -    apreq_cookie_push(c,v);
  -}
  +    char *s;
  +    s = apreq_cookie_as_string(c, apreq_env_pool(env));
   
  -void apreq_cookie_addn(apreq_cookie_t *c, char *val, int len)
  -{
  -    apreq_value_t *v = (apreq_value_t *)apr_array_push(c->values.data);
  -    v->data = val;
  -    v->size = len;
  -}
  -
  -void apreq_cookie_add(apreq_cookie_t *c, char *val, int len)
  -{
  -    apr_array_header_t *a = (apr_array_header_t *)c->values.data;
  -    apreq_cookie_addn(c, apr_pstrndup(a->pool, val, len), len);
  -}
  -
  -APREQ_dDECODE(apreq_cookie_decode)
  -{
  -    apr_array_header_t *a;
  -    apreq_value_t *v;
  -    apr_off_t len;
  -    char *word;
  -
  -    word = apr_pstrdup(p,key);
  -    len  = apreq_unescape(word);
  -    if (len <= 0)       /* key size must be > 0 */
  -        return NULL;
  -
  -    a = apr_array_make(p, APREQ_NELTS, sizeof(apreq_value_t));
  -    v = (apreq_value_t *)apr_array_push(a);
  -    v->data = word;
  -    v->size = len;
  -
  -    while ( *val && (word = apr_getword(p, &val, '&')) ) {
  -        len = apreq_unescape(word);
  -        if (len < 0)
  -            return NULL; /* bad escape data */
  -        v = (apreq_value_t *)apr_array_push(a);
  -        v->data = word;
  -        v->size = len;
  -    }
  +    if ( c->version != NETSCAPE )
  +        return apreq_env_set_cookie2(env, s);
   
  -    return a;
  +    apreq_log(APREQ_ERROR APR_EGENERAL, env,
  +              "Cannot bake2 a Netscape cookie: %s", s);
  +    return APR_EGENERAL;
   }
  -
  -static const char c2x_table[] = "0123456789abcdef";
  -APREQ_dENCODE(apreq_cookie_encode)
  -{
  -    apr_size_t len = 0;
  -    char *res, *data;
  -    int i;
  -
  -    if (s == 0)
  -        return apr_pcalloc(p,1);
  -
  -    for (i = 0; i < s; ++i)
  -        len += a[i].size;
  -
  -    res = data = apr_palloc(p, 3*len + a->nelts);
  -
  -    for (i = 0; i < s; ++i) {
  -        apr_size_t n = a[i].size;
  -        const unsigned char *s = (const unsigned char *)a[i].data;
  -
  -        while (n--) {
  -            unsigned c = *s;
  -            if (apr_isalnum(c))
  -                *data++ = c;
  -            else if (c == ' ') 
  -                *data++ = '+';
  -            else {
  -#if APR_CHARSET_EBCDIC
  -                c = apr_xlate_conv_byte(ap_hdrs_to_ascii, (unsigned char)c);
  -#endif
  -                *data++ = '%';
  -                *data++ = c2x_table[c >> 4];
  -                *data++ = c2x_table[c & 0xf];
  -            }
  -            ++s;
  -        }
  -        *data++ = (i == 0) ? '=' : '&';
  -    }
  -
  -    if (s == 1)
  -        data[0] = 0;    /* no value: name= */
  -    else
  -        data[-1] = 0;   /* replace final '&' with '\0' */
  -
  -    return res;
  -}
  -
  -#endif /* NEEDS_A_NEW_HOME */
  
  
  

Reply via email to