From b8397cd45657b84e88bd1202528d1764265f185c Mon Sep 17 00:00:00 2001
From: Alex Tutubalin <lexa@lexa.ru>
Date: Tue, 17 Mar 2026 12:57:06 +0300
Subject: [PATCH] Nikon padded/12bit: no need to calculate padded row size
 before final raw_width adjustment

---
 src/decoders/decoders_libraw.cpp | 15 ++++++---------
 src/metadata/tiff.cpp            |  2 --
 2 files changed, 6 insertions(+), 11 deletions(-)

Index: LibRaw-0.21.4/src/decoders/decoders_libraw.cpp
===================================================================
--- LibRaw-0.21.4.orig/src/decoders/decoders_libraw.cpp
+++ LibRaw-0.21.4/src/decoders/decoders_libraw.cpp
@@ -251,17 +251,22 @@ void LibRaw::fuji_14bit_load_raw()
 void LibRaw::nikon_load_padded_packed_raw() // 12 bit per pixel, padded to 16
                                             // bytes
 {
+  unsigned bytesperrow = (((unsigned(S.raw_width) * 3u / 2u) + 15u) / 16u) * 16u; // bytes per row
   // libraw_internal_data.unpacker_data.load_flags -> row byte count
-  if (libraw_internal_data.unpacker_data.load_flags < 2000 ||
-      libraw_internal_data.unpacker_data.load_flags > 64000)
+  if (bytesperrow < 2000 || bytesperrow > 64000)
     return;
-  unsigned char *buf =
-      (unsigned char *)calloc(libraw_internal_data.unpacker_data.load_flags,1);
+   unsigned char *buf =
+      (unsigned char *)calloc(bytesperrow,1);
+
   for (int row = 0; row < S.raw_height; row++)
   {
     checkCancel();
-    libraw_internal_data.internal_data.input->read(
-        buf, libraw_internal_data.unpacker_data.load_flags, 1);
+    int readed = libraw_internal_data.internal_data.input->read(
+        buf, bytesperrow, 1);
+
+    if (readed < (int)bytesperrow)
+      derror();
+
     for (int icol = 0; icol < S.raw_width / 2; icol++)
     {
       imgdata.rawdata.raw_image[(row)*S.raw_width + (icol * 2)] =
Index: LibRaw-0.21.4/src/metadata/tiff.cpp
===================================================================
--- LibRaw-0.21.4.orig/src/metadata/tiff.cpp
+++ LibRaw-0.21.4/src/metadata/tiff.cpp
@@ -2031,8 +2031,6 @@ void LibRaw::apply_tiff()
                INT64(tiff_ifd[raw].bytes))
       {
         load_raw = &LibRaw::nikon_load_padded_packed_raw;
-        load_flags = (((INT64(raw_width) * 3ULL / 2ULL) + 15ULL) / 16ULL) *
-                     16ULL; // bytes per row
       }
       else if (!strncmp(model, "NIKON Z 9", 9) && tiff_ifd[raw].offset)
       {
