示例#1
0
void free_session_slot(struct session_slot_table *sst, int slotid,
		       uint32_t server_highest, uint32_t target_highest,
		       bool sent)
{
	pthread_mutex_lock(&sst->mutex);
	assert(!bs_get(sst->free_slots, slotid));
	bs_set(sst->free_slots, slotid);
	if (slotid + 1 == sst->highest_used_slotid_plus1) {
		int s = slotid - 1;
		while (s >= 0 && bs_get(sst->free_slots, s))
			--s;
		sst->highest_used_slotid_plus1 = s + 1;
	}
	if (sent) {
		assert(server_highest + 1 >= sst->highest_used_slotid_plus1);
		sst->server_highest_slotid = server_highest;
		sst->target_highest_slotid = target_highest;
		/* increment sequenceid */
		atomic_inc_uint32_t(sst->slots + slotid);
	}
	if (slotid <= target_highest) {
		pthread_cond_signal(&sst->slot_cv);
	}
	pthread_mutex_unlock(&sst->mutex);
}
示例#2
0
int /* Returns number of bytes in in_bytes used to generate dvi_samples */
vdvi_decode(bitstream_t *bs, unsigned char *dvi_buf, unsigned int dvi_samples)
{
        u_char cw, cb;
        unsigned int i, j, bytes_used;
        
        /* This code is ripe for optimization ... */
        assert(dvi_samples == VDVI_SAMPLES_PER_FRAME);

        for(j = 0; j < dvi_samples; j++) {
#ifdef TEST_DVI
                check_padding();
#endif
                cb = 2;
                cw = bs_get(bs, 2);
                do {
                        for(i = 0; i < 16; i++) {
                                if (dmap_bits[i] != cb) continue;
                                if (dmap[i] == cw) goto dvi_out_pack;
                        }
                        cb++;
                        cw <<=1;
                        cw |= bs_get(bs, 1);
                        assert(cb <= 8);
#ifdef TEST_DVI
                check_padding();
#endif
                } while(1);
        dvi_out_pack:
#ifdef TEST_DVI
                check_padding();
#endif
                if (j & 0x01) {
                        dvi_buf[j/2] |= i;
                } else {
                        dvi_buf[j/2]  = i << 4;
                }
#ifdef TEST_DVI
                check_padding();
#endif
        }

        bytes_used = bs_bytes_used(bs);

        assert(bytes_used <= dvi_samples);
        return bytes_used;
}
示例#3
0
int main() {
	char *d;
	struct bs s;

	bs_init(&s,10);

	bs_add(&s,"aa");
	bs_add(&s,"ab");
	bs_add(&s,"ac");
	bs_add(&s,"ad123456789");

	bs_get(&s,&d);
	printf("ret \"%s\"\n",d);
	bs_get(&s,&d);
	printf("ret \"%s\"\n",d);
	bs_get(&s,&d);
	printf("ret \"%s\"\n",d);
	bs_get(&s,&d);
	printf("ret \"%s\"\n",d);
	bs_get(&s,&d);
	printf("ret \"%s\"\n",d);
	bs_get(&s,&d);
	printf("ret \"%s\"\n",d);
	bs_get(&s,&d);
	printf("ret \"%s\"\n",d);
}
示例#4
0
static err_status_t
probe_csbh(csbh_context_t *ctx, void *buf, unsigned long buf_len)
{
    buffer_stream_t bs;
    csbh_header_t *header;
    csbh_rsa_pubkey_t *pubkey;
    csbh_rsa_signature_t *sig;
    void *body;
    csbh_internal_t *priv;
    unsigned long body_size, pad_size;
    err_status_t err;

    if (!ctx || !buf || !buf_len)
        return CLN_FW_ERR_INVALID_PARAMETER;

    bs_init(&bs, buf, buf_len);

    err = bs_post_get(&bs, (void **)&header, sizeof(*header));
    if (is_err_status(err)) {
        err(T("The length is not expected for searching CSBH header\n"));
        return err;
    }

    if (header->Identifier != CSBH_IDENTIFIER) {
        err(T("Failed to locate CSBH\n"));
        return CLN_FW_ERR_INVALID_CSBH;
    }

    if (header->Version != CSBH_VERSION) {
        err(T("Invalid CSBH version: 0x%08x\n"), header->Version);
        return CLN_FW_ERR_INVALID_CSBH;
    }

    if (header->ModuleHeaderSize < sizeof(*header) + sizeof(csbh_rsa_pubkey_t)
            + sizeof(csbh_rsa_signature_t)) {
        err(T("Invalid module header size: 0x%08x\n"), header->ModuleHeaderSize);
        return CLN_FW_ERR_INVALID_CSBH;
    }

    pad_size = header->ModuleHeaderSize -
               (sizeof(*header) + sizeof(csbh_rsa_pubkey_t) +
                sizeof(csbh_rsa_signature_t));

    if (header->ModuleSize < header->ModuleHeaderSize) {
        err(T("Invalid Module size: 0x%08x\n"), header->ModuleSize);
        return CLN_FW_ERR_INVALID_CSBH;
    }

    body_size = header->ModuleSize - header->ModuleHeaderSize;
    if (!aligned(body_size, 64)) {
        err(T("Body size not 64-bit aligned: 0x%lx\n"), body_size);
        return CLN_FW_ERR_INVALID_CSBH;
    }

    if ((header->ReservedModuleVendor != CSBH_MODULE_VENDOR) && cln_fw_verbose())
        warn(T("Module Vendor should be reserved: 0x%08x\n"),
             header->ReservedModuleVendor);

    if (header->HashAlgorithm != CSBH_HASH_ALGO_SHA256) {
        err(T("Invalid hash algorithm: 0x%08x\n"), header->HashAlgorithm);
        return CLN_FW_ERR_INVALID_CSBH;
    }

    if (header->CryptoAlgorithm != CSBH_CRYPTO_ALGO_RSA2048) {
        err(T("Invalid crypto algorithm: 0x%08x\n"), header->CryptoAlgorithm);
        return CLN_FW_ERR_INVALID_CSBH;
    }

    if (header->KeySize != sizeof(csbh_rsa_pubkey_t)) {
        err(T("Invalid key size: 0x%08x\n"),
            header->KeySize);
        return CLN_FW_ERR_INVALID_CSBH;
    }

    if (header->SignatureSize != sizeof(csbh_rsa_signature_t)) {
        err(T("Invalid signature size: 0x%08x\n"),
            header->SignatureSize);
        return CLN_FW_ERR_INVALID_CSBH;
    }

    err = bs_post_get(&bs, (void **)&pubkey, sizeof(*pubkey));
    if (is_err_status(err)) {
        err(T("Cannot locate CSBH public key\n"));
        return err;
    }

    err = bs_post_get(&bs, (void **)&sig, sizeof(*sig));
    if (is_err_status(err)) {
        err(T("Cannot locate CSBH signature\n"));
        return err;
    }

    err = bs_seek(&bs, pad_size);
    if (is_err_status(err)) {
        err(T("Cannot locate CSBH header pad\n"));
        return err;
    }

    err = bs_get(&bs, (void **)&body, body_size);
    if (is_err_status(err)) {
        err(T("Cannot locate CSBH body\n"));
        return err;
    }

    priv = eee_malloc(sizeof(*priv));
    if (!priv)
        return CLN_FW_ERR_OUT_OF_MEM;

    ctx->csbh_size = header->ModuleSize;
    ctx->body_size = body_size;

    priv->header = header;
    priv->pubkey = pubkey;
    priv->signature = sig;
    priv->body = body;
    ctx->priv = priv;

    return CLN_FW_ERR_NONE;
}