Byla vydána (𝕏) nová verze 24.7 open source firewallové a routovací platformy OPNsense (Wikipedie). Jedná se o fork pfSense postavený na FreeBSD. Kódový název OPNsense 24.7 je Thriving Tiger. Přehled novinek v příspěvku na fóru.
Binarly REsearch upozorňuje na bezpečnostní problém PKFail (YouTube) v ekosystému UEFI. Stovky modelů zařízení používají pro Secure Boot testovací Platform Key vygenerovaný American Megatrends International (AMI) a jeho privátní část byla při úniku dat prozrazena. Do milionů zařízení (seznam v pdf) po celém světě tak útočníci mohou do Secure Bootu vložit podepsaný malware. Otestovat firmware si lze na stránce pk.fail. Ukázka PoC na Linuxu na Windows na YouTube.
Mobilní operační systém /e/OS (Wikipedie) založený na Androidu / LineageOS, ale bez aplikací a služeb od Googlu, byl vydán ve verzi 2.2 (Mastodon, 𝕏). Přehled novinek na GitLabu. Vypíchnuta je rodičovská kontrola.
Společnost OpenAI představila vyhledávač SearchGPT propojující OpenAI modely umělé inteligence a informace z webů v reálném čase. Zatím jako prototyp pro vybrané uživatele. Zapsat se lze do pořadníku čekatelů.
Distribuce Linux Mint 22 „Wilma“ byla vydána. Je založená na Ubuntu 24.04 LTS, ale s desktopovým prostředím Cinnamon (aktuálně verze 6.2), příp. MATE nebo Xfce, balíkem aplikací XApp, integrací balíčků Flatpak a dalšími změnami. Více v přehledu novinek a poznámkách k vydání.
Příspěvek na blogu Truffle Security: Kdokoli může přistupovat ke smazaným a privátním repozitářům na GitHubu.
Byla vydána nová verze 14 integrovaného vývojového prostředí (IDE) Qt Creator. Podrobný přehled novinek v cgitu. Vypíchnout lze podporu rozšíření v Lua.
Byla vydána verze 1.80.0 programovacího jazyka Rust (Wikipedie). Podrobnosti v poznámkách k vydání. Vyzkoušet Rust lze například na stránce Rust by Example.
Apple oznámil, že v beta verzi spustil své Apple Maps na webu. Podporován je také webový prohlížeč Chrome. Ne však na Linuxu.
Portál Stack Overflow po roce opět vyzpovídal své uživatele, jedná se především o vývojáře softwaru, a zveřejnil detailní výsledky průzkumu. Průzkumu se letos zúčastnilo více než 65 tisíc vývojářů. Z Česka jich bylo 710. Ze Slovenska 246.
void EventPumpX11::waitForWork() { UISystemX11* uiSystem = UI_SYSTEM(); int fd = uiSystem->_fd; int fdSize = fd + 1; fd_set fdSet; struct timeval tval; FD_ZERO(&fdSet); FD_SET(fd, &fdSet); TimeDelta delay = _delayedWorkTime - Time::now(); if (delay > TimeDelta()) { // Go to sleep. X11 will wake us to process X events. We also set interval // to wake up if there are planned tasks to specific time (Timers). int64_t udelay = delay.inMicroseconds(); tval.tv_sec = (int)(udelay / 1000000); tval.tv_usec = (int)(udelay % 1000000); if (tval.tv_usec <= 100) tval.tv_usec = 100; int ret = ::select(fdSize, &fdSet, NULL, NULL, &tval); // TODO: Check for select result } else { // It looks like delayedWorkTime indicates a time in the past, so we // need to call doDelayedWork now. _delayedWorkTime = Time(); } }kde fd je deskriptor, který jsem obdržel pomocí ConnectionNumber(Display*) (Xlib). O co mi jde, potřeboval bych probudit event loop, když chci z jiného vlákna poslat událost do toho hlavního, které čeká buď na událost z X11 nebo na vypršení časového limitu potřebného pro jiné úkoly (delay). Myslím, že správná cesta bude vytvořit vlastní file descriptor, na který pošlu 1 byte v případě, že budu chtít probudit event loop, ale nějak nevím jak přesně na to (toto jsem ještě nikdy nedělal). Použít fd_set a do masky dát vlastní fd? Stačí mi nakopnutí správným směrem ;)
void EventPumpX11::waitForWork() { UISystemX11* uiSystem = UI_SYSTEM(); int fd = uiSystem->_fd; int fdSize = fog_max(fd, uiSystem->_wakeUpPipe[0]) + 1; fd_set fdSet; struct timeval tval; struct timeval* ptval = NULL; FD_ZERO(&fdSet); FD_SET(fd, &fdSet); FD_SET(uiSystem->_wakeUpPipe[0], &fdSet); if (_delayedWorkTime.isNull()) { // There are no scheduled tasks, so ptval is NULL and this tells to select() // that it should wait infitine time. } else { TimeDelta delay = _delayedWorkTime - Time::now(); if (delay > TimeDelta()) { // Go to sleep. X11 will wake us to process X events and we also set // interval to wake up to run planned tasks (usually Timers). int64_t udelay = delay.inMicroseconds(); tval.tv_sec = (int)(udelay / 1000000); tval.tv_usec = (int)(udelay % 1000000); if (tval.tv_usec <= 100) tval.tv_usec = 100; ptval = &tval; } else { // It looks like delayedWorkTime indicates a time in the past, so we // need to call doDelayedWork now. _delayedWorkTime = Time(); return; } } int ret = ::select(fdSize, &fdSet, NULL, NULL, ptval); if (ret < 0) { fog_debug("Fog::EventPumpX11::waitForWork() - select() failed (errno=%d).", errno); } if (ret > 0) { if (FD_ISSET(uiSystem->_wakeUpPipe[0], &fdSet)) { // Dummy c, the actual value is out of our interest. uint8_t c; read(uiSystem->_wakeUpPipe[0], &c, 1); _wakeUpSent.cmpXchg(1, 0); } } }a Kód pro probuzen9 z jiiného vlákna vypadá takto:
void EventPumpX11::sendWakeUp() { if (_wakeUpSent.cmpXchg(0, 1)) { UISystemX11* uiSystem = UI_SYSTEM(); uint8_t c = 'W'; write(uiSystem->_wakeUpPipe[1], &c, 1); } }požil jsem atomické operace k tomu, abych do pipe neposílal příliš moc, teď tam je normálně jen ten 1 BYTE, který probudí select. Funguje to, ale samořejmě to může obsahovat chyby (zase tak moc jsem to neotestoval)... Ke kompletnosti ještě vytvoření pipe:
// Create wakeup pipe. if (pipe(_wakeUpPipe) < 0) { fog_debug("Fog::UISystemX11::Can't create wakeup pipe"); goto fail; }K zápisu používám _wakeUpPipe[1] a ke čtení _wakeUpPipe[0], doufám, že jsem to pochopil správně...:)
Tiskni
Sdílej: