Example #1
0
 char hex_digit(const long double value) {
     return hex_digit(static_cast<long>(value));
 }
Example #2
0
static BOOL allow_degraded_mount(BTRFS_UUID* uuid) {
    HANDLE h;
    NTSTATUS Status;
    OBJECT_ATTRIBUTES oa;
    UNICODE_STRING path, adus;
    UINT32 degraded = mount_allow_degraded;
    ULONG i, j, kvfilen, retlen;
    KEY_VALUE_FULL_INFORMATION* kvfi;

    path.Length = path.MaximumLength = registry_path.Length + (37 * sizeof(WCHAR));
    path.Buffer = ExAllocatePoolWithTag(PagedPool, path.Length, ALLOC_TAG);

    if (!path.Buffer) {
        ERR("out of memory\n");
        return FALSE;
    }

    RtlCopyMemory(path.Buffer, registry_path.Buffer, registry_path.Length);
    i = registry_path.Length / sizeof(WCHAR);

    path.Buffer[i] = '\\';
    i++;

    for (j = 0; j < 16; j++) {
        path.Buffer[i] = hex_digit((uuid->uuid[j] & 0xF0) >> 4);
        path.Buffer[i+1] = hex_digit(uuid->uuid[j] & 0xF);

        i += 2;

        if (j == 3 || j == 5 || j == 7 || j == 9) {
            path.Buffer[i] = '-';
            i++;
        }
    }

    InitializeObjectAttributes(&oa, &path, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL);

    kvfilen = (ULONG)offsetof(KEY_VALUE_FULL_INFORMATION, Name[0]) + (255 * sizeof(WCHAR));
    kvfi = ExAllocatePoolWithTag(PagedPool, kvfilen, ALLOC_TAG);
    if (!kvfi) {
        ERR("out of memory\n");
        ExFreePool(path.Buffer);
        return FALSE;
    }

    Status = ZwOpenKey(&h, KEY_QUERY_VALUE, &oa);
    if (Status == STATUS_OBJECT_NAME_NOT_FOUND)
        goto end;
    else if (!NT_SUCCESS(Status)) {
        ERR("ZwOpenKey returned %08x\n", Status);
        goto end;
    }

    adus.Buffer = L"AllowDegraded";
    adus.Length = adus.MaximumLength = sizeof(adus.Buffer) - sizeof(WCHAR);

    if (NT_SUCCESS(ZwQueryValueKey(h, &adus, KeyValueFullInformation, kvfi, kvfilen, &retlen))) {
        if (kvfi->Type == REG_DWORD && kvfi->DataLength >= sizeof(UINT32)) {
            UINT32* val = (UINT32*)((UINT8*)kvfi + kvfi->DataOffset);

            degraded = *val;
        }
    }

    ZwClose(h);

end:
    ExFreePool(kvfi);

    ExFreePool(path.Buffer);

    return degraded;
}
Example #3
0
int
main(int argc, char **argv)
{
	FILE *f;
	const EVP_AEAD *aead = NULL;
	unsigned int line_no = 0, num_tests = 0, j;

	unsigned char bufs[NUM_TYPES][BUF_MAX];
	unsigned int lengths[NUM_TYPES];

	if (argc != 2) {
		fprintf(stderr, "%s <test file.txt>\n", argv[0]);
		return 1;
	}

	f = fopen(argv[1], "r");
	if (f == NULL) {
		perror("failed to open input");
		return 1;
	}

	for (j = 0; j < NUM_TYPES; j++)
		lengths[j] = 0;

	for (;;) {
		char line[4096];
		unsigned int i, type_len = 0;

		unsigned char *buf = NULL;
		unsigned int *buf_len = NULL;

		if (!fgets(line, sizeof(line), f))
			break;

		line_no++;
		if (line[0] == '#')
			continue;

		if (line[0] == '\n' || line[0] == 0) {
			/* Run a test, if possible. */
			char any_values_set = 0;
			for (j = 0; j < NUM_TYPES; j++) {
				if (lengths[j] != 0) {
					any_values_set = 1;
					break;
				}
			}

			if (!any_values_set)
				continue;

			switch (aead_from_name(&aead, bufs[AEAD])) {
			case 0:
				fprintf(stderr, "Skipping test...\n");
				continue;
			case -1:
				fprintf(stderr, "Aborting...\n");
				return 4;
			}

			if (!run_test_case(aead, bufs, lengths, line_no))
				return 4;

			for (j = 0; j < NUM_TYPES; j++)
				lengths[j] = 0;

			num_tests++;
			continue;
		}

		/* Each line looks like:
		 *   TYPE: 0123abc
		 * Where "TYPE" is the type of the data on the line,
		 * e.g. "KEY". */
		for (i = 0; line[i] != 0 && line[i] != '\n'; i++) {
			if (line[i] == ':') {
				type_len = i;
				break;
			}
		}
		i++;

		if (type_len == 0) {
			fprintf(stderr, "Parse error on line %u\n", line_no);
			return 3;
		}

		/* After the colon, there's optional whitespace. */
		for (; line[i] != 0 && line[i] != '\n'; i++) {
			if (line[i] != ' ' && line[i] != '\t')
				break;
		}

		line[type_len] = 0;
		for (j = 0; j < NUM_TYPES; j++) {
			if (strcmp(line, NAMES[j]) != 0)
				continue;
			if (lengths[j] != 0) {
				fprintf(stderr, "Duplicate value on line %u\n",
				    line_no);
				return 3;
			}
			buf = bufs[j];
			buf_len = &lengths[j];
			break;
		}

		if (buf == NULL) {
			fprintf(stderr, "Unknown line type on line %u\n",
			    line_no);
			return 3;
		}

		if (j == AEAD) {
			*buf_len = strlcpy(buf, line + i, BUF_MAX);
			for (j = 0; j < BUF_MAX; j++) {
				if (buf[j] == '\n')
					buf[j] = '\0';
			}
			continue;
		}

		for (j = 0; line[i] != 0 && line[i] != '\n'; i++) {
			unsigned char v, v2;
			v = hex_digit(line[i++]);
			if (line[i] == 0 || line[i] == '\n') {
				fprintf(stderr, "Odd-length hex data on "
				    "line %u\n", line_no);
				return 3;
			}
			v2 = hex_digit(line[i]);
			if (v > 15 || v2 > 15) {
				fprintf(stderr, "Invalid hex char on line %u\n",
				    line_no);
				return 3;
			}
			v <<= 4;
			v |= v2;

			if (j == BUF_MAX) {
				fprintf(stderr, "Too much hex data on line %u "
				    "(max is %u bytes)\n",
				    line_no, (unsigned) BUF_MAX);
				return 3;
			}
			buf[j++] = v;
			*buf_len = *buf_len + 1;
		}
	}

	printf("Completed %u test cases\n", num_tests);
	printf("PASS\n");
	fclose(f);

	return 0;
}
Example #4
0
static BOOL fs_ignored(BTRFS_UUID* uuid) {
    UNICODE_STRING path, ignoreus;
    NTSTATUS Status;
    OBJECT_ATTRIBUTES oa;
    KEY_VALUE_FULL_INFORMATION* kvfi;
    ULONG dispos, retlen, kvfilen, i, j;
    HANDLE h;
    BOOL ret = FALSE;

    path.Length = path.MaximumLength = registry_path.Length + (37 * sizeof(WCHAR));

    path.Buffer = ExAllocatePoolWithTag(PagedPool, path.Length, ALLOC_TAG);
    if (!path.Buffer) {
        ERR("out of memory\n");
        return FALSE;
    }

    RtlCopyMemory(path.Buffer, registry_path.Buffer, registry_path.Length);

    i = registry_path.Length / sizeof(WCHAR);

    path.Buffer[i] = '\\';
    i++;

    for (j = 0; j < 16; j++) {
        path.Buffer[i] = hex_digit((uuid->uuid[j] & 0xF0) >> 4);
        path.Buffer[i+1] = hex_digit(uuid->uuid[j] & 0xF);

        i += 2;

        if (j == 3 || j == 5 || j == 7 || j == 9) {
            path.Buffer[i] = '-';
            i++;
        }
    }

    InitializeObjectAttributes(&oa, &path, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL);

    Status = ZwCreateKey(&h, KEY_QUERY_VALUE, &oa, 0, NULL, REG_OPTION_NON_VOLATILE, &dispos);

    if (!NT_SUCCESS(Status)) {
        TRACE("ZwCreateKey returned %08x\n", Status);
        ExFreePool(path.Buffer);
        return FALSE;
    }

    RtlInitUnicodeString(&ignoreus, L"Ignore");

    kvfilen = (ULONG)offsetof(KEY_VALUE_FULL_INFORMATION, Name[0]) + (255 * sizeof(WCHAR));
    kvfi = ExAllocatePoolWithTag(PagedPool, kvfilen, ALLOC_TAG);
    if (!kvfi) {
        ERR("out of memory\n");
        ZwClose(h);
        ExFreePool(path.Buffer);
        return FALSE;
    }

    Status = ZwQueryValueKey(h, &ignoreus, KeyValueFullInformation, kvfi, kvfilen, &retlen);
    if (NT_SUCCESS(Status)) {
        if (kvfi->Type == REG_DWORD && kvfi->DataLength >= sizeof(UINT32)) {
            UINT32* pr = (UINT32*)((UINT8*)kvfi + kvfi->DataOffset);

            ret = *pr;
        }
    }

    ZwClose(h);
    ExFreePool(kvfi);
    ExFreePool(path.Buffer);

    return ret;
}
Example #5
0
	string String::fromJsonRaw(std::istream& is) {
		ostringstream oss{};
		StringState state = StringState::NORMAL;
		unsigned int u = 0;
		int next_ch = skipWhitespace(is);
		if (next_ch != '"')
			throw runtime_error(
			"Invalid input: Expected '\"', got: '" +
			to_string(static_cast<char>(next_ch)) + "'");
		readChar(is);
		while (state != StringState::STRING_CLOSED) {
			next_ch = is.peek();
			if (next_ch == -1)
				break;
			switch (state) {
			case StringState::NORMAL:
				switch (next_ch) {
				case '\\':
					state = StringState::ESCAPE;
					readChar(is);
					break;
				case '"':
					state = StringState::STRING_CLOSED;
					readChar(is);
					break;
				default:
					oss << static_cast<char>(next_ch);
					readChar(is);
					break;
				} // end switch(ch) //
				break;

			case StringState::ESCAPE:
				switch (next_ch) {
				case '"':
					oss << '"';
					state = StringState::NORMAL;
					readChar(is);
					break;
				case '\\':
					oss << '\\';
					state = StringState::NORMAL;
					readChar(is);
					break;
				case '/':
					oss << '/';
					state = StringState::NORMAL;
					readChar(is);
					break;
				case 'b':
					oss << '\b';
					state = StringState::NORMAL;
					readChar(is);
					break;
				case 'f':
					oss << '\f';
					state = StringState::NORMAL;
					readChar(is);
					break;
				case 'n':
					oss << '\n';
					state = StringState::NORMAL;
					readChar(is);
					break;
				case 'r':
					oss << '\r';
					state = StringState::NORMAL;
					readChar(is);
					break;
				case 't':
					oss << '\t';
					state = StringState::NORMAL;
					readChar(is);
					break;
				case 'u':
					oss << '\b';
					state = StringState::U0;
					readChar(is);
					break;
				default:
					throw runtime_error(
						"Invalid escape sequence \"\\" +
						to_string(static_cast<char>(next_ch)) + "\"");
				} // end switch(ch)
				break;
			case StringState::U0:
				u = hex_digit(static_cast<char>(next_ch));
				state = StringState::U1;
				readChar(is);
				break;
			case StringState::U1:
				u = (16 * u) + hex_digit(static_cast<char>(next_ch));
				state = StringState::U2;
				readChar(is);
				break;
			case StringState::U2:
				u = (16 * u) + hex_digit(static_cast<char>(next_ch));
				state = StringState::U3;
				readChar(is);
				break;
			case StringState::U3:
				u = (16 * u) + hex_digit(static_cast<char>(next_ch));
				oss << static_cast<char>(u);
				state = StringState::NORMAL;
				readChar(is);
				break;
			default:
				throw runtime_error("ReadString: Invalid state " +
					to_string(static_cast<int>(state)));
			} // end switch(state) //
		} // end for //
		if (state != StringState::STRING_CLOSED)
			throw runtime_error("String not closed in state " +
			to_string(static_cast<int>(state)));
		return oss.str();
	}
