flag,json,net: handle C calls in .v files (part of enabling -W impure-v as default) (#19779)

This commit is contained in:
JalonSolov 2023-11-06 07:27:00 -05:00 committed by GitHub
parent 1e25d45243
commit 01022e918e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
21 changed files with 50 additions and 50 deletions

View file

@ -239,11 +239,11 @@ pub fn new_test_session(_vargs string, will_compile bool) TestSession {
skip_files << 'examples/macos_tray/tray.v' skip_files << 'examples/macos_tray/tray.v'
} }
if testing.github_job == 'ubuntu-docker-musl' { if testing.github_job == 'ubuntu-docker-musl' {
skip_files << 'vlib/net/openssl/openssl_compiles_test.v' skip_files << 'vlib/net/openssl/openssl_compiles_test.c.v'
skip_files << 'vlib/x/ttf/ttf_test.v' skip_files << 'vlib/x/ttf/ttf_test.v'
} }
if testing.github_job == 'tests-sanitize-memory-clang' { if testing.github_job == 'tests-sanitize-memory-clang' {
skip_files << 'vlib/net/openssl/openssl_compiles_test.v' skip_files << 'vlib/net/openssl/openssl_compiles_test.c.v'
} }
if testing.github_job != 'misc-tooling' { if testing.github_job != 'misc-tooling' {
// These examples need .h files that are produced from the supplied .glsl files, // These examples need .h files that are produced from the supplied .glsl files,

View file

@ -271,7 +271,7 @@ const (
'vlib/net/unix/unix_test.v', 'vlib/net/unix/unix_test.v',
'vlib/net/unix/use_net_and_net_unix_together_test.v', 'vlib/net/unix/use_net_and_net_unix_together_test.v',
'vlib/net/websocket/websocket_test.v', 'vlib/net/websocket/websocket_test.v',
'vlib/net/openssl/openssl_compiles_test.v', 'vlib/net/openssl/openssl_compiles_test.c.v',
'vlib/net/http/request_test.v', 'vlib/net/http/request_test.v',
'vlib/net/smtp/smtp_test.v', 'vlib/net/smtp/smtp_test.v',
'vlib/net/ssl/ssl_compiles_test.v', 'vlib/net/ssl/ssl_compiles_test.v',

View file

@ -10,9 +10,10 @@ fn testsuite_begin() {
res := os.execute('${os.quoted_path(@VEXE)} -o ${os.quoted_path(the_executable)} ${os.quoted_path(the_source)}') res := os.execute('${os.quoted_path(@VEXE)} -o ${os.quoted_path(the_executable)} ${os.quoted_path(the_source)}')
assert res.exit_code == 0 assert res.exit_code == 0
assert os.execute(os.quoted_path(the_executable)).exit_code == 0 assert os.execute(os.quoted_path(the_executable)).exit_code == 0
C.atexit(fn () { }
fn testsuite_end() {
os.rm(the_executable) or {} os.rm(the_executable) or {}
})
} }
fn normalise_lines(lines []string) string { fn normalise_lines(lines []string) string {

View file

@ -154,3 +154,37 @@ fn init() {
pub const ( pub const (
is_used = 1 is_used = 1
) )
// ssl_error returns non error ssl code or error if unrecoverable and we should panic
fn ssl_error(ret int, ssl voidptr) !SSLError {
res := C.SSL_get_error(ssl, ret)
$if trace_ssl ? {
eprintln('${@METHOD} ret: ${ret} | ssl: ${ssl:x} | res: ${res}')
}
match unsafe { SSLError(res) } {
.ssl_error_syscall {
return error_with_code('unrecoverable syscall (${res})', res)
}
.ssl_error_ssl {
return error_with_code('unrecoverable ssl protocol error (${res})', res)
}
else {
return unsafe { SSLError(res) }
}
}
}
enum SSLError {
ssl_error_none = 0 // SSL_ERROR_NONE
ssl_error_ssl = 1 // SSL_ERROR_SSL
ssl_error_want_read = 2 // SSL_ERROR_WANT_READ
ssl_error_want_write = 3 // SSL_ERROR_WANT_WRITE
ssl_error_want_x509_lookup = 4 // SSL_ERROR_WANT_X509_LOOKUP
ssl_error_syscall = 5 // SSL_ERROR_SYSCALL
ssl_error_zero_return = 6 // SSL_ERROR_ZERO_RETURN
ssl_error_want_connect = 7 // SSL_ERROR_WANT_CONNECT
ssl_error_want_accept = 8 // SSL_ERROR_WANT_ACCEPT
ssl_error_want_async = 9 // SSL_ERROR_WANT_ASYNC
ssl_error_want_async_job = 10 // SSL_ERROR_WANT_ASYNC_JOB
ssl_error_want_early = 11 // SSL_ERROR_WANT_EARLY
}

View file

@ -1,35 +0,0 @@
module openssl
// ssl_error returns non error ssl code or error if unrecoverable and we should panic
fn ssl_error(ret int, ssl voidptr) !SSLError {
res := C.SSL_get_error(ssl, ret)
$if trace_ssl ? {
eprintln('${@METHOD} ret: ${ret} | ssl: ${ssl:x} | res: ${res}')
}
match unsafe { SSLError(res) } {
.ssl_error_syscall {
return error_with_code('unrecoverable syscall (${res})', res)
}
.ssl_error_ssl {
return error_with_code('unrecoverable ssl protocol error (${res})', res)
}
else {
return unsafe { SSLError(res) }
}
}
}
enum SSLError {
ssl_error_none = 0 // SSL_ERROR_NONE
ssl_error_ssl = 1 // SSL_ERROR_SSL
ssl_error_want_read = 2 // SSL_ERROR_WANT_READ
ssl_error_want_write = 3 // SSL_ERROR_WANT_WRITE
ssl_error_want_x509_lookup = 4 // SSL_ERROR_WANT_X509_LOOKUP
ssl_error_syscall = 5 // SSL_ERROR_SYSCALL
ssl_error_zero_return = 6 // SSL_ERROR_ZERO_RETURN
ssl_error_want_connect = 7 // SSL_ERROR_WANT_CONNECT
ssl_error_want_accept = 8 // SSL_ERROR_WANT_ACCEPT
ssl_error_want_async = 9 // SSL_ERROR_WANT_ASYNC
ssl_error_want_async_job = 10 // SSL_ERROR_WANT_ASYNC_JOB
ssl_error_want_early = 11 // SSL_ERROR_WANT_EARLY
}

View file

@ -264,11 +264,11 @@ pub fn (mut ws Client) write_ptr(bytes &u8, payload_len int, code OPCode) !int {
} else if payload_len > 125 && payload_len <= 0xffff { } else if payload_len > 125 && payload_len <= 0xffff {
len16 := conv.hton16(u16(payload_len)) len16 := conv.hton16(u16(payload_len))
header[1] = 126 header[1] = 126
unsafe { C.memcpy(&header[2], &len16, 2) } unsafe { vmemcpy(&header[2], &len16, 2) }
} else if payload_len > 0xffff && payload_len <= 0x7fffffff { } else if payload_len > 0xffff && payload_len <= 0x7fffffff {
len_bytes := htonl64(u64(payload_len)) len_bytes := htonl64(u64(payload_len))
header[1] = 127 header[1] = 127
unsafe { C.memcpy(&header[2], len_bytes.data, 8) } unsafe { vmemcpy(&header[2], len_bytes.data, 8) }
} }
} else { } else {
if payload_len <= 125 { if payload_len <= 125 {
@ -280,7 +280,7 @@ pub fn (mut ws Client) write_ptr(bytes &u8, payload_len int, code OPCode) !int {
} else if payload_len > 125 && payload_len <= 0xffff { } else if payload_len > 125 && payload_len <= 0xffff {
len16 := conv.hton16(u16(payload_len)) len16 := conv.hton16(u16(payload_len))
header[1] = (126 | 0x80) header[1] = (126 | 0x80)
unsafe { C.memcpy(&header[2], &len16, 2) } unsafe { vmemcpy(&header[2], &len16, 2) }
header[4] = masking_key[0] header[4] = masking_key[0]
header[5] = masking_key[1] header[5] = masking_key[1]
header[6] = masking_key[2] header[6] = masking_key[2]
@ -288,7 +288,7 @@ pub fn (mut ws Client) write_ptr(bytes &u8, payload_len int, code OPCode) !int {
} else if payload_len > 0xffff && payload_len <= 0x7fffffff { } else if payload_len > 0xffff && payload_len <= 0x7fffffff {
len64 := htonl64(u64(payload_len)) len64 := htonl64(u64(payload_len))
header[1] = (127 | 0x80) header[1] = (127 | 0x80)
unsafe { C.memcpy(&header[2], len64.data, 8) } unsafe { vmemcpy(&header[2], len64.data, 8) }
header[10] = masking_key[0] header[10] = masking_key[0]
header[11] = masking_key[1] header[11] = masking_key[1]
header[12] = masking_key[2] header[12] = masking_key[2]
@ -301,9 +301,9 @@ pub fn (mut ws Client) write_ptr(bytes &u8, payload_len int, code OPCode) !int {
len := header.len + payload_len len := header.len + payload_len
mut frame_buf := []u8{len: len} mut frame_buf := []u8{len: len}
unsafe { unsafe {
C.memcpy(&frame_buf[0], &u8(header.data), header.len) vmemcpy(&frame_buf[0], &u8(header.data), header.len)
if payload_len > 0 { if payload_len > 0 {
C.memcpy(&frame_buf[header.len], bytes, payload_len) vmemcpy(&frame_buf[header.len], bytes, payload_len)
} }
} }
if !ws.is_server { if !ws.is_server {
@ -396,14 +396,14 @@ fn (mut ws Client) send_control_frame(code OPCode, frame_typ string, payload []u
if payload.len >= 2 { if payload.len >= 2 {
if !ws.is_server { if !ws.is_server {
mut parsed_payload := []u8{len: payload.len + 1} mut parsed_payload := []u8{len: payload.len + 1}
unsafe { C.memcpy(parsed_payload.data, &payload[0], payload.len) } unsafe { vmemcpy(parsed_payload.data, &payload[0], payload.len) }
parsed_payload[payload.len] = `\0` parsed_payload[payload.len] = `\0`
for i in 0 .. payload.len { for i in 0 .. payload.len {
control_frame[6 + i] = (parsed_payload[i] ^ masking_key[i % 4]) & 0xff control_frame[6 + i] = (parsed_payload[i] ^ masking_key[i % 4]) & 0xff
} }
unsafe { parsed_payload.free() } unsafe { parsed_payload.free() }
} else { } else {
unsafe { C.memcpy(&control_frame[2], &payload[0], payload.len) } unsafe { vmemcpy(&control_frame[2], &payload[0], payload.len) }
} }
} }
} else { } else {
@ -415,7 +415,7 @@ fn (mut ws Client) send_control_frame(code OPCode, frame_typ string, payload []u
} }
} else { } else {
if payload.len > 0 { if payload.len > 0 {
unsafe { C.memcpy(&control_frame[2], &payload[0], payload.len) } unsafe { vmemcpy(&control_frame[2], &payload[0], payload.len) }
} }
} }
} }