Hi there. zero knowledge of Oath, just reading through the v35-0001. forgive me if my comments are naive.
+static int +parse_interval(struct async_ctx *actx, const char *interval_str) +{ + double parsed; + int cnt; + + /* + * The JSON lexer has already validated the number, which is stricter than + * the %f format, so we should be good to use sscanf(). + */ + cnt = sscanf(interval_str, "%lf", &parsed); + + if (cnt != 1) + { + /* + * Either the lexer screwed up or our assumption above isn't true, and + * either way a developer needs to take a look. + */ + Assert(cnt == 1); + return 1; /* don't fall through in release builds */ + } + + parsed = ceil(parsed); + + if (parsed < 1) + return actx->debugging ? 0 : 1; + + else if (INT_MAX <= parsed) + return INT_MAX; + + return parsed; +} The above Assert looks very wrong to me. we can also use PG_INT32_MAX, instead of INT_MAX (generally i think PG_INT32_MAX looks more intuitive to me) +/* + * The Device Authorization response, described by RFC 8628: + * + * https://www.rfc-editor.org/rfc/rfc8628#section-3.2 + */ +struct device_authz +{ + char *device_code; + char *user_code; + char *verification_uri; + char *interval_str; + + /* Fields below are parsed from the corresponding string above. */ + int interval; +}; click through the link https://www.rfc-editor.org/rfc/rfc8628#section-3.2 it says " expires_in REQUIRED. The lifetime in seconds of the "device_code" and "user_code". interval OPTIONAL. The minimum amount of time in seconds that the client SHOULD wait between polling requests to the token endpoint. If no value is provided, clients MUST use 5 as the default. " these two fields seem to differ from struct device_authz.