Ejemplo n.º 1
0
int
hstcpcli::response_recv(size_t& num_flds_r)
{
  if (error_code < 0) {
    return error_code;
  }
  clear_error();
  if (num_req_bufd > 0 || num_req_sent == 0 || num_req_rcvd > 0 ||
    response_end_offset != 0) {
    close();
    return set_error(-1, "response_recv: protocol out of sync");
  }
  cur_row_offset = 0;
  num_flds_r = num_flds = 0;
  if (fd.get() < 0) {
    return set_error(-1, "read: closed");
  }
  size_t offset = 0;
  while (true) {
    const char *const lbegin = readbuf.begin() + offset;
    const char *const lend = readbuf.end();
    const char *const nl = memchr_char(lbegin, '\n', lend - lbegin);
    if (nl != 0) {
      offset = (nl + 1) - readbuf.begin();
      break;
    }
    if (read_more() <= 0) {
      close();
      return set_error(-1, "read: eof");
    }
  }
  response_end_offset = offset;
  --num_req_sent;
  ++num_req_rcvd;
  char *start = readbuf.begin();
  char *const finish = start + response_end_offset - 1;
  const size_t resp_code = read_ui32(start, finish);
  skip_one(start, finish);
  num_flds_r = num_flds = read_ui32(start, finish);
  if (resp_code != 0) {
    skip_one(start, finish);
    char *const err_begin = start;
    read_token(start, finish);
    char *const err_end = start;
    std::string e = std::string(err_begin, err_end - err_begin);
    if (e.empty()) {
      e = "unknown_error";
    }
    return set_error(resp_code, e);
  }
  cur_row_offset = start - readbuf.begin();
  DBG(fprintf(stderr, "[%s] ro=%zu eol=%zu\n",
    std::string(readbuf.begin(), readbuf.begin() + response_end_offset)
      .c_str(),
    cur_row_offset, response_end_offset));
  DBG(fprintf(stderr, "RES 0\n"));
  return 0;
}
Ejemplo n.º 2
0
const string_ref *
hstcpcli::get_next_row()
{
  if (num_flds == 0) {
    DBG(fprintf(stderr, "GNR NF 0\n"));
    return 0;
  }
  if (flds.size() < num_flds) {
    flds.resize(num_flds);
  }
  char *start = readbuf.begin() + cur_row_offset;
  char *const finish = readbuf.begin() + response_end_offset - 1;
  if (start >= finish) { /* start[0] == nl */
    DBG(fprintf(stderr, "GNR FIN 0 %p %p\n", start, finish));
    return 0;
  }
  for (size_t i = 0; i < num_flds; ++i) {
    skip_one(start, finish);
    char *const fld_begin = start;
    read_token(start, finish);
    char *const fld_end = start;
    char *wp = fld_begin;
    if (is_null_expression(fld_begin, fld_end)) {
      /* null */
      flds[i] = string_ref();
    } else {
      unescape_string(wp, fld_begin, fld_end); /* in-place */
      flds[i] = string_ref(fld_begin, wp);
    }
  }
  cur_row_offset = start - readbuf.begin();
  return &flds[0];
}
Ejemplo n.º 3
0
const string_ref *
hstcpcli::get_next_row_from_result(hstresult& result)
{
  if (result.num_flds == 0 || result.flds.elements < result.num_flds) {
    DBG(fprintf(stderr, "GNR NF 0\n"));
    return 0;
  }
  char *start = result.readbuf.begin() + result.cur_row_offset;
  char *const finish = result.readbuf.begin() + result.response_end_offset - 1;
  if (start >= finish) { /* start[0] == nl */
    DBG(fprintf(stderr, "GNR FIN 0 %p %p\n", start, finish));
    return 0;
  }
  for (size_t i = 0; i < result.num_flds; ++i) {
    skip_one(start, finish);
    char *const fld_begin = start;
    read_token(start, finish);
    char *const fld_end = start;
    char *wp = fld_begin;
    if (is_null_expression(fld_begin, fld_end)) {
      /* null */
      ((string_ref *) result.flds.buffer)[i] = string_ref();
    } else {
      unescape_string(wp, fld_begin, fld_end); /* in-place */
      ((string_ref *) result.flds.buffer)[i] = string_ref(fld_begin, wp);
    }
  }
  result.cur_row_offset = start - result.readbuf.begin();
  return (string_ref *) result.flds.buffer;
}
Ejemplo n.º 4
0
    virtual void handle_movzx(UByte opcode, size_t word_size) {
        UByte fault;
        UByte modrm;

        skip_one();
        _scanner.get(&modrm);
        fault = modify_rm_reg(modrm);
        _scanner.seek(-1, scanner::SEEK_CUR);
        _scanner.put(fault);
        skip_modrm(fault, word_size);
    }
