Vue lecture

Il y a de nouveaux articles disponibles, cliquez pour rafraîchir la page.

[$] Nested bottom-half locking for realtime kernels

Software-interrupt handlers (also called "bottom halves") have a long history in the Linux kernel; for much of that history, developers have wished that they could go away. One of their unfortunate characteristics is that they can add unexpected latency to the execution of unrelated processes; this problem is felt especially acutely in the realtime-preemption community. The solution adopted there has created problems of its own, though; in response Sebastian Andrzej Siewior is proposing a new locking mechanism for realtime builds of the kernel that may have benefits for non-realtime users as well.

Security updates for Monday

Security updates have been issued by AlmaLinux (389-ds-base, buildah, c-ares, cockpit, containernetworking-plugins, fence-agents, gdk-pixbuf2, gvisor-tap-vsock, libreoffice, podman, python-idna, rpm-ostree, and ruby), Debian (atril, chromium, ffmpeg, libndp, libvpx, nano, plasma-workspace, pymongo, roundcube, sendmail, and thunderbird), Fedora (booth and thunderbird), Mageia (aom, atril, libvpx, nano, nss, firefox, and vte), Red Hat (linux-firmware), SUSE (bind, booth, mariadb, openssl-1_1, php7, php8, and webkit2gtk3), and Ubuntu (linux-azure, linux-azure-fde, linux-azure, linux-gke, and linux-nvidia-6.5).

Et soudain, les mèmes se transforment en affiches de campagne pour le Front populaire

Le Front populaire peut compter sur la créativité et l'inventivité des internautes. Depuis la dissolution de l'Assemblée, on assiste à un fourmillement d'idées pour encourager à voter pour ce mouvement, contre l'extrême droite. Et cela, en s'emparant des codes d'Internet et des pratiques propres aux manifestations. Cela marche : même des membres du Front populaire s'en emparent.

Perl 5.40 est sorti

Perl est un langage généraliste créé en 1987 par Larry Wall. Il est distribué sous une double licence : Artistic Licence et GPL v1+. La plupart des modules du CPAN, dépôt de référence pour des modules tiers, sont également sous ces deux licences. Perl est inclus dans la quasi-totalité des distributions GNU/Linux.

La toute dernière version de Perl, la 5.40.0, est sortie le 9 juin 2024. Vous la retrouverez bientôt dans votre distribution préférée.

Sommaire

Améliorations notables

Nouveau mot clé __CLASS__

Lors de l’utilisation de la nouvelle fonctionnalité classe, le code à l’intérieur d’une fonction, d’un bloc ADJUST ou d’une expression d’initialisation de field peut maintenant utiliser le nouveau mot-clé __CLASS__.

use feature 'class';

class Example1 {
    field $f = __CLASS__->default_f;

    sub default_f { 10 }
}

Cela donne un nom de classe, similaire à __PACKAGE__, mais alors que celui-ci donne le paquetage de compilation dans lequel le code apparaît, le mot clé __CLASS__ donne la classe d’exécution réelle dont l’instance d’objet est membre.

class Example2 :isa(Example1) {
    sub default_f { 20 }
}

my $obj = Example2->new;
# $f aura maintenant la valeur 20

Cela le rend utile pour l’aiguillage des fonctions sur cette classe, en particulier lors des constructeurs, où l’accès à $self n’est pas autorisé.

un attribut :reader pour les variables field

Lors de l’utilisation de la fonctionnalité de classe, les variables de champ peuvent désormais prendre un attribut :reader. Ceci crée automatiquement une fonction qui renvoie simplement la valeur de la variable de champ de l’instance donnée.

field $name :reader;

est donc l’équivalent de

field $name;
method name () { return $name; }

On peut donner un nom différent à cette fonction :
field $name :reader(get_name);

Autoriser un espace dans l’option de ligne de commande -M

