{"record":{"id":"6ab0fd615ee121ef","repo":"parallax/jsPDF","slug":"unknown-graphic-control-label-0x-buf-p-1-to","errorCode":null,"errorMessage":"Unknown graphic control label: 0x\" + buf[p - 1].toString(16)","messagePattern":"Unknown graphic control label: 0x\" \\+ buf\\[p - 1\\]\\.toString\\(16\\)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"src/libs/omggif.js","lineNumber":532,"sourceCode":"            if ((pf1 & 1) === 0) transparent_index = null;\n            disposal = (pf1 >> 2) & 0x7;\n            p++; // Skip terminator.\n            break;\n\n          case 0xfe: // Comment Extension.\n            while (true) {\n              // Seek through subblocks.\n              var block_size = buf[p++];\n              // Bad block size (ex: undefined from an out of bounds read).\n              if (!(block_size >= 0)) throw Error(\"Invalid block size\");\n              if (block_size === 0) break; // 0 size is terminator\n              // console.log(buf.slice(p, p+block_size).toString('ascii'));\n              p += block_size;\n            }\n            break;\n\n          default:\n            throw new Error(\n              \"Unknown graphic control label: 0x\" + buf[p - 1].toString(16)\n            );\n        }\n        break;\n\n      case 0x2c: // Image Descriptor.\n        var x = buf[p++] | (buf[p++] << 8);\n        var y = buf[p++] | (buf[p++] << 8);\n        var w = buf[p++] | (buf[p++] << 8);\n        var h = buf[p++] | (buf[p++] << 8);\n        var pf2 = buf[p++];\n        var local_palette_flag = pf2 >> 7;\n        var interlace_flag = (pf2 >> 6) & 1;\n        var num_local_colors_pow2 = pf2 & 0x7;\n        var num_local_colors = 1 << (num_local_colors_pow2 + 1);\n        var palette_offset = global_palette_offset;\n        var palette_size = global_palette_size;\n        var has_local_palette = false;","sourceCodeStart":514,"sourceCodeEnd":550,"githubUrl":"https://github.com/parallax/jsPDF/blob/a3930ce03a585a26b2c76d12a0f413ce96f6d1a3/src/libs/omggif.js#L514-L550","documentation":"Thrown by GifReader when an extension introducer (0x21) is followed by a label byte that is not one of the handled ones (0xFF application, 0xF9 graphics control, 0xFE comment, or 0x01 plain text). It indicates an unknown or unsupported extension label in the GIF stream; the byte value is included in the message.","triggerScenarios":"Decoding a GIF that uses a non-standard extension label; corruption altering a label byte; an encoder emitting an extension omggif does not handle (e.g. certain plain-text 0x01 variants may still hit default depending on coverage).","commonSituations":"GIFs produced by niche/proprietary encoders adding custom metadata extensions; bit-flip corruption of the label byte; partial support mismatch across omggif versions.","solutions":["Re-encode the GIF with a mainstream encoder to strip unknown extensions.","Upgrade omggif in case newer versions handle the label.","Catch the error and fall back to a sanitized/re-encoded copy."],"exampleFix":"// before\nvar reader = new GifReader(buffer);\n// after\ntry {\n  var reader = new GifReader(buffer);\n} catch (e) {\n  if (/Unknown graphic control label/.test(e.message)) {\n    reader = new GifReader(reencodedBuffer);\n  } else throw e;\n}","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try { var reader = new GifReader(buffer); } catch (e) { if (/Unknown graphic control label/.test(e.message)) { reader = new GifReader(reencodedBuffer); } else throw e; }","preventionTips":["Re-encode GIFs with non-standard extensions","Keep omggif up to date for broader extension support"],"tags":["gif","omggif","image","file-format","parsing","unsupported-extension"],"backgroundTag":null,"analyzedSha":"a3930ce03a585a26b2c76d12a0f413ce96f6d1a3","analyzedAt":"2026-08-13T05:33:39.648Z","schemaVersion":2},"datasetVersion":"2026-08-13T09:17:06.757Z"}