net/win32-ssl: repairs for RacketCS

This commit is contained in:
Matthew Flatt 2018-03-24 07:04:31 -06:00
parent 7fd6e07ad7
commit 1803e647e1
2 changed files with 20 additions and 11 deletions

View File

@ -276,8 +276,8 @@
;; To stream communication during protocol set-up: ;; To stream communication during protocol set-up:
(define buffer-size 4096) (define buffer-size 4096)
(define buffer (make-sized-byte-string (malloc buffer-size 'atomic-interior) (define buffer (malloc buffer-size 'atomic-interior))
buffer-size)) (define tmp-buffer (make-bytes buffer-size))
(call-as-atomic (call-as-atomic
(lambda () (lambda ()
@ -355,8 +355,8 @@
(call-as-nonatomic (call-as-nonatomic
(lambda () (lambda ()
(log-win32-ssl-debug "init context: write ~a" (SecBuffer-cbBuffer out-sb0)) (log-win32-ssl-debug "init context: write ~a" (SecBuffer-cbBuffer out-sb0))
(write-bytes (make-sized-byte-string (SecBuffer-pvBuffer out-sb0) (write-bytes (pointer->bytes (SecBuffer-pvBuffer out-sb0)
(SecBuffer-cbBuffer out-sb0)) (SecBuffer-cbBuffer out-sb0))
o) o)
(flush-output o))) (flush-output o)))
(FreeContextBuffer (SecBuffer-pvBuffer out-sb0)))) (FreeContextBuffer (SecBuffer-pvBuffer out-sb0))))
@ -376,7 +376,7 @@
(log-win32-ssl-debug "init context: done") (log-win32-ssl-debug "init context: done")
(values ctx (values ctx
(let ([n (get-leftover-bytes)]) (let ([n (get-leftover-bytes)])
(subbytes buffer 0 n)))] (pointer->bytes buffer n)))]
[(or (= r SEC_I_CONTINUE_NEEDED) [(or (= r SEC_I_CONTINUE_NEEDED)
(= r SEC_E_INCOMPLETE_MESSAGE)) (= r SEC_E_INCOMPLETE_MESSAGE))
;; Pull more data from the server ;; Pull more data from the server
@ -389,13 +389,15 @@
(define new-buffer (malloc (* 2 buffer-size) 'atomic-interior)) (define new-buffer (malloc (* 2 buffer-size) 'atomic-interior))
(memcpy new-buffer buffer buffer-size) (memcpy new-buffer buffer buffer-size)
(set! buffer-size (* 2 buffer-size)) (set! buffer-size (* 2 buffer-size))
(set! buffer (make-sized-byte-string new-buffer buffer-size))) (set! buffer new-buffer)
(set! tmp-buffer (make-bytes buffer-size)))
;; Go back to non-atomic mode for a potentially blocking read: ;; Go back to non-atomic mode for a potentially blocking read:
(define n (call-as-nonatomic (define n (call-as-nonatomic
(lambda () (lambda ()
(read-bytes-avail! buffer i new-data-len buffer-size)))) (read-bytes-avail! tmp-buffer i 0 (- buffer-size new-data-len)))))
(log-win32-ssl-debug "init context: read ~a" n) (log-win32-ssl-debug "init context: read ~a" n)
(when (eof-object? n) (network-error "unexpected EOF")) (when (eof-object? n) (network-error "unexpected EOF"))
(memcpy buffer new-data-len tmp-buffer n)
(loop (+ new-data-len n) (if (= r SEC_I_CONTINUE_NEEDED) (loop (+ new-data-len n) (if (= r SEC_I_CONTINUE_NEEDED)
#f #f
init?))] init?))]
@ -441,8 +443,8 @@
sb))) sb)))
(unless sb (unless sb
(network-error "expected decrypted data")) (network-error "expected decrypted data"))
(write-bytes (make-sized-byte-string (SecBuffer-pvBuffer sb) (write-bytes (pointer->bytes (SecBuffer-pvBuffer sb)
(SecBuffer-cbBuffer sb)) (SecBuffer-cbBuffer sb))
in-post-w) in-post-w)
(define remain (or (for/or ([i (in-range 1 4)]) (define remain (or (for/or ([i (in-range 1 4)])
(define sb (ptr-ref out-sb _SecBuffer i)) (define sb (ptr-ref out-sb _SecBuffer i))
@ -710,6 +712,13 @@
(define (win32-ssl-port? p) (define (win32-ssl-port? p)
(hash-ref win32-ssl-ports p #f)) (hash-ref win32-ssl-ports p #f))
;; ----------------------------------------
(define (pointer->bytes p len)
(define bstr (make-bytes len))
(memcpy bstr p len)
bstr)
;; ---------------------------------------- ;; ----------------------------------------
;; Initialization ;; Initialization

View File

@ -377,9 +377,9 @@
(define-ctype _uint64 'unsigned-64 'uint64 (integer-checker who unsigned 64 exact-integer?)) (define-ctype _uint64 'unsigned-64 'uint64 (integer-checker who unsigned 64 exact-integer?))
(define-ctype _scheme 'scheme-object 'scheme) (define-ctype _scheme 'scheme-object 'scheme)
(define-ctype _string/ucs-4 (if (system-big-endian?) 'utf-32be 'utf-32le) 'string/ucs-4 (define-ctype _string/ucs-4 (if (system-big-endian?) 'utf-32be 'utf-32le) 'string/ucs-4
(checker who string?)) (checker who (lambda (x) (or (not x) (string? x)))))
(define-ctype _string/utf-16 (if (system-big-endian?) 'utf-16be 'utf-16le) 'string/utf-16 (define-ctype _string/utf-16 (if (system-big-endian?) 'utf-16be 'utf-16le) 'string/utf-16
(checker who string?)) (checker who (lambda (x) (or (not x) (string? x)))))
(define-ctype _void 'void 'void (checker who void)) (define-ctype _void 'void 'void (checker who void))
(define (bad-ctype-value type-name v) (define (bad-ctype-value type-name v)