Debian 13 & php 8.4 - file_get_contents(): Argument #1 ($filename) must not contain any null bytes

Concerne le plugin jeezigbee

pour ceux qui comme moi sont passés à debian 13 et php 8.4.

J’avais sur la page des équipements ce message d’erreur : file_get_contents(): Argument #1 ($filename) must not contain any null bytes

Voici la correction faite avec Claude.

# Correction JeeZigbee — Erreur `null bytes` sous PHP 8.4

## Contexte

Depuis PHP 8.4, la fonction `file_get_contents()` lève une `ValueError` fatale lorsque le chemin de fichier passé en argument contient un octet nul (`null byte`). Les versions précédentes (PHP 8.3 et antérieures) ignoraient silencieusement ce problème.

Le plugin JeeZigbee (z2m) n'a pas encore été mis à jour pour gérer ce changement, ce qui provoque l'erreur suivante lors de l'ouverture du plugin :

file_get_contents(): Argument #1 ($filename) must not contain any null bytes


## Fichier concerné

/var/www/html/plugins/z2m/core/class/z2m.class.php


## Fonctions à corriger

Deux fonctions sont affectées :

- `getDeviceInfo()` — construit un chemin à partir de `$_device` qui peut contenir un null byte
- `getImg()` — construit un chemin à partir de `$model` qui peut contenir un null byte

---

## Procédure de correction

### Étape 1 — Sauvegarde du fichier original

Toujours faire une sauvegarde avant toute modification :

```bash
cp /var/www/html/plugins/z2m/core/class/z2m.class.php \
   /var/www/html/plugins/z2m/core/class/z2m.class.php.bak

Étape 2 — Correction de getDeviceInfo()

php -r "
\$file = '/var/www/html/plugins/z2m/core/class/z2m.class.php';
\$content = file_get_contents(\$file);
\$search = \"  public static function getDeviceInfo(\\\$_device) {\n    \\\$file = __DIR__ . '/../../data/devices/' . \\\$_device . '.json';\";
\$replace = \"  public static function getDeviceInfo(\\\$_device) {\n    if (empty(\\\$_device) || strpos(\\\$_device, \\\"\\\\0\\\") !== false) {\n      return array();\n    }\n    \\\$file = __DIR__ . '/../../data/devices/' . \\\$_device . '.json';\";
\$new = str_replace(\$search, \$replace, \$content);
if (\$new !== \$content) {
    file_put_contents(\$file, \$new);
    echo 'Correction appliquee avec succes' . PHP_EOL;
} else {
    echo 'Pattern non trouve, verifiez le fichier' . PHP_EOL;
}
"

Étape 3 — Correction de getImg()

php -r "
\$file = '/var/www/html/plugins/z2m/core/class/z2m.class.php';
\$content = file_get_contents(\$file);
\$search = \"    \\\$filename = __DIR__ . '/../../data/img/' . \\\$model . '.jpg';\";
\$replace = \"    if (empty(\\\$model) || strpos(\\\$model, \\\"\\\\0\\\") !== false) {\n      return 'plugins/z2m/plugin_info/z2m_icon.png';\n    }\n    \\\$filename = __DIR__ . '/../../data/img/' . \\\$model . '.jpg';\";
\$new = str_replace(\$search, \$replace, \$content);
if (\$new !== \$content) {
    file_put_contents(\$file, \$new);
    echo 'Correction appliquee avec succes' . PHP_EOL;
} else {
    echo 'Pattern non trouve, verifiez le fichier' . PHP_EOL;
}
"

Étape 4 — Vérification

Contrôlez que les deux corrections ont bien été appliquées :

sed -n '740,753p' /var/www/html/plugins/z2m/core/class/z2m.class.php

Résultat attendu :

public static function getDeviceInfo($_device) {
    if (empty($_device) || strpos($_device, "\0") !== false) {
      return array();
    }
    $file = __DIR__ . '/../../data/devices/' . $_device . '.json';
    if (!file_exists($file)) {
      return array();
    }
    return json_decode(file_get_contents($file), true);
  }
sed -n '818,828p' /var/www/html/plugins/z2m/core/class/z2m.class.php

Résultat attendu :

    if ($this->getConfiguration('model') == '') {
      return 'plugins/z2m/plugin_info/z2m_icon.png';
    }
    if (empty($model) || strpos($model, "\0") !== false) {
      return 'plugins/z2m/plugin_info/z2m_icon.png';
    }
    $filename = __DIR__ . '/../../data/img/' . $model . '.jpg';

En cas de problème

Si l’erreur persiste après la correction, vider le cache Jeedom :

Réglages → Système → Configuration → onglet Cache → Vider le cache

Pour restaurer le fichier original en cas de problème :

cp /var/www/html/plugins/z2m/core/class/z2m.class.php.bak \
   /var/www/html/plugins/z2m/core/class/z2m.class.php

:warning: Important

Ces corrections sont écrasées à chaque mise à jour du plugin JeeZigbee. Il faudra les réappliquer après chaque mise à jour tant que le bug n’est pas corrigé officiellement.

Pour éviter d’oublier, signalez le bug sur le forum Jeedom community :
https://community.jeedom.com

En mentionnant : plugin JeeZigbee (z2m), PHP 8.4, erreur file_get_contents() null bytes, fonctions getDeviceInfo() et getImg().


Correction établie le 15 mai 2026 — Jeedom 4.5.3 / PHP 8.4.21 / Debian 13.4

Salut,

Je conseillerai plus de rester sur un OS supporté par jeedom (ce qui n’est pas le cas de Debian 13) plutot que de prendre un OS non supporté et faire faire des corrections à une IA. :man_shrugging:t2:

2 « J'aime »

je sais bien que je prends un risque, mais je me dis qu’après, je ne vais pas y retoucher avant un moment :sweat_smile:

En fait que tu prenne un risque c’est une chose. Et ça n’engage que toi.

Mais publier ça sur un forum communautaire sans disclamer risque de faire que dans X semaines ou mois tu va avoir quelqu’un de pas aguerri techniquement qui va installer son système sous Debian 13 « Mais si si j’ai lu sur le community que c’était possible ! » :roll_eyes:

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.