Symfony 6.4.50 has just been released.

Read the Symfony upgrade guide to learn more about upgrading Symfony and use the SymfonyInsight upgrade reports to detect the code you will need to change in your project.

Warning

WARNING: 6.4.50 is the last version for the Symfony 6.4 branch. If some of your projects are still using this version, consider upgrading as soon as possible. However, if you can't upgrade soon, note that we still provide security issue releases according to our release policy.

Tip

Want to be notified whenever a new Symfony release is published? Or when a version is not maintained anymore? Or only when a security issue is fixed? Consider subscribing to the Symfony Roadmap Notifications.

Changelog Since Symfony 6.4.49

AssetMapper

  • bug #67802 [AssetMapper] Fix the resolution of relative paths in downloaded packages (@nicolas-grekas)
  • bug #67750 [AssetMapper] Decode the version of a jsDelivr import before resolving it (@mathieudz)
  • bug #67621 [AssetMapper] Fix importmap:remove deleting the files of local entries (@nicolas-grekas)

BrowserKit

  • bug #67685 [BrowserKit] Match cookies across equivalent IPv6 addresses (@X-Coder264)
  • bug #67684 [BrowserKit] Expire cookies dated at the Unix epoch (@X-Coder264)

Cache

  • bug #67759 [Cache] Fix FilesystemTagAwareAdapter::deleteItems() returning true when some items could not be deleted (@nicolas-grekas)
  • bug #67741 [Cache] Fix Redis deleteItems() returning true when some items could not be deleted (@nicolas-grekas)
  • bug #67736 [Cache] Fix tag-aware deleteItems() returning false when the per-item retry succeeds (@nicolas-grekas)
  • bug #67720 [Cache] Retry failed early expiration callbacks (@nicolas-grekas)
  • bug #67703 [Cache] Honor the $save flag set by the callback in EarlyExpirationHandler (@BenMacha)
  • bug #67714 [Cache] Preserve null results from synchronous early recomputation (@nicolas-grekas)
  • bug #67681 [Cache] Add support for relay 0.61 (@nicolas-grekas)
  • minor #67744 [Cache] Mark connection options as #[\SensitiveParameter] (@nicolas-grekas)

Config

Console

  • bug #67831 [Console] Fix ProgressBar's percent after finish() on undecorated output without a max (@nicolas-grekas)
  • bug #67830 [Console] Fix ProgressBar::finish() with a lowered max and restarting a finished bar without a max (@jack-worman)
  • bug #67823 [Console] Fix ProgressBar frames on undecorated output when resuming, restarting or finishing (@jack-worman)
  • bug #67811 [Console] Fix ProgressBar::setMaxSteps() not updating the percentage (@nicolas-grekas)
  • bug #67805 [Console] Fix ProgressBar::start() computing the percentage against the previous max (@jack-worman)
  • bug #67769 [Console] Fix text ending with a backslash escaping the closing tag that follows it (@nicolas-grekas)
  • bug #67762 [Console] Keep an escaped tag delimiter with its backslash when wrapping text (@initd-it)
  • bug #67634 [Console] Fix setRow(), setColumnMaxWidth() and consecutive rowspans in Table (@nicolas-grekas)
  • bug #67633 [Console] Fix Table cells that span rows when they follow a cell that spans columns (@ybai08)

Filesystem

  • security #ghsa-6prc-h956-hxjq [Filesystem] Only treat a valid URI scheme as the root of a path (@nicolas-grekas)
  • bug #67786 [Filesystem] Fix failure handling in remove() (@nicolas-grekas)
  • bug #67778 [Filesystem] Reserve temporary removal directories atomically (@X-Coder264)

Finder

  • bug #67785 [Finder] Fix Glob::toRegex() producing an invalid regex for bracket expressions containing a slash (@0xABCD01)

