{"record":{"id":"6e7f6cdb93af10f5","repo":"gofr-dev/gofr","slug":"invalid-offset-must-be-0-6e7f6c","errorCode":null,"errorMessage":"invalid offset: must be >= 0","messagePattern":"invalid offset: must be >= 0","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/gofr/datasource/file/ftp/storage_adapter.go","lineNumber":22,"sourceCode":"\t\"bytes\"\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"path\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/jlaffaye/ftp\"\n\t\"gofr.dev/pkg/gofr/datasource/file\"\n)\n\nvar (\n\t// Storage adapter errors.\n\terrFTPConfigNil            = errors.New(\"FTP config is nil\")\n\terrFTPClientNotInitialized = errors.New(\"FTP client is not initialized\")\n\terrEmptyObjectName         = errors.New(\"object name is empty\")\n\terrInvalidOffset           = errors.New(\"invalid offset: must be >= 0\")\n\terrEmptySourceOrDest       = errors.New(\"source and destination names cannot be empty\")\n\terrSameSourceAndDest       = errors.New(\"source and destination are the same\")\n\terrFailedToCreateReader    = errors.New(\"failed to create reader\")\n\terrFailedToCreateWriter    = errors.New(\"failed to create writer\")\n\terrObjectNotFound          = errors.New(\"object not found\")\n\terrFailedToGetObjectAttrs  = errors.New(\"failed to get object attrs\")\n\terrFailedToDeleteObject    = errors.New(\"failed to delete object\")\n\terrFailedToListObjects     = errors.New(\"failed to list objects\")\n\terrFailedToListDirectory   = errors.New(\"failed to list directory\")\n\terrWriterAlreadyClosed     = errors.New(\"writer already closed\")\n\terrFTPConfigInvalid        = errors.New(\"invalid FTP configuration: host and port are required\")\n)\n\n// Config represents the FTP configuration.\ntype Config struct {\n\tHost        string        // FTP server hostname\n\tUser        string        // FTP username\n\tPassword    string        // FTP password","sourceCodeStart":4,"sourceCodeEnd":40,"githubUrl":"https://github.com/gofr-dev/gofr/blob/187eb24962502e91f1fee856230670958b66e89c/pkg/gofr/datasource/file/ftp/storage_adapter.go#L4-L40","documentation":"errInvalidOffset is returned by NewRangeReader when the requested byte offset is negative. Range reads start from a non-negative position in the remote file; a negative offset is nonsensical and rejected before any network call.","triggerScenarios":"Calling NewRangeReader(ctx, name, offset, length) with offset < 0 — e.g. computing offset as size-n when n > size, or passing an uninitialized int64 defaulting negative.","commonSituations":"Cursor/pagination arithmetic underflowing below zero; users supplying a resume position from untrusted input without clamping.","solutions":["Clamp offset to >= 0 before calling: if offset < 0 { offset = 0 }.","Fix the arithmetic producing the negative value (guard subtraction by the actual size).","Sanitize user-supplied resume positions at the API boundary."],"exampleFix":"// before\noffset := size - chunkSize // can be negative\nr, err := adapter.NewRangeReader(ctx, name, offset, chunkSize)\n// after\noffset := size - chunkSize\nif offset < 0 { offset = 0 }\nr, err := adapter.NewRangeReader(ctx, name, offset, chunkSize)","handlingStrategy":"validation","validationCode":"if offset < 0 { offset = 0 } // or reject: return fmt.Errorf(\"offset must be >= 0\")","typeGuard":"func validOffset(offset, length int64) bool { return offset >= 0 && length > 0 }","tryCatchPattern":"if !validOffset(offset, length) {\n    return fmt.Errorf(\"invalid range request: offset=%d\", offset)\n}\nr, err := adapter.NewRangeReader(ctx, name, offset, length)","preventionTips":["Clamp or reject negative offsets before range reads.","Guard subtraction-based offsets (size - n) against underflow.","Sanitize user-provided resume positions with a minimum of 0."],"tags":["go","ftp","range-read","validation"],"backgroundTag":"invalid-offset","analyzedSha":"187eb24962502e91f1fee856230670958b66e89c","analyzedAt":"2026-09-01T20:34:54.554Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T15:18:49.778Z"}