diff -pruN 0.9.1-1/debian/changelog 0.9.1-1ubuntu2/debian/changelog
--- 0.9.1-1/debian/changelog	2025-09-15 12:53:36.000000000 +0000
+++ 0.9.1-1ubuntu2/debian/changelog	2025-09-18 12:22:51.000000000 +0000
@@ -1,3 +1,17 @@
+libnginx-mod-js (0.9.1-1ubuntu2) questing; urgency=medium
+
+  * debian/patches/19b8cf1a64c56a3731a7782a3c4d6e022a0ca5a3.patch:
+    - use upstream approach instead of forcing O2 on ppc64el
+
+ -- Gianfranco Costamagna <locutusofborg@debian.org>  Thu, 18 Sep 2025 14:22:51 +0200
+
+libnginx-mod-js (0.9.1-1ubuntu1) questing; urgency=medium
+
+  * Force O2 on ppc64el, fixing FTBFS
+    see: https://github.com/nginx/njs/issues/964
+
+ -- Gianfranco Costamagna <locutusofborg@debian.org>  Tue, 16 Sep 2025 10:28:59 +0200
+
 libnginx-mod-js (0.9.1-1) unstable; urgency=medium
 
   * New upstream version 0.9.1. Closes: #1097236.
diff -pruN 0.9.1-1/debian/patches/19b8cf1a64c56a3731a7782a3c4d6e022a0ca5a3.patch 0.9.1-1ubuntu2/debian/patches/19b8cf1a64c56a3731a7782a3c4d6e022a0ca5a3.patch
--- 0.9.1-1/debian/patches/19b8cf1a64c56a3731a7782a3c4d6e022a0ca5a3.patch	1970-01-01 00:00:00.000000000 +0000
+++ 0.9.1-1ubuntu2/debian/patches/19b8cf1a64c56a3731a7782a3c4d6e022a0ca5a3.patch	2025-09-18 12:22:51.000000000 +0000
@@ -0,0 +1,120 @@
+From 19b8cf1a64c56a3731a7782a3c4d6e022a0ca5a3 Mon Sep 17 00:00:00 2001
+From: Dmitry Volyntsev <xeioex@nginx.com>
+Date: Tue, 16 Sep 2025 18:28:05 -0700
+Subject: [PATCH] Fixed build with gcc-15 and -O3.
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+build/src/njs_object.dep -MT build/src/njs_object.o \ src/njs_object.c
+In file included from src/njs_main.h:18, from src/njs_object.c:8: In
+function ‘njs_utf8_copy’, inlined from ‘njs_object_enumerate_string’ at
+src/njs_object.c:769:21: src/njs_utf8.h:115:20: error: writing 1 byte
+into a region of size 0 [-Werror=stringop-overflow=] 115 |
+*dst++ = c; |             ~~~~~~~^~~ src/njs_object.c: In function
+‘njs_object_enumerate_string’: src/njs_object.c:719:24: note: at offset
+4 into destination object ‘buf’ of size 4 719 |     u_char
+buf[4], *c; |                        ^~~ In function ‘njs_utf8_copy’,
+inlined from ‘njs_object_enumerate_string’ at src/njs_object.c:769:21:
+src/njs_utf8.h:115:20: error: writing 1 byte into a region of size 0
+[-Werror=stringop-overflow=]
+
+GCC-15 does not know that the loop in njs_utf8_copy() is bounded
+because the input is a valid UTF-8 here.
+
+This fixes #967 issue on Github.
+---
+ src/njs_array.c  | 11 ++++-------
+ src/njs_object.c | 17 ++++++-----------
+ 2 files changed, 10 insertions(+), 18 deletions(-)
+
+diff --git a/src/njs_array.c b/src/njs_array.c
+index bcf428e9c..b8cb9f944 100644
+--- a/src/njs_array.c
++++ b/src/njs_array.c
+@@ -788,7 +788,6 @@ static njs_int_t
+ njs_array_prototype_slice_copy(njs_vm_t *vm, njs_value_t *this,
+     int64_t start, int64_t length, njs_value_t *retval)
+ {
+-    u_char             *c, buf[4];
+     size_t             size;
+     uint32_t           n;
+     njs_int_t          ret;
+@@ -829,17 +828,15 @@ njs_array_prototype_slice_copy(njs_vm_t *vm, njs_value_t *this,
+ 
+             do {
+                 value = &array->start[n++];
+-                c = buf;
+-                c = njs_utf8_copy(c, &src, end);
+-                size = c - buf;
++                size = njs_utf8_next(src, end) - src;
+ 
+-                ret = njs_string_new(vm, value, buf, size, 1);
++                ret = njs_string_new(vm, value, src, size, 1);
+                 if (njs_slow_path(ret != NJS_OK)) {
+                     return NJS_ERROR;
+                 }
+ 
+-                length--;
+-            } while (length != 0);
++                src += size;
++            } while (src != end);
+ 
+         } else if (njs_is_object(this)) {
+ 
+diff --git a/src/njs_object.c b/src/njs_object.c
+index 7f0b1822c..26e8182b9 100644
+--- a/src/njs_object.c
++++ b/src/njs_object.c
+@@ -715,7 +715,6 @@ static njs_int_t
+ njs_object_enumerate_string(njs_vm_t *vm, const njs_value_t *value,
+     njs_array_t *items, uint32_t flags)
+ {
+-    u_char             buf[4], *c;
+     uint32_t           i, len, size;
+     njs_int_t          ret;
+     njs_value_t        *item, *string;
+@@ -763,17 +762,15 @@ njs_object_enumerate_string(njs_vm_t *vm, const njs_value_t *value,
+             end = src + str_prop.size;
+ 
+             do {
+-                c = buf;
++                size = njs_utf8_next(src, end) - src;
+ 
+-                c = njs_utf8_copy(c, &src, end);
+-                size = c - buf;
+-
+-                ret = njs_string_new(vm, item, buf, size, 1);
++                ret = njs_string_new(vm, item, src, size, 1);
+                 if (njs_slow_path(ret != NJS_OK)) {
+                     return NJS_ERROR;
+                 }
+ 
+                 item++;
++                src += size;
+ 
+             } while (src != end);
+         }
+@@ -828,12 +825,9 @@ njs_object_enumerate_string(njs_vm_t *vm, const njs_value_t *value,
+ 
+                 string = &entry->start[1];
+ 
+-                c = buf;
+-
+-                c = njs_utf8_copy(c, &src, end);
+-                size = c - buf;
++                size = njs_utf8_next(src, end) - src;
+ 
+-                ret = njs_string_new(vm, string, buf, size, 1);
++                ret = njs_string_new(vm, string, src, size, 1);
+                 if (njs_slow_path(ret != NJS_OK)) {
+                     return NJS_ERROR;
+                 }
+@@ -841,6 +835,7 @@ njs_object_enumerate_string(njs_vm_t *vm, const njs_value_t *value,
+                 njs_set_array(item, entry);
+ 
+                 item++;
++                src += size;
+ 
+             } while (src != end);
+         }
diff -pruN 0.9.1-1/debian/patches/series 0.9.1-1ubuntu2/debian/patches/series
--- 0.9.1-1/debian/patches/series	1970-01-01 00:00:00.000000000 +0000
+++ 0.9.1-1ubuntu2/debian/patches/series	2025-09-18 12:22:51.000000000 +0000
@@ -0,0 +1 @@
+19b8cf1a64c56a3731a7782a3c4d6e022a0ca5a3.patch
