Hacktoberfest 2026: die Issues, die Maintainer für den Oktober markiert haben – offen und einsteigerfreundlich. Hacktoberfest-Issues durchsuchen

`Time\Duration::__unserialize()` accepts a "negative zero" payload.

Offen Anfängerfreundlich
#24,505 2 Kommentare 0 Reaktionen 1 zugewiesene Person Auf GitHub ansehen

Maintainer antworten meist innerhalb von 1 Tag

@TimWolla arbeitet bereits daran.

Seit 23.10.2026.

Bewertung

Schwierigkeit
2/5
Geschätzter Aufwand
1-3 Stunden
Anfängerfreundlichkeit
71/100
Issue-Typ
Bug
Klarheit
Klar beschrieben
Aktivitätsstatus
Aktiv
Tech-Stack
php
Bereich
backend

Rechercherichtung

Finde zuerst Time\Duration::__unserialize() im PHP-Quellcode und lies die Validierung zusammen mit den Prüfungen, die negative Sekunden und Nanosekunden außerhalb des gültigen Bereichs zurückweisen. Reproduziere die bereitgestellte Payload und prüfe, wie null Sekunden mit gesetztem Negativ-Flag behandelt werden. Die Aufgabe ist erledigt, wenn die Unserialisierung sie mit der angegebenen Ausnahme zurückweist oder zu einer nicht negativen Null kanonisiert wird und ein Regressionstest die Payload abdeckt.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Beschreibung

Bug Status: Needs Triage
Description

The following code:

<?php

$payload = 'O:13:"Time\Duration":3:{s:7:"seconds";i:0;s:11:"nanoseconds";i:0;s:8:"negative";b:1;}';
$d = unserialize($payload);

var_dump($d->negative); // expected: exception, or false. actual: true
var_dump(Time\Duration::compare($d, Time\Duration::fromSeconds(0))); // int(0)
var_dump($d->absolute()->negative); // actual: true (absolute() of a value is still "negative")
echo json_encode($d), "\n"; // actual: {"seconds":0,"nanoseconds":0,"negative":true}
echo serialize(Time\Duration::fromSeconds(0)->negate()), "\n"; // canonical zero: ...s:8:"negative";b:0;}

// For comparison, other non-canonical payloads are rejected:
try {
    unserialize('O:13:"Time\Duration":3:{s:7:"seconds";i:-1;s:11:"nanoseconds";i:0;s:8:"negative";b:0;}');
} catch (Exception $e) {
    echo get_class($e), ': ', $e->getMessage(), "\n";
}

Expected: an exception ("Invalid serialization data for Time\Duration object"), as for the other non-canonical payloads (negative seconds, nanoseconds >= 1e9), or a canonicalized zero with $negative === false. No public factory or arithmetic method can produce a zero duration with $negative === true.

Actual: the object is created with seconds = 0, nanoseconds = 0, negative = true. compare() and == treat it as zero, but the public $negative property, json_encode(), serialize() and absolute() all expose the non-canonical sign.

PHP Version
PHP 8.6.0RC3 (cli) (built: Oct 20 2026 18:44:56) (NTS)
Copyright © The PHP Group and Contributors
Zend Engine v4.6.0RC3, Copyright © Zend by Perforce
    with Zend OPcache v8.6.0RC3, Copyright ©, by Zend by Perforce
Operating System

MacOS

Vorherrschende Sprache
C
Sterne
40.7k
Forks
8.3k
Ø Merge
2 T. 15 Std.
Gemergte PRs (30 T.)
155

Entwicklungsumgebung

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus php/php-src

Alle Issues in php/php-src

Ähnliche Issues

Weitere Issues zu C

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.