Form

  • bug #67776 [Form] Map data validation errors to the sibling form that has the field (@nicolas-grekas)
  • bug #67772 [Form] Keep validation errors on their originating form (@X-Coder264)
  • bug #67731 [Form] Fix allow_delete removing collection entries submitted as null (@nicolas-grekas)
  • bug #67700 [Form] Ignore collection entries with invalid names when allow_add is enabled (@BenMacha)
  • bug #67702 [Form] Fix submitting "0" to a non-compound root form (@BenMacha)
  • bug #67713 [Form] Skip unsubmitted collection entries with delete_empty (@nicolas-grekas)
  • bug #67701 [Form] Fix the post_max_size check when it is set to a negative value (@BenMacha)
  • bug #67650 [Form] Preserve the Unix epoch in date string transformation (@ahbaqdadi)
  • minor #67795 [Form] Review Greek translations (@sogav21)
  • minor #67773 [Form] Review Croatian translations (@HypeMC)
  • minor #67674 [Form] Review Polish translations (@lukaszkrakowiak)
  • minor #67660 [Form] Review Japanese translations (@OTA-EITA)
  • minor #67623 [Form][Validator] Review Slovak (sk) translations (@tito10047)
  • minor #67642 [Form][Validator] Review and improve Chinese (zh_CN) translations (@siganushka)
  • minor #67635 [Form][Validator] Review and fix Luxembourgish (lb) translations (@mweimerskirch)
  • minor #67632 [Form] Fix Dutch translations for validators (@mdalikadar)
  • minor #67631 [Form] Fix Italian translations for validators (@mdalikadar)
  • minor #67626 [Form][Security][Validator] Review Vietnamese translations (@HongTin2104)
  • minor #67622 [Form][Validator] review translations for Ukrainian (uk) (@qconer)
  • minor #67627 [Form][Validator] Review translations for Chinese (zh_TW) (@HsukqiLee)
  • minor #67447 [Form] Review Turkish (tr) validator translations (@erenbati)
  • minor #67617 [Form][Validator] Review German translations (@Rommmoa)

HtmlSanitizer

  • security #ghsa-q8jq-xrf4-v5j8 [HtmlSanitizer] Apply the URL policy to srcset and imagesrcset (@nicolas-grekas)
  • security #cve-2026-118517 [HtmlSanitizer] Require special schemes and scheme-relative URLs to carry a non-empty authority (@nicolas-grekas)
  • security #ghsa-wm2w-4mgj-vw33 [HtmlSanitizer] Fix meta refresh URL sanitization bypass (@nicolas-grekas)

HttpClient

  • security #ghsa-c7hm-wqwp-f9v8 [HttpClient] Pin the IP of cached hosts in NoPrivateNetworkHttpClient (@nicolas-grekas)
  • security #ghsa-gq53-v8w2-gjhj [HttpClient] Don't send the options of the default scope to other origins in ScopingHttpClient (@nicolas-grekas)
  • bug #67619 [HttpClient] Let PHP destruct the response decorated by TraceableResponse (@nicolas-grekas)
  • bug #67612 [HttpClient] Fix AsyncResponse throwing a LogicException when it is canceled while streaming (@nicolas-grekas)
  • bug #67610 [HttpClient] Fix getContent() returning a truncated body when the response is canceled while it reads it (@nicolas-grekas)
  • bug #67599 [HttpClient] Fix reading a traced CurlResponse as a stream after its decorator is destructed (@PhilETaylor)
  • bug #67609 [HttpClient] Fix CurlHttpClient writing the body of a response to stdout when it is canceled during stream() (@nicolas-grekas)
  • bug #67605 [HttpClient] Fix clearing the DNS cache of pending requests when a traced response is destructed (@nicolas-grekas)