Example #6
0
static value_t read_string(void)
{
    char *buf, *temp;
    char eseq[10];
    size_t i=0, j, sz = 64, ndig;
    int c;
    value_t s;
    u_int32_t wc=0;

    buf = malloc(sz);
    while (1) {
        if (i >= sz-4) {  // -4: leaves room for longest utf8 sequence
            sz *= 2;
            temp = realloc(buf, sz);
            if (temp == NULL) {
                free(buf);
                lerror(ParseError, "read: out of memory reading string");
            }
            buf = temp;
        }
        c = ios_getc(F);
        if (c == IOS_EOF) {
            free(buf);
            lerror(ParseError, "read: unexpected end of input in string");
        }
        if (c == '"')
            break;
        else if (c == '\\') {
            c = ios_getc(F);
            if (c == IOS_EOF) {
                free(buf);
                lerror(ParseError, "read: end of input in escape sequence");
            }
            j=0;
            if (octal_digit(c)) {
                do {
                    eseq[j++] = c;
                    c = ios_getc(F);
                } while (octal_digit(c) && j<3 && (c!=IOS_EOF));
                if (c!=IOS_EOF) ios_ungetc(c, F);
                eseq[j] = '\0';
                wc = strtol(eseq, NULL, 8);
                // \DDD and \xXX read bytes, not characters
                buf[i++] = ((char)wc);
            }
            else if ((c=='x' && (ndig=2)) ||
                     (c=='u' && (ndig=4)) ||
                     (c=='U' && (ndig=8))) {
                c = ios_getc(F);
                while (hex_digit(c) && j<ndig && (c!=IOS_EOF)) {
                    eseq[j++] = c;
                    c = ios_getc(F);
                }
                if (c!=IOS_EOF) ios_ungetc(c, F);
                eseq[j] = '\0';
                if (j) wc = strtol(eseq, NULL, 16);
                if (!j || wc > 0x10ffff) {
                    free(buf);
                    lerror(ParseError, "read: invalid escape sequence");
                }
                if (ndig == 2)
                    buf[i++] = ((char)wc);
                else
                    i += u8_wc_toutf8(&buf[i], wc);
            }
            else {
                buf[i++] = read_escape_control_char((char)c);
            }
        }
        else {
            buf[i++] = c;
        }
    }
    s = cvalue_string(i);
    memcpy(cvalue_data(s), buf, i);
    free(buf);
    return s;
}