Ejemplo n.º 5
0
    virtual void handle_mov(UByte opcode, size_t word_size) {

        switch (opcode) {
        case 0x88:
        case 0x8A:
        case 0x89:
        case 0x8E:
        {
            //
            // Modify R/M and REG fields in the MOD R/M byte
            //

            UByte fault;
            UByte modrm;

            _scanner.get(&modrm);

            switch (decode_modrm_mod(modrm)) {
            case 0:
                if (word_size == 4 && decode_modrm_rm(modrm) == 4) {
                    fault = modify_reg(modrm);
                }
                else if (decode_modrm_rm(modrm) == 5) {
                    fault = modify_reg(modrm);
                }
                else {
                    fault = modify_rm_reg(modrm);
                }
                break;
            case 1:
                if (word_size == 4 && decode_modrm_rm(modrm) == 4) {
                    fault = modify_reg(modrm);
                }
                else {
                    fault = modify_rm_reg(modrm);
                }
                break;
            case 2:
                if (word_size == 4 && decode_modrm_rm(modrm) == 4) {
                    fault = modify_reg(modrm);
                }
                else {
                    fault = modify_rm_reg(modrm);
                }
                break;
            case 3:
                fault = modify_rm_reg(modrm);
                break;
            default:
                System.Print(System.WARN, "Unknown modrm");
                return;
            }

            // Inject a fault
            _scanner.seek(-1, scanner::SEEK_CUR);
            _scanner.put(fault);

            // OK. Let's work on the next instruction.
            skip_modrm(fault, word_size);

            break;
        }
        // [SKIP] Segment registers
        case 0x8B:
        case 0x8C:
        {
            UByte   next;
            _scanner.get(&next);
            skip_modrm(next, word_size);
            break;
        }
        // [SKIP] Immediate
        case 0xC6:
        {
            UByte   next;
            _scanner.get(&next);
            skip_modrm(next, word_size);
            skip_one();
            break;
        }
        // [SKIP] Immediate
        case 0xC7:
        {
            UByte   next;
            _scanner.get(&next);
            skip_modrm(next, word_size);
            skip_word(word_size);
            break;
        }
        // [SKIP] 'A' register (i.e. al, ax, eax)
        case 0xA0:
        case 0xA1:
        case 0xA2:
        case 0xA3:
        {
            skip_word(word_size);
            break;
        }
        default:
        {
            // Move imm8 to r8
            if (0xB0 <= opcode && opcode <= 0xB7) {
                UByte fault = opcode;
                while (fault == opcode) {
                    fault = 0xB0 | (static_cast<UByte>(rand()) & 0xF);
                }

                // Inject a fault
                _scanner.seek(-1, scanner::SEEK_CUR);
                _scanner.put(fault);

                // OK. Work on the next instruction.
                skip_one();

                System.Print("FI: MOV(%.2X): Change opcode %.2X\n",
                             opcode, fault);
            }
            // Move imm16/32 to r16/32
            else if (0xB8 <= opcode && opcode <= 0xBF) {
                UByte fault = opcode;
                while (fault == opcode) {
                    fault = 0xB8 | (static_cast<UByte>(rand()) & 0xF);
                }

                // Inject a fault
                _scanner.seek(-1, scanner::SEEK_CUR);
                _scanner.put(fault);

                // OK. Work on the next instruction.
                skip_word(word_size);

                System.Print("FI: MOV(%.2X): Change opcode %.2X\n",
                             opcode, fault);
            }
        }
        } // switch
    }
