Ejemplo n.º 1
0
ngx_int_t
ajp_msg_get_string(ajp_msg_t *msg, ngx_str_t *value)
{
    u_char    *start;
    uint16_t   size;
    ngx_int_t  status;
    ngx_buf_t *buf;

    buf = msg->buf;
    status = ajp_msg_get_uint16(msg, &size);

    start = buf->pos;

    if ((status != NGX_OK) || (start + size + 1 > buf->last)) {
        return ajp_log_overflow(msg, "ajp_msg_get_string");
    }

    buf->pos += (size_t)size;
    buf->pos++;   /* a String in AJP is NULL terminated */

    value->data = start;
    value->len = size;

    return NGX_OK;
}
Ejemplo n.º 2
0
/**
 *  Add a String in AJP message, and transform the String in ASCII
 *  if convert is set and we're on an EBCDIC machine
 *
 * @param msg       AJP Message to get value from
 * @param value     Pointer to String
 * @param convert   When set told to convert String to ASCII
 * @return          APR_SUCCESS or error
 */
apr_status_t ajp_msg_append_string_ex(ajp_msg_t *msg, const char *value,
                                      int convert)
{
    apr_size_t len;

    if (value == NULL) {
        return(ajp_msg_append_uint16(msg, 0xFFFF));
    }

    len = strlen(value);
    if ((msg->len + len + 3) > msg->max_size) {
        return ajp_log_overflow(msg, "ajp_msg_append_cvt_string");
    }

    /* ignore error - we checked once */
    ajp_msg_append_uint16(msg, (apr_uint16_t)len);

    /* We checked for space !!  */
    memcpy(msg->buf + msg->len, value, len + 1); /* including \0 */

    if (convert) {
        /* convert from EBCDIC if needed */
        ap_xlate_proto_to_ascii((char *)msg->buf + msg->len, len + 1);
    }

    msg->len += len + 1;

    return APR_SUCCESS;
}
Ejemplo n.º 3
0
/**
 * Peek a 8bits unsigned value from AJP Message, position in message
 * is not updated
 *
 * @param msg       AJP Message to get value from
 * @param rvalue    Pointer where value will be returned
 * @return          APR_SUCCESS or error
 */
apr_status_t ajp_msg_peek_uint8(ajp_msg_t *msg, apr_byte_t *rvalue)
{
    if (msg->pos > msg->len) {
        return ajp_log_overflow(msg, "ajp_msg_peek_uint8");
    }

    *rvalue = msg->buf[msg->pos];
    return APR_SUCCESS;
}
Ejemplo n.º 4
0
ngx_int_t
ajp_msg_get_uint8(ajp_msg_t *msg, u_char *rvalue)
{
    if ((msg->buf->pos + 1) > msg->buf->last) {
        return ajp_log_overflow(msg, "ajp_msg_get_uint8");
    }

    *rvalue = *msg->buf->pos++;

    return NGX_OK;
}
Ejemplo n.º 5
0
/**
 * Add an unsigned 8bits value to AJP Message
 *
 * @param msg       AJP Message to get value from
 * @param value     value to add to AJP Message
 * @return          APR_SUCCESS or error
 */
apr_status_t ajp_msg_append_uint8(ajp_msg_t *msg, apr_byte_t value)
{
    apr_size_t len = msg->len;

    if ((len + 1) > msg->max_size) {
        return ajp_log_overflow(msg, "ajp_msg_append_uint8");
    }

    msg->buf[len] = value;
    msg->len += 1;

    return APR_SUCCESS;
}
Ejemplo n.º 6
0
/**
 * Peek a 16bits unsigned value from AJP Message, position in message
 * is not updated
 *
 * @param msg       AJP Message to get value from
 * @param rvalue    Pointer where value will be returned
 * @return          APR_SUCCESS or error
 */
apr_status_t ajp_msg_peek_uint16(ajp_msg_t *msg, apr_uint16_t *rvalue)
{
    apr_uint16_t value;

    if ((msg->pos + 1) > msg->len) {
        return ajp_log_overflow(msg, "ajp_msg_peek_uint16");
    }

    value = ((msg->buf[(msg->pos)] & 0xFF) << 8);
    value += ((msg->buf[(msg->pos + 1)] & 0xFF));

    *rvalue = value;
    return APR_SUCCESS;
}
Ejemplo n.º 7
0
ngx_int_t
ajp_msg_append_uint8(ajp_msg_t *msg, u_char value)
{
    ngx_buf_t *buf;

    buf = msg->buf;

    if ((buf->last + 1) > buf->end) {
        return ajp_log_overflow(msg, "ajp_msg_append_uint8");
    }

    *buf->last++ = value;

    return NGX_OK;
}
Ejemplo n.º 8
0
/**
 * Add an unsigned 16bits value to AJP Message
 *
 * @param msg       AJP Message to get value from
 * @param value     value to add to AJP Message
 * @return          APR_SUCCESS or error
 */
apr_status_t ajp_msg_append_uint16(ajp_msg_t *msg, apr_uint16_t value)
{
    apr_size_t len = msg->len;

    if ((len + 2) > msg->max_size) {
        return ajp_log_overflow(msg, "ajp_msg_append_uint16");
    }

    msg->buf[len]     = (apr_byte_t)((value >> 8) & 0xFF);
    msg->buf[len + 1] = (apr_byte_t)(value & 0xFF);

    msg->len += 2;

    return APR_SUCCESS;
}
Ejemplo n.º 9
0
ngx_int_t
ajp_msg_append_uint16(ajp_msg_t *msg, uint16_t value)
{
    ngx_buf_t *buf;

    buf = msg->buf;

    if ((buf->last + 2) > buf->end) {
        return ajp_log_overflow(msg, "ajp_msg_append_uint16");
    }

    *buf->last++ = (u_char)((value >> 8) & 0xFF);
    *buf->last++ = (u_char)(value & 0xFF);

    return NGX_OK;
}
Ejemplo n.º 10
0
/**
 * Get a 32bits unsigned value from AJP Message
 *
 * @param msg       AJP Message to get value from
 * @param rvalue    Pointer where value will be returned
 * @return          APR_SUCCESS or error
 */