HttpFoundation

  • security #ghsa-xg2q-4rrq-657q [HttpFoundation] Add the list of private ranges usable as trusted proxies (@nicolas-grekas)
  • security #cve-2026-118514 [HttpFoundation] Match HEAD requests when GET is listed in a MethodRequestMatcher (@nicolas-grekas)
  • security #cve-2026-118514 [HttpFoundation] Match HEAD requests when GET is listed in a RequestMatcher (@nicolas-grekas)
  • security #ghsa-5mx8-mwrp-5693 [HttpFoundation] Don't let Request::getBaseUrl() start with a host chosen by the client (@nicolas-grekas)
  • security #ghsa-3h27-hjv7-fqjx [HttpFoundation] Don't match the script name in Request::getBaseUrl() when it's only the start of a path segment (@jack-worman)
  • bug #67829 [HttpFoundation] Fix Request::getBaseUrl() for a percent-encoded or wrong-case script name after a prefix, and behind an alias (@jack-worman)
  • bug #67826 [HttpFoundation] Don't use the script name as Request::getBaseUrl() when it's not in the URI path (@jack-worman)
  • bug #67804 [HttpFoundation] Don't match the script name in Request::getBaseUrl() when it's only the start of a path segment (@jack-worman)
  • bug #67814 [HttpFoundation] Fix UrlHelper for fragments behind a trusted X-Forwarded-Prefix and for an empty path (@nicolas-grekas)
  • bug #67800 [HttpFoundation] Preserve the base URL for query and fragment references (@ahbaqdadi)
  • minor #67760 [HttpFoundation][Lock][Semaphore] Do not expose the DSN in the exception thrown for unsupported connections (@nicolas-grekas)
  • minor #67746 [HttpFoundation] Mark the DSN and options of SessionHandlerFactory as #[\SensitiveParameter] (@nicolas-grekas)

HttpKernel

  • security #ghsa-wg5q-m2ww-f3c9 [HttpKernel] Restore the router context of the parent request after a sub-request (@nicolas-grekas)
  • bug #67683 [HttpKernel] Compute #[Cache] durations without daylight saving time (@nicolas-grekas)
  • bug #67607 [HttpKernel] Fix searching profiles by status code 0 (@chr-hertel)

Lock

  • minor #67745 [Lock] Mark the DSNs and options of the DBAL and MongoDB stores as #[\SensitiveParameter] (@nicolas-grekas)

Messenger

  • bug #67792 [Messenger] Don't reuse a serialized body after replacing the message (@dalerazimov)
  • bug #67767 [Messenger] Fix the Redis transport throwing "Redis server went away" when connecting fails (@nicolas-grekas)
  • bug #67753 [Messenger] Treat Beanstalkd jobs that aren't Messenger envelopes as decoding failures (@nicolas-grekas)
  • bug #67724 [Messenger] Fix Redis DSN credential decoding and exception traces (@nicolas-grekas)
  • bug #67711 [Messenger] Do not resend the stamp headers of a received AMQP message (@BenMacha)
  • bug #67709 [Messenger] Restore the schema assets filter when the Doctrine transport setup fails (@BenMacha)
  • bug #67710 [Messenger] Do not expose the Redis DSN in the invalid host query parameter exception (@BenMacha)
  • bug #67654 [Messenger] Wait for all batch handlers before acknowledging a message (@andreybolonin)
  • bug #67655 [Messenger] Retry the messages whose batch was flushed during a failed dispatch (@nicolas-grekas)
  • bug #67651 [Messenger] Let the worker flush the batches that contain a failed message (@nicolas-grekas)
  • bug #67647 [Messenger] Don't hide handler failures when a batch handler acks the same message (@nicolas-grekas)
  • bug #67643 [Messenger] Preserve handled stamps when a batch handler nacks (@dalerazimov)
  • minor #67763 [Messenger] Treat encoded envelopes whose body or type isn't a string as decoding failures (@nicolas-grekas)
  • minor #67766 [Messenger] Ignore the "X-Symfony-Messenger" attribute of an SQS message when it isn't a JSON object (@nicolas-grekas)
  • minor #67754 [Messenger] Treat Redis stream entries that aren't Messenger envelopes as decoding failures (@nicolas-grekas)
  • minor #67739 [Messenger] Mark transport options as #[\SensitiveParameter] (@nicolas-grekas)
  • minor #67722 [Messenger] Ignore ids that are not integers when finding a message of the Doctrine transport (@BenMacha)