Lors du traitement des options de ligne de commande, Perl autorise désormais un espace entre le commutateur -M et le nom du module qui le suit.

$ perl -M Data::Dumper=Dumper -E 'say Dumper [1,2,3]'

Cela correspond au fonctionnement de l’option -I.

Restrictions d’utilisation des déclarations VERSION

Dans Perl 5.36, un avertissement de dépréciation avait été ajouté lors de la rétrogradation d’une déclaration d’utilisation VERSION d’une version supérieure à 5.11 vers une version inférieure. Ceci est désormais une erreur fatale.

De plus, c’est désormais une erreur fatale d’émettre une déclaration d’utilisation ultérieure VERSION lorsqu’une autre est dans la portée, lorsque l’une ou l’autre des versions est 5.39 ou supérieure. Un avertissement de dépréciation a également été ajouté pour toute autre déclaration d’utilisation ultérieure de VERSION inférieure à la version 5.39, pour avertir qu’elle ne sera plus autorisée dans la version Perl 5.44.

Nouvelles fonctions Builtin::inf et Builtin::nan

Deux nouvelles fonctions, inf et nan, ont été ajoutées à l’espace de noms intégré. Celles-ci agissent comme des constantes qui donnent respectivement la valeur infinie à virgule flottante et Not-a-Number.

Nouveau opérateur ^ xor logique

Perl a toujours eu trois opérateurs logiques de faible priorité and, or et xor, ainsi que trois équivalents de priorité élevée &, ^ et | traitant les opérandes bit par bit. Jusqu’à cette version, alors que les opérateurs logiques de priorité moyenne && et || étaient présents, il n’y avait pas d’équivalent xor. Cette version de Perl ajoute l’opérateur , complétant l’ensemble.
$x ^^ $y and say "L’un de x et y est vrai, mais pas les deux";

Le pragma features de 5.40 contient try / catch

Le mot-clé features active maintenant la fonctionnalité try / catch, récemment stabilisée. Comme cet ensemble de fonctionnalités est activé par l’option de ligne de commande -E, ceux-ci sont immédiatement disponibles dans les scripts lancés avec cette option.

Securité

CVE-2023-47038

Cette vulnérabilité a été remontée à l’équipe sécurité de Perl par Nathan Mills.

Une expression régulière compilée par perl 5.30.0 jusqu’à 5.38.0 peut provoquer un buffer overflow d’un octet contrôlé par l’attaquant.

CVE-2023-47039

Cette vulnérabilité a été remontée au Intel Product Security Incident Response Team (PSIRT) par l’utilisateur GitHub ycdxsb. Le PSIRT l’a ensuite remonté à l’équipe sécurité de Perl. À noter qu’elle ne concerne que Perl pour Windows.

Perl pour Windows dépend sur la variable d’environnement PATH pour trouver le shell (cmd.exe). Lorsqu’on lance un exécutable qui utilise l’interpréteur Perl, Perl essaie d’abord de trouver et utiliser cmd.exe dans le répertoire courant. Il est possible d’exploiter ce comportement pour faire exécuter du code malicieux à l’administrateur du poste.

Changements incompatibles avec les versions précédentes

reset EXPR appelle maitenant "set-magic" sur les scalaires

Précédemment, reset EXPR n’appelait pas les fonctions « magiques » lorsqu’il effaçait des variables scalaires. Cela signifiait que les changements n’étaient pas répercutés sur l’état interne des variables magiques lorsque c’était nécessaire, comme c’est le cas pour $W, et cela ne déclenchait pas d’exception lorsque la magie sous-jacente aurait dû déclencher une exception, comme pour $1.

Cela signifie que du code qui était jusqu’à présent sans effet peut, maintenant, avoir un effet, ou même déclencher une exception.

Il n’y a aucun effet pour un reset ordinaire dont le but est de réinitialiser les recherches simples appelées par m?regexp?

Avertissement lors de l’appel de la méthode import sur un paquetage inconnu

