[О блоге] [наверх] [пред] [2022-06-23 10:37:45+03:00] [21d8570fdb912aabef5c046097967a3ee3c9ad09]
Темы: [apple][c][hate]

История однострочных исправлений

https://flak.tedunangst.com/post/a-brief-history-of-one-line-fixes
https://www.imperialviolet.org/2014/02/22/applebug.html
Моё сердебиение участилось, глядя на всё это. И это одна из причин
почему я программистам не бегу доверять в критичных вещах, особенно
когда это что-то закрытое и ты беспомощная тварь. Программисты, к
сожалению, являются людьми.

Я точно так же когда-то сделал фатальнейшую ошибку в GoVPN и именно
поэтому на сайте нельзя скачать версию 2.1. Вместо nonce+=2 я сделал
nonce++. А если бы слепо следовал совету использовать два отдельных
ключа для двух направлений, то ничего фатального бы не произошло.
Захотел соптимизировать.

И ещё тут есть пример почему я люто ненавижу когда люди используют фишку
по автоматическому приведению int-ов к bool-ам (хотя конечно наоборот) и
пишут "if (!whatever())", где whatever() не возвращает bool. В Go
молодцы: логические условия возможны только и только с bool-ами.

И ещё есть старая бага от Apple в самом низу списка, где демонстрируется
очередная ненавистная мне штука в Си: возможность писать if (...) action;
И, опять же, в Go можно написать только if (...) { action }.

          ------------------------ >8 ------------------------

--- hw/xfree86/common/xf86Init.c
+++ hw/xfree86/common/xf86Init.c
@@ -1677,7 +1677,7 @@
   }
   if (!strcmp(argv[i], "-configure"))
   {
-    if (getuid() != 0 && geteuid == 0) {
+    if (getuid() != 0 && geteuid() == 0) {
        ErrorF("The '-configure' option can only be used by root.\n");
        exit(1);
     }

          ------------------------ >8 ------------------------

--- openssl-a/md_rand.c
+++ openssl-b/md_rand.c
@@ -271,10 +271,7 @@
                else
                        MD_Update(&m,&(state[st_idx]),j);

-/*
- * Don't add uninitialised data.
                MD_Update(&m,buf,j);
-*/
                MD_Update(&m,(unsigned char *)&(md_c[0]),sizeof(md_c));
                MD_Final(&m,local_md);
                md_c[1]++;

          ------------------------ >8 ------------------------

--- lib/libssl/src/ssl/s3_srvr.c
+++ lib/libssl/src/ssl/s3_srvr.c
@@ -2009,7 +2009,7 @@ static int ssl3_get_client_certificate(S
        else
                {
                i=ssl_verify_cert_chain(s,sk);
-               if (!i)
+               if (i <= 0)
                        {
                        al=ssl_verify_alarm_type(s->verify_result);
                        SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_NO_CERTIFICATE_RETURNED);

          ------------------------ >8 ------------------------

--- libc-a/memset.c
+++ libc-b/memset.c
@@ -1,6 +1,6 @@
 void *memset(void *_p, unsigned v, unsigned count)
 {
     unsigned char *p = _p;
-    while(count-- > 0) *p++ = 0;
+    while(count-- > 0) *p++ = v;
     return _p;
 }

          ------------------------ >8 ------------------------

--- tarsnap-autoconf-1.0.27/lib/crypto/crypto_file.c
+++ tarsnap-autoconf-1.0.28/lib/crypto/crypto_file.c
@@ -108,7 +108,7 @@

        /* Encrypt the data. */
        if ((stream =
-           crypto_aesctr_init(&encr_aes->key, encr_aes->nonce)) == NULL)
+           crypto_aesctr_init(&encr_aes->key, encr_aes->nonce++)) == NULL)
                goto err0;
        crypto_aesctr_stream(stream, buf, filebuf + CRYPTO_FILE_HLEN, len);
        crypto_aesctr_free(stream);

          ------------------------ >8 ------------------------

--- sql/password.c      2011-07-03 15:47:37 +0000
+++ sql/password.c      2012-04-06 09:04:07 +0000
@@ -531,7 +531,7 @@
   mysql_sha1_reset(&sha1_context);
   mysql_sha1_input(&sha1_context, buf, SHA1_HASH_SIZE);
   mysql_sha1_result(&sha1_context, hash_stage2_reassured);
-  return memcmp(hash_stage2, hash_stage2_reassured, SHA1_HASH_SIZE);
+  return test(memcmp(hash_stage2, hash_stage2_reassured, SHA1_HASH_SIZE));
 }

          ------------------------ >8 ------------------------

--- gnu/usr.sbin/sendmail/sendmail/conf.c       12 Jun 2013 21:27:22 -0000      1.35
+++ gnu/usr.sbin/sendmail/sendmail/conf.c       5 Jun 2014 10:16:18 -0000
@@ -5267,8 +5267,8 @@ closefd_walk(lowest, fd)
 */

 void
-sm_close_on_exec(highest, lowest)
-       int highest, lowest;
+sm_close_on_exec(lowest, highest)
+       int lowest, highest;
 {
 #if HASFDWALK
        (void) fdwalk(closefd_walk, &lowest);

          ------------------------ >8 ------------------------

static OSStatus
SSLVerifySignedServerKeyExchange(SSLContext *ctx, bool isRsa, SSLBuffer signedParams,
                                 uint8_t *signature, UInt16 signatureLen)
{
    OSStatus        err;
    ...

    if ((err = SSLHashSHA1.update(&hashCtx, &serverRandom)) != 0)
        goto fail;
    if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0)
        goto fail;
        goto fail;
    if ((err = SSLHashSHA1.final(&hashCtx, &hashOut)) != 0)
        goto fail;
    ...

fail:
    SSLFreeBuffer(&signedHashes);
    SSLFreeBuffer(&hashCtx);
    return err;
}

    [оставить комментарий]