Date:        Wed, 02 Jul 2025 09:15:52 -0700
    From:        Stephen Gildea <[email protected]>
    Message-ID:  <[email protected]>

  |     if (doingEHLO
  |             && has_prefix_len(buffer, buflen, "250")
  | -           && (buffer[3] == '-' || doingEHLO == 2)
  | -           && buffer[4]) {
  | +           && (has_prefix_len(buffer, buflen, "250-") || doingEHLO == 2)

That change looks bizarre, and silly, to me - the previous (unchanged)
line already checked that buffer[0,1,2] == "250", there's no reason to
check those again, just testing that buffer [3] == '-' (the old way) is
much better.

  | +           && buflen > 4) {

but that, instead of checking the buffer[4] is not \0 is OK.

  | -   code = atoi ((char *) bp);
  | -   bp += 3, buflen -= 3;
  | +   for (code = 0; buflen > 0 && isdigit (*bp); bp++, buflen--) {
  | +            code = code * 10 + (*bp - '0');
  | +   }

It is hard to argue against anything which replaces atoi(), but
new code these days should be checking for overflow (and as this
is, probably, an SMTP response code, perhaps allowing just 3 digits
instead - overflow can't happen then).

It is also wrong to call isdigit with a char arg, unless there's some
way to guarantee it is between 0 and 255 (or EOF).   Further, I assume
that something is guaranteeing that LC_CTYPE == "C" there, or assuming
that isdigit() returning true means '0' .. '9' is probably unsafe -- might
be better to just open code what isdigit() is supposed to be doing,
        *bp >= '0' && *bp <= '9'


  | -           puts(sm_reply.text);
  | +           printf("%.*s", sm_reply.length, sm_reply.text);

That change drops the \n that puts() appends to the written string.


  | -           if (len != 2 || strcmp(line, "+ ") != 0) {
  | +           if (len != 2 || strncmp(line, "+ ", 2) != 0) {

personally I'd question using any strcmp() type function for checking
just two chars:
                if (len != 2 || line[0] != '+' || line[1] != ' ') {


kre


Reply via email to