Historiquement, il était possible d’appeler la méthode import ou unimport pour n’importe quelle classe, y compris les classes qui n’ont pas été définies. Même si l’appel se faisait avec un argument, cela ne déclenchait pas d’erreur. Par exemple, le code suivant ne déclenche pas d’erreur en Perl 5.38:

Classe::qui::n::existe::pas->import("toto");

Toutefois, à partir de Perl 5.39.1, cette pratique est dépréciée et déclenche un avertissement. On peut remarquer que l’appel de ces méthodes sans argument continue à s’exécuter sans déclencher d’erreur. Par exemple

Classe::qui::n::existe::pas->import();

continue à ne pas déclencher d’erreur. C’est parce que toutes les classes dérivent implicitement de la classe UNIVERSAL, qui définit maintenant une méthode import. Dans les anciens Perl, cette méthode n’était pas définie pour UNIVERSAL. Au lieu de cela, les appels à import et à unimport étaient traités de façon spéciale de manière à ce qu’ils ne déclenchent pas d’erreur si la méthode correspondante n’était pas définie.

Ce changement a été mis en place pour faciliter la détection des fautes de frappe dans les instructions use, lorsque le programme tourne sur un système de fichiers avec des noms insensibles à la casse. Par exemple, sur Windows ou sur toute plateforme avec dse noms de fichier insensibles à la casse, avec un ancien Perl, le code suivant

use STRICT 'refs';

serait passé sans déclencher d’erreur et sans rien faire, car le module s’appelle réellement strict.pm au lieu de STRICT.pm, donc il aurait été chargé, mais sa fonction import n’aurait jamais été appelée. Cette nouveauté permet également de détecter le cas où un utilisateur ajoute un argument à la commande use pour un paquetage qui ne définit pas son propre import. C’est le cas entre autres pour la définition d’une classe « pure », qui ne définit pas de méthode « import ».

return ne permet plus de renvoyer un objet indirect

La syntaxe de l’opérateur return rejette maintenant les objets indirects. Jusqu’à présent, dans la plupart des cas, cela passait à la compilation et cela pouvait même s’exécuter, mais ce n’était pas documenté et cela pouvait produire des résultats prêtant à confusion. Par exemple :

  # Remarquez que « somme » n’a pas été défini
  sub somme_positive {
    return somme grep $_ > 0, @_;
    # interprété abusivement ainsi :
    #   return *somme, grep $_ > 0, @_;
    # avec le mot somme pris en tant que typeglob et transmis en tant qu’argument supplémentaire
  }
  say for somme_positive(-1, 2 ,3);

produisait

  *main::somme
  2
  3

Dans les appels de méthode, les noms de classe sans guillemets ne sont plus interprétés comme des handles de fichier si l’on a déclaré no feature "bareword_filehandles"

Si l’on déclare no feature "bareword_filehandles", les handles de fichier sans guillemets continuent à être acceptés dans les appels de méthode :

  open FH, "<", $somefile or die;
  no feature 'bareword_filehandles';
  FH->binmode;

Cela a été corrigé, donc maintenant la ligne

FH->binmode;

essaiera de résoudre FH en tant que classe, ce qui provoque habituellement une erreur à l’exécution.

Les handles de fichier standard tels que STDOUT continuent à être résolus en tant que handles :

no feature 'bareword_filehandles';
STDOUT->flush; # continues to work

Notez qu’une fois que Perl a résolu un nom sans guillemets en tant que classe, il continuera à le faire :

package SomeClass {
    sub somemethod{}
}
open SomeClass, "<", "somefile" or die;
# SomeClass résolu en tant que handle
SomeClass->binmode;
{
    no feature "bareword_filehandles";
    SomeClass->somemethod;
}
# SomeClass résolu en tant que classe
SomeClass->binmode;

Commentaires : voir le flux Atom ouvrir dans le navigateur

❌