Have std/bmp detect bad RLE compression
diff --git a/release/c/wuffs-unsupported-snapshot.c b/release/c/wuffs-unsupported-snapshot.c
index 4cc5d6e..0019448 100644
--- a/release/c/wuffs-unsupported-snapshot.c
+++ b/release/c/wuffs-unsupported-snapshot.c
@@ -5445,6 +5445,7 @@
 // ---------------- Status Codes
 
 extern const char wuffs_bmp__error__bad_header[];
+extern const char wuffs_bmp__error__bad_rle_compression[];
 extern const char wuffs_bmp__error__unsupported_bmp_file[];
 
 // ---------------- Public Consts
@@ -16110,6 +16111,7 @@
 // ---------------- Status Codes Implementations
 
 const char wuffs_bmp__error__bad_header[] = "#bmp: bad header";
+const char wuffs_bmp__error__bad_rle_compression[] = "#bmp: bad RLE compression";
 const char wuffs_bmp__error__unsupported_bmp_file[] = "#bmp: unsupported BMP file";
 const char wuffs_bmp__note__internal_note_short_read[] = "@bmp: internal note: short read";
 
@@ -17818,6 +17820,10 @@
             wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_dst, v_dst_palette, ((uint64_t)(self->private_impl.f_rle_delta_x)));
             wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(self->private_impl.f_rle_delta_x)));
             self->private_impl.f_rle_delta_x = 0;
+            if (self->private_impl.f_dst_x > self->private_impl.f_width) {
+              status = wuffs_base__make_status(wuffs_bmp__error__bad_rle_compression);
+              goto exit;
+            }
           }
           if (v_code > 0) {
 #if defined(__GNUC__)
@@ -17830,6 +17836,10 @@
 #endif
             while (true) {
               self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc;
+              if (self->private_impl.f_dst_y == self->private_impl.f_dst_y_end) {
+                status = wuffs_base__make_status(wuffs_bmp__error__bad_rle_compression);
+                goto exit;
+              }
               v_row = wuffs_base__table_u8__row(v_tab, self->private_impl.f_dst_y);
               if (v_dst_bytes_per_row < ((uint64_t)(v_row.len))) {
                 v_row = wuffs_base__slice_u8__subslice_j(v_row, v_dst_bytes_per_row);
diff --git a/std/bmp/decode_bmp.wuffs b/std/bmp/decode_bmp.wuffs
index eb9eab9..50d0622 100644
--- a/std/bmp/decode_bmp.wuffs
+++ b/std/bmp/decode_bmp.wuffs
@@ -13,6 +13,7 @@
 // limitations under the License.
 
 pub status "#bad header"
+pub status "#bad RLE compression"
 pub status "#unsupported BMP file"
 
 pri status "@internal note: short read"
@@ -733,6 +734,9 @@
 						num_pixels: this.rle_delta_x as base.u64)
 					this.dst_x ~sat+= this.rle_delta_x as base.u32
 					this.rle_delta_x = 0
+					if this.dst_x > this.width {
+						return "#bad RLE compression"
+					}
 				}
 
 				// Paint the skipped rows (and the partial final row) with
@@ -741,6 +745,9 @@
 					code -= 1
 					while true {
 						this.dst_y ~mod+= this.dst_y_inc
+						if this.dst_y == this.dst_y_end {
+							return "#bad RLE compression"
+						}
 						row = tab.row(y: this.dst_y)
 						if dst_bytes_per_row < row.length() {
 							row = row[.. dst_bytes_per_row]