{"record":{"id":"64b1256fceb0347f","repo":"aeron-io/aeron","slug":"label-length-out-of-bounds-labellength","errorCode":null,"errorMessage":"label length out of bounds: <labelLength>","messagePattern":"label length out of bounds: <labelLength>","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"aeron-client/src/main/java/io/aeron/ClientConductor.java","lineNumber":1139,"sourceCode":"        final int keyLength,\n        final DirectBuffer labelBuffer,\n        final int labelOffset,\n        final int labelLength)\n    {\n        clientLock.lock();\n        try\n        {\n            ensureActive();\n            ensureNotReentrant();\n\n            if (keyLength < 0 || keyLength > CountersManager.MAX_KEY_LENGTH)\n            {\n                throw new IllegalArgumentException(\"key length out of bounds: \" + keyLength);\n            }\n\n            if (labelLength < 0 || labelLength > CountersManager.MAX_LABEL_LENGTH)\n            {\n                throw new IllegalArgumentException(\"label length out of bounds: \" + labelLength);\n            }\n\n            final long registrationId = driverProxy.addCounter(\n                typeId, keyBuffer, keyOffset, keyLength, labelBuffer, labelOffset, labelLength);\n\n            awaitResponse(registrationId);\n\n            return (Counter)resourceByRegIdMap.get(registrationId);\n        }\n        finally\n        {\n            clientLock.unlock();\n        }\n    }\n\n    Counter addCounter(final int typeId, final String label)\n    {\n        clientLock.lock();","sourceCodeStart":1121,"sourceCodeEnd":1157,"githubUrl":"https://github.com/aeron-io/aeron/blob/6d60124e15e35c11b49ba2e3c2c2858a09a18803/aeron-client/src/main/java/io/aeron/ClientConductor.java#L1121-L1157","documentation":"Thrown by ClientConductor.addCounter when the label length is negative or exceeds CountersManager.MAX_LABEL_LENGTH. Labels are stored in fixed-size slots in the counters file, so oversized labels cannot be registered.","triggerScenarios":"Calling the buffer-based addCounter with labelLength < 0 or labelLength > CountersManager.MAX_LABEL_LENGTH (default 1024), typically labelBytes.length beyond the limit.","commonSituations":"Generating human-readable labels that include long URIs or identifiers; unbounded label construction from user input; dynamic labels concatenating many fields.","solutions":["Truncate the label to CountersManager.MAX_LABEL_LENGTH characters/bytes before calling addCounter.","Shorten the label template (drop redundant prefixes such as 'counter for channel ...').","Validate label length at configuration time and fail with your own clearer error."],"exampleFix":"// before\nString label = \"flow rate for \" + uri + \" stream \" + streamId + \" ...\"; // may exceed limit\nclient.addCounter(typeId, label);\n// after\nString label = shortLabel(uri, streamId);\nif (label.length() > CountersManager.MAX_LABEL_LENGTH) label = label.substring(0, CountersManager.MAX_LABEL_LENGTH);\nclient.addCounter(typeId, label);","handlingStrategy":"validation","validationCode":"if (labelLength < 0 || labelLength > CountersManager.MAX_LABEL_LENGTH) labelLength = CountersManager.MAX_LABEL_LENGTH; // truncate\nclient.addCounter(typeId, keyBuffer, keyOffset, keyLength, labelBuffer, labelOffset, labelLength);","typeGuard":null,"tryCatchPattern":"try { client.addCounter(typeId, keyBuffer, keyOffset, keyLength, labelBuffer, labelOffset, labelLength); } catch (IllegalArgumentException e) { log.error(\"counter label invalid: {}\", e.getMessage()); }","preventionTips":["Truncate labels to CountersManager.MAX_LABEL_LENGTH at construction time.","Keep label templates short.","Test counter creation with the longest label your system can generate."],"tags":["java","aeron","counters","bounds"],"backgroundTag":"value-out-of-range","analyzedSha":"6d60124e15e35c11b49ba2e3c2c2858a09a18803","analyzedAt":"2026-09-12T11:17:07.683Z","contentChangedAt":"2026-09-12T11:17:07.683Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}