Ejemplo n.º 6
0
int parse_star(GScanner *scan, struct cat_star *cats)
{
	int havera = 0, havedec = 0, havename = 0, havemag = 0, haveeq = 0;
	GTokenType tok;

	do {
		tok = g_scanner_get_next_token(scan);
//		d3_printf("star ");
//		print_token(scan, tok);
		if (tok == ')')
			continue;
		if (tok != G_TOKEN_SYMBOL) {
//			d3_printf("skip non-symbol\n");
			if (tok == '(')
				skip_list(scan);
			else
				skip_one(scan);
			continue;
		}
		switch(intval(scan)) {
		case SYM_RA:
			tok = g_scanner_get_next_token(scan);
			switch(tok) {
			case G_TOKEN_STRING:
				havera = !dms_to_degrees(stringval(scan),
							  &cats->ra);
				cats->ra *= 15.0;
				break;
			case '-':
				tok = g_scanner_get_next_token(scan);
				if (tok != G_TOKEN_FLOAT)
					break;
				cats->ra = -floatval(scan);
				havera = 1;
				break;
			case G_TOKEN_FLOAT:
				cats->ra = floatval(scan);
				havera = 1;
				break;
			case '(':
				skip_list(scan);
				break;
			default:
				break;
			}
			break;
		case SYM_DEC:
			tok = g_scanner_get_next_token(scan);
			switch(tok) {
			case G_TOKEN_STRING:
				havedec = !dms_to_degrees(stringval(scan),
							  &cats->dec);
				break;
			case '-':
				tok = g_scanner_get_next_token(scan);
				if (tok != G_TOKEN_FLOAT)
					break;
				cats->dec = -floatval(scan);
				havedec = 1;
				break;
			case G_TOKEN_FLOAT:
				cats->dec = floatval(scan);
				havedec = 1;
				break;
			case '(':
				skip_list(scan);
				break;
			default:
				break;
			}
			break;
		case SYM_EQUINOX:
			tok = g_scanner_get_next_token(scan);
			switch(tok) {
			case '-':
				tok = g_scanner_get_next_token(scan);
				if (tok != G_TOKEN_FLOAT)
					break;
				haveeq = 1;
				cats->equinox = -floatval(scan);
				break;
			case G_TOKEN_FLOAT:
				haveeq = 1;
				cats->equinox = floatval(scan);
				break;
			case '(':
				skip_list(scan);
				break;
			default:
				break;
			}
			break;
		case SYM_PERR:
			tok = g_scanner_get_next_token(scan);
			switch(tok) {
			case '-':
				tok = g_scanner_get_next_token(scan);
				if (tok != G_TOKEN_FLOAT)
					break;
				cats->perr = -floatval(scan);
				break;
			case G_TOKEN_FLOAT:
				cats->perr = floatval(scan);
				break;
			case '(':
				skip_list(scan);
				break;
			default:
				break;
			}
			break;
		case SYM_MAG:
			tok = g_scanner_get_next_token(scan);
			switch(tok) {
			case '-':
				tok = g_scanner_get_next_token(scan);
				if (tok != G_TOKEN_FLOAT)
					break;
				cats->mag = -floatval(scan);
				havemag = 1;
				break;
			case G_TOKEN_FLOAT:
				cats->mag = floatval(scan);
				havemag = 1;
				break;
			case '(':
				skip_list(scan);
				break;
			default:
				break;
			}
			break;
		case SYM_SKY:
			tok = g_scanner_get_next_token(scan);
			switch(tok) {
			case '-':
				tok = g_scanner_get_next_token(scan);
				if (tok != G_TOKEN_FLOAT)
					break;
				cats->sky = -floatval(scan);
				cats->flags |= INFO_SKY;
				break;
			case G_TOKEN_FLOAT:
				cats->sky = floatval(scan);
				cats->flags |= INFO_SKY;
				break;
			case '(':
				skip_list(scan);
				break;
			default:
				break;
			}
			break;
		case SYM_DIFFAM:
			tok = g_scanner_get_next_token(scan);
			switch(tok) {
			case '-':
				tok = g_scanner_get_next_token(scan);
				if (tok != G_TOKEN_FLOAT)
					break;
				cats->diffam = -floatval(scan);
				cats->flags |= INFO_DIFFAM;
				break;
			case G_TOKEN_FLOAT:
				cats->diffam = floatval(scan);
				cats->flags |= INFO_DIFFAM;
				break;
			case '(':
				skip_list(scan);
				break;
			default:
				break;
			}
			break;
		case SYM_RESIDUAL:
			tok = g_scanner_get_next_token(scan);
			switch(tok) {
			case '-':
				tok = g_scanner_get_next_token(scan);
				if (tok != G_TOKEN_FLOAT)
					break;
				cats->residual = -floatval(scan);
				cats->flags |= INFO_RESIDUAL;
				break;
			case G_TOKEN_FLOAT:
				cats->residual = floatval(scan);
				cats->flags |= INFO_RESIDUAL;
				break;
			case '(':
				skip_list(scan);
				break;
			default:
				break;
			}
			break;
		case SYM_STDERR:
			tok = g_scanner_get_next_token(scan);
			switch(tok) {
			case '-':
				tok = g_scanner_get_next_token(scan);
				if (tok != G_TOKEN_FLOAT)
					break;
				cats->std_err = -floatval(scan);
				cats->flags |= INFO_STDERR;
				break;
			case G_TOKEN_FLOAT:
				cats->std_err = floatval(scan);
				cats->flags |= INFO_STDERR;
				break;
			case '(':
				skip_list(scan);
				break;
			default:
				break;
			}
			break;
		case SYM_COMMENTS:
			tok = g_scanner_get_next_token(scan);
			switch(tok) {
			case G_TOKEN_STRING:
				cats->comments = strdup(stringval(scan));
				break;
			case '(':
				skip_list(scan);
				break;
			default:
				break;
			}
			break;
		case SYM_SMAGS:
			tok = g_scanner_get_next_token(scan);
			switch(tok) {
			case G_TOKEN_STRING:
				cats->smags = strdup(stringval(scan));
				break;
			case '(':
				skip_list(scan);
				break;
			default:
				break;
			}
			break;
		case SYM_IMAGS:
			tok = g_scanner_get_next_token(scan);
			switch(tok) {
			case G_TOKEN_STRING:
				cats->imags = strdup(stringval(scan));
				break;
			case '(':
				skip_list(scan);
				break;
			default:
				break;
			}
			break;
		case SYM_NAME:
			tok = g_scanner_get_next_token(scan);
			switch(tok) {
			case G_TOKEN_STRING:
				strncpy(cats->name, stringval(scan), CAT_STAR_NAME_SZ);
				havename = 1;
				break;
			case '(':
				skip_list(scan);
				break;
			default:
				break;
			}
			break;
		case SYM_TYPE:
			tok = g_scanner_get_next_token(scan);
			switch(tok) {
			case G_TOKEN_SYMBOL:
				switch(intval(scan)) {
				case SYM_STD:
					cats->flags = (cats->flags & ~CAT_STAR_TYPE_MASK)
						| CAT_STAR_TYPE_APSTD;
					cats->flags &= ~CAT_VARIABLE;
					break;
				case SYM_TGT:
				case SYM_TARGET:
					cats->flags = (cats->flags & ~CAT_STAR_TYPE_MASK)
						| CAT_STAR_TYPE_APSTAR;
					break;
				case SYM_FIELD:
					cats->flags = (cats->flags & ~CAT_STAR_TYPE_MASK)
						| CAT_STAR_TYPE_SREF;
					break;
				case SYM_CATALOG:
					cats->flags = (cats->flags & ~CAT_STAR_TYPE_MASK)
						| CAT_STAR_TYPE_CAT;
					break;
				default:
					break;
				}
				break;
			case '(':
				skip_list(scan);
				break;
			default:
				break;
			}
			break;
		case SYM_FLAGS:
			tok = g_scanner_get_next_token(scan);
			switch(tok) {
			case '(':
				cats->flags |= get_flags_from_list(scan);
				break;
			default:
				break;
			}
			break;
		case SYM_NOISE:
			tok = g_scanner_get_next_token(scan);
			switch(tok) {
			case '(':
				get_noise_from_rcp(scan, cats);
				break;
			default:
				break;
			}
			break;
		case SYM_CENTROID:
			tok = g_scanner_get_next_token(scan);
			switch(tok) {
			case '(':
				get_centroid_from_rcp(scan, cats);
				break;
			default:
				break;
			}
			break;
		default:
			tok = g_scanner_get_next_token(scan);
			switch(tok) {
			case '(':
				skip_list(scan);
				break;
			default:
				break;
			}
			break;
		}
	} while (tok != ')' && tok != G_TOKEN_EOF);
	if (!havemag || cats->mag == 0.0) {
//		mag_from_smags(cats);
	}
	if (!haveeq)
		cats->equinox = 2000.0;
	if (havedec && havera && havename)
		return 0;
	else
		return -1;
}
Ejemplo n.º 7
0
int
hstcpcli::response_recv(size_t& num_flds_r)
{
  if (error_code < 0) {
    return error_code;
  }
  clear_error();
  if (num_req_bufd > 0 || num_req_sent == 0 || num_req_rcvd > 0 ||
    response_end_offset != 0) {
    close();
    return set_error(-1, "response_recv: protocol out of sync");
  }
  cur_row_offset = 0;
  num_flds_r = num_flds = 0;
  if (fd.get() < 0) {
    return set_error(-1, "read: closed");
  }
  size_t offset = 0;
  while (true) {
    const char *const lbegin = readbuf.begin() + offset;
    const char *const lend = readbuf.end();
    if (lbegin < lend)
    {
      const char *const nl = memchr_char(lbegin, '\n', lend - lbegin);
      if (nl != 0) {
        offset += (nl + 1) - lbegin;
        break;
      }
      offset += lend - lbegin;
    }
    if (read_more() <= 0) {
      close();
      error_code = -1;
      return error_code;
    }
  }
  response_end_offset = offset;
  --num_req_sent;
  ++num_req_rcvd;
  char *start = readbuf.begin();
  char *const finish = start + response_end_offset - 1;
  const size_t resp_code = read_ui32(start, finish);
  skip_one(start, finish);
  num_flds_r = num_flds = read_ui32(start, finish);
  if (resp_code != 0) {
    skip_one(start, finish);
    char *const err_begin = start;
    read_token(start, finish);
    char *const err_end = start;
    String e = String(err_begin, err_end - err_begin, &my_charset_bin);
    if (!e.length()) {
      e = String("unknown_error", &my_charset_bin);
    }
    return set_error(resp_code, e);
  }
  cur_row_offset = start - readbuf.begin();
  DBG(fprintf(stderr, "[%s] ro=%zu eol=%zu\n",
    String(readbuf.begin(), readbuf.begin() + response_end_offset)
      .c_str(),
    cur_row_offset, response_end_offset));
  DBG(fprintf(stderr, "RES 0\n"));
  if (flds.max_element < num_flds)
  {
    if (allocate_dynamic(&flds, num_flds))
      return set_error(-1, "out of memory");
  }
  flds.elements = num_flds;
  return 0;
}