Notifier

  • minor #67761 [Notifier][Translation] Do not expose the DSN in the exception thrown when its password is missing (@nicolas-grekas)

PropertyAccess

  • bug #67733 [PropertyAccess] Fix parsing type errors thrown by anonymous classes (@nicolas-grekas)
  • bug #67682 [PropertyAccess] Handle uninitialized properties of anonymous classes on PHP 8.6 (@nicolas-grekas)

PropertyInfo

  • bug #67788 [PropertyInfo] Don't turn intersection types into class names in PhpDocExtractor (@nicolas-grekas)

RateLimiter

  • bug #67705 [RateLimiter] Validate the refill amount, the fixed window interval and the sliding window limit (@BenMacha)

Routing

  • security #cve-2026-118516 [Routing] Prevent host placeholders from matching the path in compiled matchers (@nicolas-grekas)

Security

  • security #cve-2026-118513 [Security] Parse the DN into RDNs before extracting the user identifier (@nicolas-grekas)
  • security #ghsa-8f57-m8wj-x65w [Security] Run checkPostAuth() of user checkers on programmatic logins (@nicolas-grekas)
  • minor #67738 [Security] Fix Voter with anonymous classes and nested supports() calls (@nicolas-grekas)
  • minor #67707 [Security] Reject login links with an out of range "expires" parameter (@BenMacha)
  • minor #67708 [Security] Ignore target and failure paths that are neither paths nor absolute URLs (@BenMacha)
  • minor #67716 [Security] Reject malformed login link user identifiers (@nicolas-grekas)
  • minor #67706 [Security] Reject remember-me cookies with an invalid expiration time (@BenMacha)

Serializer

  • security #ghsa-hqp2-7rr8-hf26 [Serializer] Ignore undeclared property paths when denormalizing (@nicolas-grekas)
  • security #cve-2026-118515 [Serializer] Don't build UploadedFile and other file objects from denormalized data (@nicolas-grekas)
  • security #ghsa-pxj9-jh84-vhm5 [Serializer] Lowercase the scheme of data URIs before opening them (@nicolas-grekas)
  • bug #67752 [Serializer] Skip empty lines when decoding multi-column CSV documents (@0xABCD01)
  • bug #67665 [Serializer] Fix denormalizing a data URI ending with slashes to a File (@ahmed-bhs)

Translation

  • bug #67669 [Translation] Don't read provider responses as file paths (@nicolas-grekas)
  • minor #67625 [Translation] Reviewed the Danish translation in issue #65554 (@mcardle)

Validator

  • security #ghsa-4qpf-57w4-m3wc [Validator] Reject non-public IP addresses in the no-priv, no-res and only-public modes (@nicolas-grekas)
  • bug #67787 [Validator] Only extract property types when auto-mapping applies (@paulferrett)
  • minor #67644 [Validator] Show the count in the word count messages of locales with a single plural form (@nicolas-grekas)

WebProfilerBundle

  • bug #67618 [WebProfilerBundle] Reset the CSP handler between requests (@norkunas)
  • bug #67620 [WebProfilerBundle] Reset the profiler Twig extension between requests (@nicolas-grekas)
  • bug #67606 [WebProfilerBundle] Return a 404 when opening the profiler file viewer without a file (@kevinsleegerslameco, @nicolas-grekas)

Yaml

  • security #ghsa-hwfg-qwvh-2wfx [Yaml] Fix exponential and quadratic parse times (@nicolas-grekas)
  • security #ghsa-hwfg-qwvh-2wfx [Yaml] Fix quadratic parse times (@nicolas-grekas)
  • bug #67735 [Yaml] Strip the byte order mark at the start of a stream (@0xABCD01)

Other

  • bug #67614 Reject trailing newlines in Content-Disposition fallbacks (@ahbaqdadi)
  • minor #67675 translation: checked proposed serbian translations (@Trysha-rbrn)
  • minor #67676 review(translation): [#64516] reviewed and updated the translation (@mikocevar)
  • minor #67649 Review translations for Estonian (et) (@erkia)
Published in #Releases