{"record":{"id":"46c370488aa10959","repo":"grpc/grpc-java","slug":"unsupported-operation-setoobinline","errorCode":null,"errorMessage":"Unsupported operation setOOBInline()","messagePattern":"Unsupported operation setOOBInline\\(\\)","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"info","filePath":"android/src/main/java/io/grpc/android/UdsSocket.java","lineNumber":240,"sourceCode":"\n  @Override\n  public synchronized boolean isOutputShutdown() {\n    return outputShutdown;\n  }\n\n  @Override\n  public void sendUrgentData(int data) {\n    throw new UnsupportedOperationException(\"Unsupported operation sendUrgentData()\");\n  }\n\n  @Override\n  public void setKeepAlive(boolean on) {\n    throw new UnsupportedOperationException(\"Unsupported operation setKeepAlive()\");\n  }\n\n  @Override\n  public void setOOBInline(boolean on) {\n    throw new UnsupportedOperationException(\"Unsupported operation setOOBInline()\");\n  }\n\n  @Override\n  public void setPerformancePreferences(int connectionTime, int latency, int bandwidth) {\n    throw new UnsupportedOperationException(\"Unsupported operation setPerformancePreferences()\");\n  }\n\n  @Override\n  public void setReceiveBufferSize(int size) throws SocketException {\n    try {\n      localSocket.setReceiveBufferSize(size);\n    } catch (IOException e) {\n      throw toSocketException(e);\n    }\n  }\n\n  @Override\n  public void setReuseAddress(boolean on) {","sourceCodeStart":222,"sourceCodeEnd":258,"githubUrl":"https://github.com/grpc/grpc-java/blob/64daddc1f3d1975670f769f3e97bde8b2ba32d25/android/src/main/java/io/grpc/android/UdsSocket.java#L222-L258","documentation":"Sentinel guard in UdsSocket's Socket adapter: the OOBInline socket option is meaningless for Unix domain sockets, so the setOOBInline override always rejects the call. It fires when socket-configuration code written for TCP tries to enable out-of-band inline reception on this UDS-backed socket.","triggerScenarios":"Calling UdsSocket.setOOBInline(boolean) directly, or bulk socket-option setup routines that apply every standard Socket option regardless of transport.","commonSituations":"Generic socket-hardening checklists applied to all sockets in an Android app; shared network-layer code reused between TCP and UDS gRPC channels.","solutions":["Do not set OOB inline on UDS sockets; it has no meaning without TCP urgent data","Make socket-option appliers type-aware and skip TCP-only options for UdsSocket","Handle UnsupportedOperationException in option-setting loops so one unsupported option doesn't abort channel setup"],"exampleFix":"// before\nsocket.setOOBInline(true);\n// after\ntry {\n  socket.setOOBInline(true);\n} catch (UnsupportedOperationException e) {\n  // option not applicable to this socket type (e.g. UDS)\n}","handlingStrategy":"try-catch","validationCode":"boolean supportsOobInline = !(socket instanceof io.grpc.android.UdsSocket);","typeGuard":"static boolean supportsTcpOnlyOption(java.net.Socket s) { return !(s instanceof io.grpc.android.UdsSocket); }","tryCatchPattern":"try { socket.setOOBInline(on); } catch (UnsupportedOperationException e) { /* skip on UDS */ }","preventionTips":["Apply TCP-only options (OOBInline, KeepAlive, SoLinger, TrafficClass) only to IP sockets","Wrap bulk option application in per-option try/catch so setup continues"],"tags":["grpc","android","unix-domain-socket","socket-options"],"backgroundTag":"unsupported-operation","analyzedSha":"64daddc1f3d1975670f769f3e97bde8b2ba32d25","analyzedAt":"2026-09-08T06:14:57.704Z","contentChangedAt":"2026-09-08T06:14:57.704Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}