#include <arpa/inet.h>
#include <limits.h>
-#include <ctype.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include "containers.h"
#include "ipc.h"
#include "encoding.h"
+#include "ctype.h"
#define COMMENT_CHAR '#'
return true;
}
- if (!isdigit(value[0]))
+ if (!char_is_digit(value[0]))
goto err;
if (strlen(value) > 2 && value[0] == '0' && value[1] == 'x')
dst[WG_KEY_LEN_BASE64 - 1] = '\0';
while ((c = getc(f)) != EOF) {
- if (!isspace(c)) {
+ if (!char_is_space(c)) {
fprintf(stderr, "Found trailing character in key file: `%c'\n", c);
goto out;
}
return true;
}
- if (!isdigit(value[0]))
+ if (!char_is_digit(value[0]))
goto err;
ret = strtoul(value, &end, 10);
}
if (mask) {
- if (!isdigit(mask[0]))
+ if (!char_is_digit(mask[0]))
goto err;
cidr = strtoul(mask, &end, 10);
if (*end || (cidr > 32 && new_allowedip->family == AF_INET) || (cidr > 128 && new_allowedip->family == AF_INET6))
}
for (size_t i = 0; i < len; ++i) {
- if (!isspace(input[i]))
+ if (!char_is_space(input[i]))
line[cleaned_len++] = input[i];
}
if (!cleaned_len)
return NULL;
}
for (i = 0, l = 0; i < t; ++i) {
- if (!isspace(in[i]))
+ if (!char_is_space(in[i]))
out[l++] = in[i];
}
return out;
--- /dev/null
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2015-2020 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
+ *
+ * Specialized constant-time ctype.h reimplementations that aren't locale-specific.
+ */
+
+#ifndef CTYPE_H
+#define CTYPE_H
+
+#include <stdbool.h>
+
+static inline bool char_is_space(int c)
+{
+ unsigned char d = c - 9;
+ return (0x80001FU >> (d & 31)) & (1U >> (d >> 5));
+}
+
+static inline bool char_is_digit(int c)
+{
+ return (unsigned int)(('0' - 1 - c) & (c - ('9' + 1))) >> (sizeof(c) * 8 - 1);
+}
+
+static inline bool char_is_alpha(int c)
+{
+ return (unsigned int)(('a' - 1 - (c | 32)) & ((c | 32) - ('z' + 1))) >> (sizeof(c) * 8 - 1);
+}
+
+#endif
*/
#include <arpa/inet.h>
-#include <ctype.h>
#include <errno.h>
#include <net/if.h>
#include <netdb.h>
#include "containers.h"
#include "curve25519.h"
#include "encoding.h"
+#include "ctype.h"
#ifdef _WIN32
#include "ipc-uapi-windows.h"
#define NUM(max) ({ \
unsigned long long num; \
char *end; \
- if (!isdigit(value[0])) \
+ if (!char_is_digit(value[0])) \
break; \
num = strtoull(value, &end, 10); \
if (*end || num > max) \
struct wgallowedip *new_allowedip;
char *end, *mask = value, *ip = strsep(&mask, "/");
- if (!mask || !isdigit(mask[0]))
+ if (!mask || !char_is_digit(mask[0]))
break;
new_allowedip = calloc(1, sizeof(*new_allowedip));
if (!new_allowedip) {
#include <errno.h>
#include <stdio.h>
-#include <ctype.h>
#include "curve25519.h"
#include "encoding.h"
#include "subcommands.h"
+#include "ctype.h"
int pubkey_main(int argc, char *argv[])
{
for (;;) {
trailing_char = getc(stdin);
- if (!trailing_char || isspace(trailing_char))
+ if (!trailing_char || char_is_space(trailing_char))
continue;
if (trailing_char == EOF)
break;
* Copyright (C) 2015-2020 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
*/
-#include <ctype.h>
#include <stdarg.h>
#include <stddef.h>
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <unistd.h>
+#include "ctype.h"
static bool color_mode(void)
{
if (str[i] == '\x1b' && str[i + 1] == '[') {
str[i] = str[i + 1] = '\0';
for (j = i + 2; j < len; ++j) {
- if (isalpha(str[j]))
+ if (char_is_alpha(str[j]))
break;
str[j] = '\0';
}