> I tried to find "missing malloc null check" using the following coccinelle > script (easy to run from within CI)
Cool, that's nice. We tend to be strict with error checking in new code, but having such a sanity check certainly won't hurt. If we only need to fix half a dozen functions, it might actually be worth it. Thanks > diff -u -p a/apps/openssl/apps.c b/apps/openssl/apps.c > --- a/apps/openssl/apps.c > +++ b/apps/openssl/apps.c > @@ -379,6 +379,8 @@ password_callback(char *buf, int bufsiz, > PW_MIN_LENGTH, bufsiz - 1); > if (ok >= 0 && verify) { > buff = malloc(bufsiz); > +if (buff == NULL) > +return; > ok = UI_add_verify_string(ui, prompt, ui_flags, buff, > PW_MIN_LENGTH, bufsiz - 1, buf); UI_add_verify_string() handles a NULL buff correctly, although it is far from obvious. We will end up in general_allocate_prompt() with type == UIT_VERIFY and result_buf == NULL and will return -1 eventually. If we wanted to NULL check the allocation here, we'd need to rework this entire function (which we should probably do anyway). > diff -u -p a/crypto/asn1/bio_ndef.c b/crypto/asn1/bio_ndef.c > --- a/crypto/asn1/bio_ndef.c > +++ b/crypto/asn1/bio_ndef.c Already discussed. > diff -u -p a/tests/ecdhtest.c b/tests/ecdhtest.c > --- a/tests/ecdhtest.c > +++ b/tests/ecdhtest.c Thanks, I committed an appropriate version of this. > diff -u -p a/ssl/d1_pkt.c b/ssl/d1_pkt.c > --- a/ssl/d1_pkt.c > +++ b/ssl/d1_pkt.c > @@ -214,6 +214,8 @@ dtls1_buffer_record(SSL *s, record_pqueu > return 0; > > rdata = malloc(sizeof(DTLS1_RECORD_DATA_INTERNAL)); > +if (rdata == NULL) > +return; > item = pitem_new(priority, rdata); > if (rdata == NULL || item == NULL) > goto init_err; The checks actually happen in 'if (rdata == NULL || item == NULL)' above. pitem_new() does not dereference rdata, so the error checks are fine as they are. We could rewrite this to do the following, with a corresponding NULL-initialization of item at the top of the function. I would actually prefer this. if ((rdata = malloc(sizeof(*rdata))) == NULL) goto init_err; if ((item = pitem_new(priority, rdata)) == NULL) goto init_err; > @@ -260,6 +262,8 @@ dtls1_buffer_rcontent(SSL *s, rcontent_p > return 0; > > rdata = malloc(sizeof(DTLS1_RCONTENT_DATA_INTERNAL)); > +if (rdata == NULL) > +return; > item = pitem_new(priority, rdata); > if (rdata == NULL || item == NULL) > goto init_err; > Exactly the same here.