apr_status_t ajp_msg_get_uint32(ajp_msg_t *msg, apr_uint32_t *rvalue)
{
    apr_uint32_t value;

    if ((msg->pos + 3) > msg->len) {
        return ajp_log_overflow(msg, "ajp_msg_get_uint32");
    }

    value  = ((msg->buf[(msg->pos++)] & 0xFF) << 24);
    value |= ((msg->buf[(msg->pos++)] & 0xFF) << 16);
    value |= ((msg->buf[(msg->pos++)] & 0xFF) << 8);
    value |= ((msg->buf[(msg->pos++)] & 0xFF));

    *rvalue = value;
    return APR_SUCCESS;
}
Ejemplo n.º 11
0
/**
 * Add a Byte array to AJP Message
 *
 * @param msg       AJP Message to get value from
 * @param value     Pointer to Byte array
 * @param valuelen  Byte array len
 * @return          APR_SUCCESS or error
 */
apr_status_t ajp_msg_append_bytes(ajp_msg_t *msg, const apr_byte_t *value,
                                  apr_size_t valuelen)
{
    if (! valuelen) {
        return APR_SUCCESS; /* Shouldn't we indicate an error ? */
    }

    if ((msg->len + valuelen) > msg->max_size) {
        return ajp_log_overflow(msg, "ajp_msg_append_bytes");
    }

    /* We checked for space !!  */
    memcpy(msg->buf + msg->len, value, valuelen);
    msg->len += valuelen;

    return APR_SUCCESS;
}
Ejemplo n.º 12
0
ngx_int_t
ajp_msg_peek_uint16(ajp_msg_t *msg, uint16_t *rvalue)
{
    uint16_t value;
    ngx_buf_t *buf;

    buf = msg->buf;

    if ((buf->pos + 2) > buf->last) {
        return ajp_log_overflow(msg, "ajp_msg_peek_uint16");
    }

    value = ((*buf->pos & 0xFF) << 8);
    value += ((*buf->pos + 1) & 0xFF);

    *rvalue = value;

    return NGX_OK;
}
Ejemplo n.º 13
0
/**
 * Get a String value from AJP Message
 *
 * @param msg       AJP Message to get value from
 * @param rvalue    Pointer where value will be returned
 * @return          APR_SUCCESS or error
 */
apr_status_t ajp_msg_get_string(ajp_msg_t *msg, const char **rvalue)
{
    apr_uint16_t size;
    apr_size_t   start;
    apr_status_t status;

    status = ajp_msg_get_uint16(msg, &size);
    start = msg->pos;

    if ((status != APR_SUCCESS) || (size + start > msg->max_size)) {
        return ajp_log_overflow(msg, "ajp_msg_get_string");
    }

    msg->pos += (apr_size_t)size;
    msg->pos++;                   /* a String in AJP is NULL terminated */

    *rvalue = (const char *)(msg->buf + start);
    return APR_SUCCESS;
}
Ejemplo n.º 14
0
ngx_int_t
ajp_msg_get_uint32(ajp_msg_t *msg, uint32_t *rvalue)
{
    uint32_t   value;
    ngx_buf_t *buf;

    buf = msg->buf;
    if ((buf->pos + 4) > buf->last) {
        return ajp_log_overflow(msg, "ajp_msg_get_uint32");
    }

    value  = ((*buf->pos++ & 0xFF) << 24);
    value |= ((*buf->pos++ & 0xFF) << 16);
    value |= ((*buf->pos++ & 0xFF) << 8);
    value |= ((*buf->pos++ & 0xFF));

    *rvalue = value;

    return NGX_OK;
}
Ejemplo n.º 15
0
/**
 * Get a Byte array from AJP Message
 *
 * @param msg       AJP Message to get value from
 * @param rvalue    Pointer where value will be returned
 * @param rvalueLen Pointer where Byte array len will be returned
 * @return          APR_SUCCESS or error
 */
apr_status_t ajp_msg_get_bytes(ajp_msg_t *msg, apr_byte_t **rvalue,
                               apr_size_t *rvalue_len)
{
    apr_uint16_t size;
    apr_size_t   start;
    apr_status_t status;

    status = ajp_msg_get_uint16(msg, &size);
    /* save the current position */
    start = msg->pos;

    if ((status != APR_SUCCESS) || (size + start > msg->max_size)) {
        return ajp_log_overflow(msg, "ajp_msg_get_bytes");
    }
    msg->pos += (apr_size_t)size;   /* only bytes, no trailer */

    *rvalue     = msg->buf + start;
    *rvalue_len = size;

    return APR_SUCCESS;
}
Ejemplo n.º 16
0
ngx_int_t
ajp_msg_append_string(ajp_msg_t *msg, ngx_str_t *value)
{
    ngx_buf_t *buf;

    if (value == NULL) {
        return(ajp_msg_append_uint16(msg, 0xFFFF));
    }

    buf = msg->buf;

    if ((buf->last + 2 + value->len + 1) > buf->end) {
        return ajp_log_overflow(msg, "ajp_msg_append_cvt_string");
    }

    ajp_msg_append_uint16(msg, (uint16_t) value->len);

    ngx_memcpy(buf->last, value->data, value->len);
    buf->last  += value->len;

    *buf->last++ = '\0';

    return NGX_OK;
}