Stephen Frost <[email protected]> writes: > One of the things that I really didn't care for in this patch was the > use of the string buffers, without any real checks (except for "oh, > you tried to allocated over 1G"...) to make sure that the other side > of the connection wasn't feeding us ridiculous packets, and with the > resizing of the buffers, etc, that really shouldn't be necessary. > After chatting with Robbie about these concerns while reading through > the code, we agreed that we should be able to use fixed buffer sizes > and use the quite helpful gss_wrap_size_limit() to figure out how much > data we can encrypt without going over our fixed buffer size. As > Robbie didn't have time to implement those changes this past week, I > did so, and added a bunch more comments and such too, and have now > gone through and done more testing. Robbie has said that he should > have time this upcoming week to review the changes that I made, and > I'm planning to go back and review other parts of the patch more > closely now as well.
In general this looks good - there are a couple minor comments inline,
but it's fine.
I wanted to note a couple things about this approach. It now uses one
more buffer than before (in contrast to the previous approach, which
reused a buffer for received data that was encrypted and decrypted).
Since these are static fixed size buffers, this increases the total
steady-state memory usage by 16k as opposed to re-using the buffer.
This may be fine; I don't know how tight RAM is here.
> Note that there's an issue with exporting the context to get the
> encryption algorithm used that I've asked Robbie to look into, so
> that's no longer done and instead we just print that the connection is
> encrypted, if it is. If we can't figure out a way to make that work
> then obviously I'll pull out that code, and if we can get it to work
> then I'll update it to be done through libpq properly, as I had
> suggested earlier. That's really more of a nice to have in any case
> though, so I may just exclude it for now anyway if it ends up adding
> any complications.
Correct. Unfortunately I'd overlooked that the lucid interface won't
meet our needs (destroys the context). So the two options here are:
SASL SSF (and I'll separately push more mechs to add support for that),
or nothing at all.
If you want a patch for that I can make one, but I think there was code
already... just needed a ./configure check program for whether the OID
is defined.
> +ssize_t
> +be_gssapi_write(Port *port, void *ptr, size_t len)
> +{
> + size_t bytes_to_encrypt = len;
> + size_t bytes_encrypted = 0;
> +
> + /*
> + * Loop through encrypting data and sending it out until
> + * secure_raw_write() complains (which would likely mean that the socket
> + * is non-blocking and the requested send() would block, or there was
> some
> + * kind of actual error) and then return.
> + */
> + while (bytes_to_encrypt || PqGSSSendPointer)
> + {
I guess it's not a view everyone will share, but I think this block is
too long. Maybe a helper function around secure_raw_write() would help?
(The check-and-send part at the start.)
I have similar nits about the other functions that don't fit on my
(86-line high) screen, though I guess a lot of this is due to project
style using a lot of vertical space.
> + if (GSS_ERROR(major))
> + pg_GSS_error(FATAL, gettext_noop("GSSAPI context error"),
I'd prefer this to be a different error message than the init/accept
errors - maybe something like "GSSAPI size check error"?
> + if (GSS_ERROR(major))
> + pg_GSS_error(libpq_gettext("GSSAPI context error"),
> conn,
Same here.
Again, these are nits, and I think I'm okay with the changes.
Thanks,
--Robbie
signature.asc
Description: PGP signature
