From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on sa.local.altlinux.org X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham autolearn_force=no version=3.4.1 Date: Tue, 2 Mar 2021 10:36:49 +0100 From: Konstantin Lepikhov To: devel@lists.altlinux.org Message-ID: <20210302093649.GA1076397@lks.home> Mail-Followup-To: devel@lists.altlinux.org References: <20210301171032.GA968021@lks.home> <20210301175620.GA14812@altlinux.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20210301175620.GA14812@altlinux.org> X-Operation-System: ALT Sisyphus Sisyphus (unstable) (sisyphus) 5.9.0-lks-wks-alt0.1 User-Agent: Mutt/1.10.1 (2018-07-13) Subject: Re: [devel] =?utf-8?b?UTog0Y3QvdGC0YDQvtC/0LjRjyDQvdCwINGB0LHQvtGA?= =?utf-8?b?0L7Rh9C90LjRhtC1ICBbYm9sdC0wLjkuMS1hbHQxOiBTaXN5cGh1cy9pNTg2?= =?utf-8?q?_test_rebuild_failed=5D?= X-BeenThere: devel@lists.altlinux.org X-Mailman-Version: 2.1.12 Precedence: list Reply-To: ALT Linux Team development discussions List-Id: ALT Linux Team development discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 02 Mar 2021 09:36:54 -0000 Archived-At: List-Archive: List-Post: Hi Dmitry! On 03/01/2021, at 08:56:20 PM you wrote: > > У меня есть смутные подозрения, что в какой-то момент в сборочнице > > кончается энтропия и начинается фигня > > Это что, неустранимо вероятностный тест, который, если его запускать > достаточно много раз, обязательно упадёт? А где он добывает себе > рандомизацию? Из того, что я вижу по логам пересборки, да, падения происходят периодически и почему-то только на i586 и x86_64 По рандомизации: /* general function */ typedef enum { BOLT_RNG_ERROR = -1, BOLT_RNG_URANDOM = 1, BOLT_RNG_PRNG = 2, BOLT_RNG_GETRANDOM = 3, } BoltRng; ... #if HAVE_FN_GETRANDOM #include # else # define GRND_NONBLOCK 0 #endif int bolt_get_random_data (void *buf, gsize n) { gboolean ok; ok = bolt_random_getrandom (buf, n, GRND_NONBLOCK, NULL); if (ok) return BOLT_RNG_GETRANDOM; ok = bolt_random_urandom (buf, n); if (ok) return BOLT_RNG_URANDOM; bolt_random_prng (buf, n); return BOLT_RNG_PRNG; } /* specific implementations */ gboolean bolt_random_getrandom (void *buf, gsize n, unsigned flags, GError **error) { int r = -1; g_return_val_if_fail (buf != NULL, FALSE); g_return_val_if_fail (error == NULL || *error == NULL, FALSE); #if HAVE_FN_GETRANDOM r = getrandom (buf, n, flags); #else errno = ENOSYS; #endif if (r < 0) { g_set_error (error, G_IO_ERROR, g_io_error_from_errno (errno), "failed to get random data: %s", g_strerror (errno)); return FALSE; } return TRUE; } gboolean bolt_random_urandom (void *buf, gsize n) { gboolean ok; int rndfd; gsize len; g_return_val_if_fail (buf != NULL, FALSE); rndfd = bolt_open ("/dev/urandom", O_RDONLY | O_CLOEXEC | O_NOCTTY, 0, NULL); if (rndfd < 0) return FALSE; ok = bolt_read_all (rndfd, buf, n, &len, NULL); (void) close (rndfd); /* NB: according to the man page random(4), "when calling read(2) for the device /dev/urandom, reads of up to 256 bytes will return as many bytes as are requested and will not be interrupted by a signal handler". */ return ok && len == n; } void bolt_random_prng (void *buf, gsize n) { char *ptr = buf; const gsize l = n % sizeof (guint32); const gsize k = n - l; if (buf == NULL || n == 0) return; for (gsize i = 0; i < k; i += sizeof (guint32)) { guint32 r = g_random_int (); memcpy (ptr + i, &r, sizeof (guint32)); } if (l > 0) { guint32 r = g_random_int (); memcpy (ptr + k, &r, l); } } -- WBR et al.