mirror of
1
Fork 0

[chore]: Bump github.com/gin-contrib/sessions from 1.0.2 to 1.0.3 (#4033)

Bumps [github.com/gin-contrib/sessions](https://github.com/gin-contrib/sessions) from 1.0.2 to 1.0.3.
- [Release notes](https://github.com/gin-contrib/sessions/releases)
- [Changelog](https://github.com/gin-contrib/sessions/blob/master/.goreleaser.yaml)
- [Commits](https://github.com/gin-contrib/sessions/compare/v1.0.2...v1.0.3)

---
updated-dependencies:
- dependency-name: github.com/gin-contrib/sessions
  dependency-version: 1.0.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
This commit is contained in:
dependabot[bot] 2025-04-22 12:35:14 +02:00 committed by GitHub
parent 356c2adddc
commit d1abbd0290
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
33 changed files with 278 additions and 196 deletions

8
go.mod
View File

@ -39,7 +39,7 @@ require (
github.com/coreos/go-oidc/v3 v3.12.0 github.com/coreos/go-oidc/v3 v3.12.0
github.com/gin-contrib/cors v1.7.4 github.com/gin-contrib/cors v1.7.4
github.com/gin-contrib/gzip v1.2.3 github.com/gin-contrib/gzip v1.2.3
github.com/gin-contrib/sessions v1.0.2 github.com/gin-contrib/sessions v1.0.3
github.com/gin-gonic/gin v1.10.0 github.com/gin-gonic/gin v1.10.0
github.com/go-playground/form/v4 v4.2.1 github.com/go-playground/form/v4 v4.2.1
github.com/go-swagger/go-swagger v0.31.0 github.com/go-swagger/go-swagger v0.31.0
@ -153,7 +153,7 @@ require (
github.com/gorilla/css v1.0.1 // indirect github.com/gorilla/css v1.0.1 // indirect
github.com/gorilla/handlers v1.5.2 // indirect github.com/gorilla/handlers v1.5.2 // indirect
github.com/gorilla/securecookie v1.1.2 // indirect github.com/gorilla/securecookie v1.1.2 // indirect
github.com/gorilla/sessions v1.2.2 // indirect github.com/gorilla/sessions v1.4.0 // indirect
github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 // indirect
github.com/huandu/xstrings v1.4.0 // indirect github.com/huandu/xstrings v1.4.0 // indirect
github.com/imdario/mergo v0.3.16 // indirect github.com/imdario/mergo v0.3.16 // indirect
@ -208,12 +208,12 @@ require (
github.com/uptrace/opentelemetry-go-extra/otelsql v0.3.2 // indirect github.com/uptrace/opentelemetry-go-extra/otelsql v0.3.2 // indirect
github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect
github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect
go.mongodb.org/mongo-driver v1.14.0 // indirect go.mongodb.org/mongo-driver v1.17.3 // indirect
go.opentelemetry.io/auto/sdk v1.1.0 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0 // indirect
go.opentelemetry.io/proto/otlp v1.5.0 // indirect go.opentelemetry.io/proto/otlp v1.5.0 // indirect
go.uber.org/multierr v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect
golang.org/x/arch v0.15.0 // indirect golang.org/x/arch v0.16.0 // indirect
golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 // indirect golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 // indirect
golang.org/x/mod v0.24.0 // indirect golang.org/x/mod v0.24.0 // indirect
golang.org/x/sync v0.13.0 // indirect golang.org/x/sync v0.13.0 // indirect

16
go.sum generated
View File

@ -139,8 +139,8 @@ github.com/gin-contrib/cors v1.7.4 h1:/fC6/wk7rCRtqKqki8lLr2Xq+hnV49aXDLIuSek9g4
github.com/gin-contrib/cors v1.7.4/go.mod h1:vGc/APSgLMlQfEJV5NAzkrAHb0C8DetL3K6QZuvGii0= github.com/gin-contrib/cors v1.7.4/go.mod h1:vGc/APSgLMlQfEJV5NAzkrAHb0C8DetL3K6QZuvGii0=
github.com/gin-contrib/gzip v1.2.3 h1:dAhT722RuEG330ce2agAs75z7yB+NKvX/ZM1r8w0u2U= github.com/gin-contrib/gzip v1.2.3 h1:dAhT722RuEG330ce2agAs75z7yB+NKvX/ZM1r8w0u2U=
github.com/gin-contrib/gzip v1.2.3/go.mod h1:ad72i4Bzmaypk8M762gNXa2wkxxjbz0icRNnuLJ9a/c= github.com/gin-contrib/gzip v1.2.3/go.mod h1:ad72i4Bzmaypk8M762gNXa2wkxxjbz0icRNnuLJ9a/c=
github.com/gin-contrib/sessions v1.0.2 h1:UaIjUvTH1cMeOdj3in6dl+Xb6It8RiKRF9Z1anbUyCA= github.com/gin-contrib/sessions v1.0.3 h1:AZ4j0AalLsGqdrKNbbrKcXx9OJZqViirvNGsJTxcQps=
github.com/gin-contrib/sessions v1.0.2/go.mod h1:KxKxWqWP5LJVDCInulOl4WbLzK2KSPlLesfZ66wRvMs= github.com/gin-contrib/sessions v1.0.3/go.mod h1:5i4XMx4KPtQihnzxEqG9u1K446lO3G19jAi2GtbfsAI=
github.com/gin-contrib/sse v1.0.0 h1:y3bT1mUWUxDpW4JLQg/HnTqV4rozuW4tC9eFKTxYI9E= github.com/gin-contrib/sse v1.0.0 h1:y3bT1mUWUxDpW4JLQg/HnTqV4rozuW4tC9eFKTxYI9E=
github.com/gin-contrib/sse v1.0.0/go.mod h1:zNuFdwarAygJBht0NTKiSi3jRf6RbqeILZ9Sp6Slhe0= github.com/gin-contrib/sse v1.0.0/go.mod h1:zNuFdwarAygJBht0NTKiSi3jRf6RbqeILZ9Sp6Slhe0=
github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU= github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU=
@ -241,8 +241,8 @@ github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyE
github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w= github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w=
github.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA= github.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA=
github.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo= github.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo=
github.com/gorilla/sessions v1.2.2 h1:lqzMYz6bOfvn2WriPUjNByzeXIlVzURcPmgMczkmTjY= github.com/gorilla/sessions v1.4.0 h1:kpIYOp/oi6MG/p5PgxApU8srsSw9tuFbt46Lt7auzqQ=
github.com/gorilla/sessions v1.2.2/go.mod h1:ePLdVu+jbEgHH+KWw8I1z2wqd0BAdAQh/8LRvBeoNcQ= github.com/gorilla/sessions v1.4.0/go.mod h1:FLWm50oby91+hl7p/wRxDth9bWSuk0qVL2emc7lT5ik=
github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 h1:e9Rjr40Z98/clHv5Yg79Is0NtosR5LXRvdr7o/6NwbA= github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 h1:e9Rjr40Z98/clHv5Yg79Is0NtosR5LXRvdr7o/6NwbA=
@ -491,8 +491,8 @@ github.com/yuin/goldmark v1.7.10 h1:S+LrtBjRmqMac2UdtB6yyCEJm+UILZ2fefI4p7o0QpI=
github.com/yuin/goldmark v1.7.10/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= github.com/yuin/goldmark v1.7.10/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg=
gitlab.com/NyaaaWhatsUpDoc/sqlite v1.37.0-concurrency-workaround h1:QbfrBqNKgAFSSK89fYf547vxDQuz8p6iJUzzAMrusNk= gitlab.com/NyaaaWhatsUpDoc/sqlite v1.37.0-concurrency-workaround h1:QbfrBqNKgAFSSK89fYf547vxDQuz8p6iJUzzAMrusNk=
gitlab.com/NyaaaWhatsUpDoc/sqlite v1.37.0-concurrency-workaround/go.mod h1:5YiWv+YviqGMuGw4V+PNplcyaJ5v+vQd7TQOgkACoJM= gitlab.com/NyaaaWhatsUpDoc/sqlite v1.37.0-concurrency-workaround/go.mod h1:5YiWv+YviqGMuGw4V+PNplcyaJ5v+vQd7TQOgkACoJM=
go.mongodb.org/mongo-driver v1.14.0 h1:P98w8egYRjYe3XDjxhYJagTokP/H6HzlsnojRgZRd80= go.mongodb.org/mongo-driver v1.17.3 h1:TQyXhnsWfWtgAhMtOgtYHMTkZIfBTpMTsMnd9ZBeHxQ=
go.mongodb.org/mongo-driver v1.14.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= go.mongodb.org/mongo-driver v1.17.3/go.mod h1:Hy04i7O2kC4RS06ZrhPRqj/u4DTYkFDAAccj+rVKqgQ=
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ= go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ=
@ -521,8 +521,8 @@ go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
golang.org/x/arch v0.15.0 h1:QtOrQd0bTUnhNVNndMpLHNWrDmYzZ2KDqSrEymqInZw= golang.org/x/arch v0.16.0 h1:foMtLTdyOmIniqWCHjY6+JxuC54XP1fDwx4N0ASyW+U=
golang.org/x/arch v0.15.0/go.mod h1:JmwW7aLIoRUKgaTzhkiEFxvcEiQGyOg9BMonBJUS7EE= golang.org/x/arch v0.16.0/go.mod h1:JmwW7aLIoRUKgaTzhkiEFxvcEiQGyOg9BMonBJUS7EE=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=

50
vendor/github.com/gin-contrib/sessions/.golangci.yml generated vendored Normal file
View File

@ -0,0 +1,50 @@
version: "2"
linters:
default: none
enable:
- bodyclose
- dogsled
- dupl
- errcheck
- exhaustive
- gochecknoinits
- goconst
- gocritic
- gocyclo
- goprintffuncname
- gosec
- govet
- ineffassign
- lll
- misspell
- nakedret
- noctx
- nolintlint
- rowserrcheck
- staticcheck
- unconvert
- unparam
- unused
- whitespace
exclusions:
generated: lax
presets:
- comments
- common-false-positives
- legacy
- std-error-handling
paths:
- third_party$
- builtin$
- examples$
formatters:
enable:
- gofmt
- gofumpt
- goimports
exclusions:
generated: lax
paths:
- third_party$
- builtin$
- examples$

2
vendor/github.com/gin-contrib/sessions/bearer.yml generated vendored Normal file
View File

@ -0,0 +1,2 @@
rule:
skip-rule: [go_gorilla_cookie_missing_http_only, go_gorilla_insecure_cookie]

View File

@ -1,7 +1,7 @@
package sessions package sessions
import ( import (
"log" "log/slog"
"net/http" "net/http"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
@ -11,7 +11,7 @@ import (
const ( const (
DefaultKey = "github.com/gin-contrib/sessions" DefaultKey = "github.com/gin-contrib/sessions"
errorFormat = "[sessions] ERROR! %s\n" errorFormat = "[sessions] ERROR!"
) )
type Store interface { type Store interface {
@ -131,7 +131,10 @@ func (s *session) Session() *sessions.Session {
var err error var err error
s.session, err = s.store.Get(s.request, s.name) s.session, err = s.store.Get(s.request, s.name)
if err != nil { if err != nil {
log.Printf(errorFormat, err) slog.Error(errorFormat,
"err", err,
)
return nil
} }
} }
return s.session return s.session

View File

@ -1,4 +1,4 @@
Copyright (c) 2023 The Gorilla Authors. All rights reserved. Copyright (c) 2024 The Gorilla Authors. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are modification, are permitted provided that the following conditions are

View File

@ -1,4 +1,7 @@
# sessions # Gorilla Sessions
> [!IMPORTANT]
> The latest version of this repository requires go 1.23 because of the new partitioned attribute. The last version that is compatible with older versions of go is v1.3.0.
![testing](https://github.com/gorilla/sessions/actions/workflows/test.yml/badge.svg) ![testing](https://github.com/gorilla/sessions/actions/workflows/test.yml/badge.svg)
[![codecov](https://codecov.io/github/gorilla/sessions/branch/main/graph/badge.svg)](https://codecov.io/github/gorilla/sessions) [![codecov](https://codecov.io/github/gorilla/sessions/branch/main/graph/badge.svg)](https://codecov.io/github/gorilla/sessions)
@ -59,8 +62,7 @@ secret key used to authenticate the session. Inside the handler, we call
some session values in session.Values, which is a `map[interface{}]interface{}`. some session values in session.Values, which is a `map[interface{}]interface{}`.
And finally we call `session.Save()` to save the session in the response. And finally we call `session.Save()` to save the session in the response.
More examples are available [on the Gorilla More examples are available at [package documentation](https://pkg.go.dev/github.com/gorilla/sessions).
website](https://www.gorillatoolkit.org/pkg/sessions).
## Store Implementations ## Store Implementations
@ -75,6 +77,7 @@ Other implementations of the `sessions.Store` interface:
- [github.com/dsoprea/go-appengine-sessioncascade](https://github.com/dsoprea/go-appengine-sessioncascade) - Memcache/Datastore/Context in AppEngine - [github.com/dsoprea/go-appengine-sessioncascade](https://github.com/dsoprea/go-appengine-sessioncascade) - Memcache/Datastore/Context in AppEngine
- [github.com/kidstuff/mongostore](https://github.com/kidstuff/mongostore) - MongoDB - [github.com/kidstuff/mongostore](https://github.com/kidstuff/mongostore) - MongoDB
- [github.com/srinathgs/mysqlstore](https://github.com/srinathgs/mysqlstore) - MySQL - [github.com/srinathgs/mysqlstore](https://github.com/srinathgs/mysqlstore) - MySQL
- [github.com/danielepintore/gorilla-sessions-mysql](https://github.com/danielepintore/gorilla-sessions-mysql) - MySQL
- [github.com/EnumApps/clustersqlstore](https://github.com/EnumApps/clustersqlstore) - MySQL Cluster - [github.com/EnumApps/clustersqlstore](https://github.com/EnumApps/clustersqlstore) - MySQL Cluster
- [github.com/antonlindstrom/pgstore](https://github.com/antonlindstrom/pgstore) - PostgreSQL - [github.com/antonlindstrom/pgstore](https://github.com/antonlindstrom/pgstore) - PostgreSQL
- [github.com/boj/redistore](https://github.com/boj/redistore) - Redis - [github.com/boj/redistore](https://github.com/boj/redistore) - Redis

View File

@ -1,5 +1,6 @@
//go:build !go1.11 // Copyright 2012 The Gorilla Authors. All rights reserved.
// +build !go1.11 // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package sessions package sessions
@ -15,6 +16,8 @@ func newCookieFromOptions(name, value string, options *Options) *http.Cookie {
MaxAge: options.MaxAge, MaxAge: options.MaxAge,
Secure: options.Secure, Secure: options.Secure,
HttpOnly: options.HttpOnly, HttpOnly: options.HttpOnly,
Partitioned: options.Partitioned,
SameSite: options.SameSite,
} }
} }

View File

@ -1,21 +0,0 @@
//go:build go1.11
// +build go1.11
package sessions
import "net/http"
// newCookieFromOptions returns an http.Cookie with the options set.
func newCookieFromOptions(name, value string, options *Options) *http.Cookie {
return &http.Cookie{
Name: name,
Value: value,
Path: options.Path,
Domain: options.Domain,
MaxAge: options.MaxAge,
Secure: options.Secure,
HttpOnly: options.HttpOnly,
SameSite: options.SameSite,
}
}

View File

@ -1,8 +1,11 @@
//go:build !go1.11 // Copyright 2012 The Gorilla Authors. All rights reserved.
// +build !go1.11 // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package sessions package sessions
import "net/http"
// Options stores configuration for a session or session store. // Options stores configuration for a session or session store.
// //
// Fields are a subset of http.Cookie fields. // Fields are a subset of http.Cookie fields.
@ -16,4 +19,6 @@ type Options struct {
MaxAge int MaxAge int
Secure bool Secure bool
HttpOnly bool HttpOnly bool
Partitioned bool
SameSite http.SameSite
} }

View File

@ -1,23 +0,0 @@
//go:build go1.11
// +build go1.11
package sessions
import "net/http"
// Options stores configuration for a session or session store.
//
// Fields are a subset of http.Cookie fields.
type Options struct {
Path string
Domain string
// MaxAge=0 means no Max-Age attribute specified and the cookie will be
// deleted after the browser session ends.
// MaxAge<0 means delete cookie immediately.
// MaxAge>0 means Max-Age attribute present and given in seconds.
MaxAge int
Secure bool
HttpOnly bool
// Defaults to http.SameSiteDefaultMode
SameSite http.SameSite
}

View File

@ -14,6 +14,11 @@ import (
"github.com/gorilla/securecookie" "github.com/gorilla/securecookie"
) )
const (
// File name prefix for session files.
sessionFilePrefix = "session_"
)
// Store is an interface for custom session stores. // Store is an interface for custom session stores.
// //
// See CookieStore and FilesystemStore for examples. // See CookieStore and FilesystemStore for examples.
@ -51,6 +56,8 @@ func NewCookieStore(keyPairs ...[]byte) *CookieStore {
Options: &Options{ Options: &Options{
Path: "/", Path: "/",
MaxAge: 86400 * 30, MaxAge: 86400 * 30,
SameSite: http.SameSiteNoneMode,
Secure: true,
}, },
} }
@ -257,7 +264,7 @@ func (s *FilesystemStore) save(session *Session) error {
if err != nil { if err != nil {
return err return err
} }
filename := filepath.Join(s.path, "session_"+session.ID) filename := filepath.Join(s.path, sessionFilePrefix+filepath.Base(session.ID))
fileMutex.Lock() fileMutex.Lock()
defer fileMutex.Unlock() defer fileMutex.Unlock()
return os.WriteFile(filename, []byte(encoded), 0600) return os.WriteFile(filename, []byte(encoded), 0600)
@ -265,7 +272,7 @@ func (s *FilesystemStore) save(session *Session) error {
// load reads a file and decodes its content into session.Values. // load reads a file and decodes its content into session.Values.
func (s *FilesystemStore) load(session *Session) error { func (s *FilesystemStore) load(session *Session) error {
filename := filepath.Join(s.path, "session_"+session.ID) filename := filepath.Join(s.path, sessionFilePrefix+filepath.Base(session.ID))
fileMutex.RLock() fileMutex.RLock()
defer fileMutex.RUnlock() defer fileMutex.RUnlock()
fdata, err := os.ReadFile(filepath.Clean(filename)) fdata, err := os.ReadFile(filepath.Clean(filename))
@ -281,7 +288,7 @@ func (s *FilesystemStore) load(session *Session) error {
// delete session file // delete session file
func (s *FilesystemStore) erase(session *Session) error { func (s *FilesystemStore) erase(session *Session) error {
filename := filepath.Join(s.path, "session_"+session.ID) filename := filepath.Join(s.path, sessionFilePrefix+filepath.Base(session.ID))
fileMutex.RLock() fileMutex.RLock()
defer fileMutex.RUnlock() defer fileMutex.RUnlock()

View File

@ -330,7 +330,7 @@ func (DefaultValueDecoders) intDecodeType(dc DecodeContext, vr bsonrw.ValueReade
case reflect.Int64: case reflect.Int64:
return reflect.ValueOf(i64), nil return reflect.ValueOf(i64), nil
case reflect.Int: case reflect.Int:
if int64(int(i64)) != i64 { // Can we fit this inside of an int if i64 > math.MaxInt { // Can we fit this inside of an int
return emptyValue, fmt.Errorf("%d overflows int", i64) return emptyValue, fmt.Errorf("%d overflows int", i64)
} }
@ -434,7 +434,7 @@ func (dvd DefaultValueDecoders) UintDecodeValue(dc DecodeContext, vr bsonrw.Valu
return fmt.Errorf("%d overflows uint64", i64) return fmt.Errorf("%d overflows uint64", i64)
} }
case reflect.Uint: case reflect.Uint:
if i64 < 0 || int64(uint(i64)) != i64 { // Can we fit this inside of an uint if i64 < 0 || uint64(i64) > uint64(math.MaxUint) { // Can we fit this inside of an uint
return fmt.Errorf("%d overflows uint", i64) return fmt.Errorf("%d overflows uint", i64)
} }
default: default:
@ -1521,6 +1521,18 @@ func (dvd DefaultValueDecoders) ValueUnmarshalerDecodeValue(_ DecodeContext, vr
return ValueDecoderError{Name: "ValueUnmarshalerDecodeValue", Types: []reflect.Type{tValueUnmarshaler}, Received: val} return ValueDecoderError{Name: "ValueUnmarshalerDecodeValue", Types: []reflect.Type{tValueUnmarshaler}, Received: val}
} }
// If BSON value is null and the go value is a pointer, then don't call
// UnmarshalBSONValue. Even if the Go pointer is already initialized (i.e.,
// non-nil), encountering null in BSON will result in the pointer being
// directly set to nil here. Since the pointer is being replaced with nil,
// there is no opportunity (or reason) for the custom UnmarshalBSONValue logic
// to be called.
if vr.Type() == bsontype.Null && val.Kind() == reflect.Ptr {
val.Set(reflect.Zero(val.Type()))
return vr.ReadNull()
}
if val.Kind() == reflect.Ptr && val.IsNil() { if val.Kind() == reflect.Ptr && val.IsNil() {
if !val.CanSet() { if !val.CanSet() {
return ValueDecoderError{Name: "ValueUnmarshalerDecodeValue", Types: []reflect.Type{tValueUnmarshaler}, Received: val} return ValueDecoderError{Name: "ValueUnmarshalerDecodeValue", Types: []reflect.Type{tValueUnmarshaler}, Received: val}

View File

@ -164,11 +164,15 @@ func (uic *UIntCodec) decodeType(dc DecodeContext, vr bsonrw.ValueReader, t refl
return reflect.ValueOf(uint64(i64)), nil return reflect.ValueOf(uint64(i64)), nil
case reflect.Uint: case reflect.Uint:
if i64 < 0 || int64(uint(i64)) != i64 { // Can we fit this inside of an uint if i64 < 0 {
return emptyValue, fmt.Errorf("%d overflows uint", i64)
}
v := uint64(i64)
if v > math.MaxUint { // Can we fit this inside of an uint
return emptyValue, fmt.Errorf("%d overflows uint", i64) return emptyValue, fmt.Errorf("%d overflows uint", i64)
} }
return reflect.ValueOf(uint(i64)), nil return reflect.ValueOf(uint(v)), nil
default: default:
return emptyValue, ValueDecoderError{ return emptyValue, ValueDecoderError{
Name: "UintDecodeValue", Name: "UintDecodeValue",

View File

@ -305,7 +305,7 @@ func (ejp *extJSONParser) readValue(t bsontype.Type) (*extJSONValue, error) {
} }
// remove hyphens // remove hyphens
uuidNoHyphens := strings.Replace(uuid, "-", "", -1) uuidNoHyphens := strings.ReplaceAll(uuid, "-", "")
if len(uuidNoHyphens) != 32 { if len(uuidNoHyphens) != 32 {
return nil, fmt.Errorf("$uuid value does not follow RFC 4122 format regarding length and hyphens") return nil, fmt.Errorf("$uuid value does not follow RFC 4122 format regarding length and hyphens")
} }

View File

@ -95,9 +95,9 @@ func (ejv *extJSONValue) parseBinary() (b []byte, subType byte, err error) {
return nil, 0, fmt.Errorf("$binary subType value should be string, but instead is %s", val.t) return nil, 0, fmt.Errorf("$binary subType value should be string, but instead is %s", val.t)
} }
i, err := strconv.ParseInt(val.v.(string), 16, 64) i, err := strconv.ParseUint(val.v.(string), 16, 8)
if err != nil { if err != nil {
return nil, 0, fmt.Errorf("invalid $binary subType string: %s", val.v.(string)) return nil, 0, fmt.Errorf("invalid $binary subType string: %q: %w", val.v.(string), err)
} }
subType = byte(i) subType = byte(i)

View File

@ -628,13 +628,14 @@ func (ejvw *extJSONValueWriter) WriteArrayEnd() error {
func formatDouble(f float64) string { func formatDouble(f float64) string {
var s string var s string
if math.IsInf(f, 1) { switch {
case math.IsInf(f, 1):
s = "Infinity" s = "Infinity"
} else if math.IsInf(f, -1) { case math.IsInf(f, -1):
s = "-Infinity" s = "-Infinity"
} else if math.IsNaN(f) { case math.IsNaN(f):
s = "NaN" s = "NaN"
} else { default:
// Print exactly one decimalType place for integers; otherwise, print as many are necessary to // Print exactly one decimalType place for integers; otherwise, print as many are necessary to
// perfectly represent it. // perfectly represent it.
s = strconv.FormatFloat(f, 'G', -1, 64) s = strconv.FormatFloat(f, 'G', -1, 64)
@ -739,9 +740,7 @@ func (ss sortableString) Less(i, j int) bool {
} }
func (ss sortableString) Swap(i, j int) { func (ss sortableString) Swap(i, j int) {
oldI := ss[i] ss[i], ss[j] = ss[j], ss[i]
ss[i] = ss[j]
ss[j] = oldI
} }
func sortStringAlphebeticAscending(s string) string { func sortStringAlphebeticAscending(s string) string {

View File

@ -82,12 +82,13 @@ func (js *jsonScanner) nextToken() (*jsonToken, error) {
return js.scanString() return js.scanString()
default: default:
// check if it's a number // check if it's a number
if c == '-' || isDigit(c) { switch {
case c == '-' || isDigit(c):
return js.scanNumber(c) return js.scanNumber(c)
} else if c == 't' || c == 'f' || c == 'n' { case c == 't' || c == 'f' || c == 'n':
// maybe a literal // maybe a literal
return js.scanLiteral(c) return js.scanLiteral(c)
} else { default:
return nil, fmt.Errorf("invalid JSON input. Position: %d. Character: %c", js.pos-1, c) return nil, fmt.Errorf("invalid JSON input. Position: %d. Character: %c", js.pos-1, c)
} }
} }
@ -174,7 +175,7 @@ func getu4(s []byte) rune {
for _, c := range s[:4] { for _, c := range s[:4] {
switch { switch {
case '0' <= c && c <= '9': case '0' <= c && c <= '9':
c = c - '0' c -= '0'
case 'a' <= c && c <= 'f': case 'a' <= c && c <= 'f':
c = c - 'a' + 10 c = c - 'a' + 10
case 'A' <= c && c <= 'F': case 'A' <= c && c <= 'F':
@ -325,13 +326,14 @@ func (js *jsonScanner) scanLiteral(first byte) (*jsonToken, error) {
c5, err := js.readNextByte() c5, err := js.readNextByte()
if bytes.Equal([]byte("true"), lit) && (isValueTerminator(c5) || errors.Is(err, io.EOF)) { switch {
case bytes.Equal([]byte("true"), lit) && (isValueTerminator(c5) || errors.Is(err, io.EOF)):
js.pos = int(math.Max(0, float64(js.pos-1))) js.pos = int(math.Max(0, float64(js.pos-1)))
return &jsonToken{t: jttBool, v: true, p: p}, nil return &jsonToken{t: jttBool, v: true, p: p}, nil
} else if bytes.Equal([]byte("null"), lit) && (isValueTerminator(c5) || errors.Is(err, io.EOF)) { case bytes.Equal([]byte("null"), lit) && (isValueTerminator(c5) || errors.Is(err, io.EOF)):
js.pos = int(math.Max(0, float64(js.pos-1))) js.pos = int(math.Max(0, float64(js.pos-1)))
return &jsonToken{t: jttNull, v: nil, p: p}, nil return &jsonToken{t: jttNull, v: nil, p: p}, nil
} else if bytes.Equal([]byte("fals"), lit) { case bytes.Equal([]byte("fals"), lit):
if c5 == 'e' { if c5 == 'e' {
c5, err = js.readNextByte() c5, err = js.readNextByte()
@ -430,12 +432,13 @@ func (js *jsonScanner) scanNumber(first byte) (*jsonToken, error) {
case '}', ']', ',': case '}', ']', ',':
s = nssDone s = nssDone
default: default:
if isWhiteSpace(c) || errors.Is(err, io.EOF) { switch {
case isWhiteSpace(c) || errors.Is(err, io.EOF):
s = nssDone s = nssDone
} else if isDigit(c) { case isDigit(c):
s = nssSawIntegerDigits s = nssSawIntegerDigits
b.WriteByte(c) b.WriteByte(c)
} else { default:
s = nssInvalid s = nssInvalid
} }
} }
@ -455,12 +458,13 @@ func (js *jsonScanner) scanNumber(first byte) (*jsonToken, error) {
case '}', ']', ',': case '}', ']', ',':
s = nssDone s = nssDone
default: default:
if isWhiteSpace(c) || errors.Is(err, io.EOF) { switch {
case isWhiteSpace(c) || errors.Is(err, io.EOF):
s = nssDone s = nssDone
} else if isDigit(c) { case isDigit(c):
s = nssSawFractionDigits s = nssSawFractionDigits
b.WriteByte(c) b.WriteByte(c)
} else { default:
s = nssInvalid s = nssInvalid
} }
} }
@ -490,12 +494,13 @@ func (js *jsonScanner) scanNumber(first byte) (*jsonToken, error) {
case '}', ']', ',': case '}', ']', ',':
s = nssDone s = nssDone
default: default:
if isWhiteSpace(c) || errors.Is(err, io.EOF) { switch {
case isWhiteSpace(c) || errors.Is(err, io.EOF):
s = nssDone s = nssDone
} else if isDigit(c) { case isDigit(c):
s = nssSawExponentDigits s = nssSawExponentDigits
b.WriteByte(c) b.WriteByte(c)
} else { default:
s = nssInvalid s = nssInvalid
} }
} }

View File

@ -842,7 +842,7 @@ func (vr *valueReader) peekLength() (int32, error) {
} }
idx := vr.offset idx := vr.offset
return (int32(vr.d[idx]) | int32(vr.d[idx+1])<<8 | int32(vr.d[idx+2])<<16 | int32(vr.d[idx+3])<<24), nil return int32(binary.LittleEndian.Uint32(vr.d[idx:])), nil
} }
func (vr *valueReader) readLength() (int32, error) { return vr.readi32() } func (vr *valueReader) readLength() (int32, error) { return vr.readi32() }
@ -854,7 +854,7 @@ func (vr *valueReader) readi32() (int32, error) {
idx := vr.offset idx := vr.offset
vr.offset += 4 vr.offset += 4
return (int32(vr.d[idx]) | int32(vr.d[idx+1])<<8 | int32(vr.d[idx+2])<<16 | int32(vr.d[idx+3])<<24), nil return int32(binary.LittleEndian.Uint32(vr.d[idx:])), nil
} }
func (vr *valueReader) readu32() (uint32, error) { func (vr *valueReader) readu32() (uint32, error) {
@ -864,7 +864,7 @@ func (vr *valueReader) readu32() (uint32, error) {
idx := vr.offset idx := vr.offset
vr.offset += 4 vr.offset += 4
return (uint32(vr.d[idx]) | uint32(vr.d[idx+1])<<8 | uint32(vr.d[idx+2])<<16 | uint32(vr.d[idx+3])<<24), nil return binary.LittleEndian.Uint32(vr.d[idx:]), nil
} }
func (vr *valueReader) readi64() (int64, error) { func (vr *valueReader) readi64() (int64, error) {
@ -874,8 +874,7 @@ func (vr *valueReader) readi64() (int64, error) {
idx := vr.offset idx := vr.offset
vr.offset += 8 vr.offset += 8
return int64(vr.d[idx]) | int64(vr.d[idx+1])<<8 | int64(vr.d[idx+2])<<16 | int64(vr.d[idx+3])<<24 | return int64(binary.LittleEndian.Uint64(vr.d[idx:])), nil
int64(vr.d[idx+4])<<32 | int64(vr.d[idx+5])<<40 | int64(vr.d[idx+6])<<48 | int64(vr.d[idx+7])<<56, nil
} }
func (vr *valueReader) readu64() (uint64, error) { func (vr *valueReader) readu64() (uint64, error) {
@ -885,6 +884,5 @@ func (vr *valueReader) readu64() (uint64, error) {
idx := vr.offset idx := vr.offset
vr.offset += 8 vr.offset += 8
return uint64(vr.d[idx]) | uint64(vr.d[idx+1])<<8 | uint64(vr.d[idx+2])<<16 | uint64(vr.d[idx+3])<<24 | return binary.LittleEndian.Uint64(vr.d[idx:]), nil
uint64(vr.d[idx+4])<<32 | uint64(vr.d[idx+5])<<40 | uint64(vr.d[idx+6])<<48 | uint64(vr.d[idx+7])<<56, nil
} }

View File

@ -598,7 +598,7 @@ func (vw *valueWriter) writeLength() error {
return errMaxDocumentSizeExceeded{size: int64(len(vw.buf))} return errMaxDocumentSizeExceeded{size: int64(len(vw.buf))}
} }
frame := &vw.stack[vw.frame] frame := &vw.stack[vw.frame]
length = length - int(frame.start) length -= int(frame.start)
start := frame.start start := frame.start
_ = vw.buf[start+3] // BCE _ = vw.buf[start+3] // BCE

View File

@ -107,10 +107,13 @@
// The name may be empty in order to specify options without overriding the default field name. The following options can // The name may be empty in order to specify options without overriding the default field name. The following options can
// be used to configure behavior: // be used to configure behavior:
// //
// 1. omitempty: If the omitempty struct tag is specified on a field, the field will be omitted from the marshaling if // 1. omitempty: If the "omitempty" struct tag is specified on a field, the field will not be marshaled if it is set to
// the field has an empty value, defined as false, 0, a nil pointer, a nil interface value, and any empty array, // an "empty" value. Numbers, booleans, and strings are considered empty if their value is equal to the zero value for
// slice, map, or string. // the type (i.e. 0 for numbers, false for booleans, and "" for strings). Slices, maps, and arrays are considered
// NOTE: It is recommended that this tag be used for all slice and map fields. // empty if they are of length zero. Interfaces and pointers are considered empty if their value is nil. By default,
// structs are only considered empty if the struct type implements [bsoncodec.Zeroer] and the IsZero
// method returns true. Struct types that do not implement [bsoncodec.Zeroer] are never considered empty and will be
// marshaled as embedded documents. NOTE: It is recommended that this tag be used for all slice and map fields.
// //
// 2. minsize: If the minsize struct tag is specified on a field of type int64, uint, uint32, or uint64 and the value of // 2. minsize: If the minsize struct tag is specified on a field of type int64, uint, uint32, or uint64 and the value of
// the field can fit in a signed int32, the field will be serialized as a BSON int32 rather than a BSON int64. For // the field can fit in a signed int32, the field will be serialized as a BSON int32 rather than a BSON int64. For

View File

@ -70,7 +70,6 @@ func (d Decimal128) String() string {
// Bits: 1*sign 2*ignored 14*exponent 111*significand. // Bits: 1*sign 2*ignored 14*exponent 111*significand.
// Implicit 0b100 prefix in significand. // Implicit 0b100 prefix in significand.
exp = int(d.h >> 47 & (1<<14 - 1)) exp = int(d.h >> 47 & (1<<14 - 1))
//high = 4<<47 | d.h&(1<<47-1)
// Spec says all of these values are out of range. // Spec says all of these values are out of range.
high, low = 0, 0 high, low = 0, 0
} else { } else {
@ -152,13 +151,12 @@ func (d Decimal128) BigInt() (*big.Int, int, error) {
// Bits: 1*sign 2*ignored 14*exponent 111*significand. // Bits: 1*sign 2*ignored 14*exponent 111*significand.
// Implicit 0b100 prefix in significand. // Implicit 0b100 prefix in significand.
exp = int(high >> 47 & (1<<14 - 1)) exp = int(high >> 47 & (1<<14 - 1))
//high = 4<<47 | d.h&(1<<47-1)
// Spec says all of these values are out of range. // Spec says all of these values are out of range.
high, low = 0, 0 high, low = 0, 0
} else { } else {
// Bits: 1*sign 14*exponent 113*significand // Bits: 1*sign 14*exponent 113*significand
exp = int(high >> 49 & (1<<14 - 1)) exp = int(high >> 49 & (1<<14 - 1))
high = high & (1<<49 - 1) high &= (1<<49 - 1)
} }
exp += MinDecimal128Exp exp += MinDecimal128Exp

View File

@ -88,8 +88,12 @@ func (rv RawValue) UnmarshalWithRegistry(r *bsoncodec.Registry, val interface{})
return dec.DecodeValue(bsoncodec.DecodeContext{Registry: r}, vr, rval) return dec.DecodeValue(bsoncodec.DecodeContext{Registry: r}, vr, rval)
} }
// UnmarshalWithContext performs the same unmarshalling as Unmarshal but uses the provided DecodeContext // UnmarshalWithContext performs the same unmarshalling as Unmarshal but uses
// instead of the one attached or the default registry. // the provided DecodeContext instead of the one attached or the default
// registry.
//
// Deprecated: Use [RawValue.UnmarshalWithRegistry] with a custom registry to customize
// unmarshal behavior instead.
func (rv RawValue) UnmarshalWithContext(dc *bsoncodec.DecodeContext, val interface{}) error { func (rv RawValue) UnmarshalWithContext(dc *bsoncodec.DecodeContext, val interface{}) error {
if dc == nil { if dc == nil {
return ErrNilContext return ErrNilContext

View File

@ -10,15 +10,27 @@ import (
"go.mongodb.org/mongo-driver/bson/bsoncodec" "go.mongodb.org/mongo-driver/bson/bsoncodec"
) )
// DefaultRegistry is the default bsoncodec.Registry. It contains the default codecs and the // DefaultRegistry is the default bsoncodec.Registry. It contains the default
// primitive codecs. // codecs and the primitive codecs.
//
// Deprecated: Use [NewRegistry] to construct a new default registry. To use a
// custom registry when marshaling or unmarshaling, use the "SetRegistry" method
// on an [Encoder] or [Decoder] instead:
//
// dec, err := bson.NewDecoder(bsonrw.NewBSONDocumentReader(data))
// if err != nil {
// panic(err)
// }
// dec.SetRegistry(reg)
//
// See [Encoder] and [Decoder] for more examples.
var DefaultRegistry = NewRegistry() var DefaultRegistry = NewRegistry()
// NewRegistryBuilder creates a new RegistryBuilder configured with the default encoders and // NewRegistryBuilder creates a new RegistryBuilder configured with the default encoders and
// decoders from the bsoncodec.DefaultValueEncoders and bsoncodec.DefaultValueDecoders types and the // decoders from the bsoncodec.DefaultValueEncoders and bsoncodec.DefaultValueDecoders types and the
// PrimitiveCodecs type in this package. // PrimitiveCodecs type in this package.
// //
// Deprecated: Use NewRegistry instead. // Deprecated: Use [NewRegistry] instead.
func NewRegistryBuilder() *bsoncodec.RegistryBuilder { func NewRegistryBuilder() *bsoncodec.RegistryBuilder {
rb := bsoncodec.NewRegistryBuilder() rb := bsoncodec.NewRegistryBuilder()
bsoncodec.DefaultValueEncoders{}.RegisterDefaultEncoders(rb) bsoncodec.DefaultValueEncoders{}.RegisterDefaultEncoders(rb)

View File

@ -41,6 +41,9 @@ type ValueUnmarshaler interface {
// Unmarshal parses the BSON-encoded data and stores the result in the value // Unmarshal parses the BSON-encoded data and stores the result in the value
// pointed to by val. If val is nil or not a pointer, Unmarshal returns // pointed to by val. If val is nil or not a pointer, Unmarshal returns
// InvalidUnmarshalError. // InvalidUnmarshalError.
//
// When unmarshaling BSON, if the BSON value is null and the Go value is a
// pointer, the pointer is set to nil without calling UnmarshalBSONValue.
func Unmarshal(data []byte, val interface{}) error { func Unmarshal(data []byte, val interface{}) error {
return UnmarshalWithRegistry(DefaultRegistry, data, val) return UnmarshalWithRegistry(DefaultRegistry, data, val)
} }

View File

@ -8,6 +8,7 @@ package bsoncore // import "go.mongodb.org/mongo-driver/x/bsonx/bsoncore"
import ( import (
"bytes" "bytes"
"encoding/binary"
"fmt" "fmt"
"math" "math"
"strconv" "strconv"
@ -706,17 +707,16 @@ func ReserveLength(dst []byte) (int32, []byte) {
// UpdateLength updates the length at index with length and returns the []byte. // UpdateLength updates the length at index with length and returns the []byte.
func UpdateLength(dst []byte, index, length int32) []byte { func UpdateLength(dst []byte, index, length int32) []byte {
dst[index] = byte(length) binary.LittleEndian.PutUint32(dst[index:], uint32(length))
dst[index+1] = byte(length >> 8)
dst[index+2] = byte(length >> 16)
dst[index+3] = byte(length >> 24)
return dst return dst
} }
func appendLength(dst []byte, l int32) []byte { return appendi32(dst, l) } func appendLength(dst []byte, l int32) []byte { return appendi32(dst, l) }
func appendi32(dst []byte, i32 int32) []byte { func appendi32(dst []byte, i32 int32) []byte {
return append(dst, byte(i32), byte(i32>>8), byte(i32>>16), byte(i32>>24)) b := []byte{0, 0, 0, 0}
binary.LittleEndian.PutUint32(b, uint32(i32))
return append(dst, b...)
} }
// ReadLength reads an int32 length from src and returns the length and the remaining bytes. If // ReadLength reads an int32 length from src and returns the length and the remaining bytes. If
@ -734,27 +734,26 @@ func readi32(src []byte) (int32, []byte, bool) {
if len(src) < 4 { if len(src) < 4 {
return 0, src, false return 0, src, false
} }
return (int32(src[0]) | int32(src[1])<<8 | int32(src[2])<<16 | int32(src[3])<<24), src[4:], true return int32(binary.LittleEndian.Uint32(src)), src[4:], true
} }
func appendi64(dst []byte, i64 int64) []byte { func appendi64(dst []byte, i64 int64) []byte {
return append(dst, b := []byte{0, 0, 0, 0, 0, 0, 0, 0}
byte(i64), byte(i64>>8), byte(i64>>16), byte(i64>>24), binary.LittleEndian.PutUint64(b, uint64(i64))
byte(i64>>32), byte(i64>>40), byte(i64>>48), byte(i64>>56), return append(dst, b...)
)
} }
func readi64(src []byte) (int64, []byte, bool) { func readi64(src []byte) (int64, []byte, bool) {
if len(src) < 8 { if len(src) < 8 {
return 0, src, false return 0, src, false
} }
i64 := (int64(src[0]) | int64(src[1])<<8 | int64(src[2])<<16 | int64(src[3])<<24 | return int64(binary.LittleEndian.Uint64(src)), src[8:], true
int64(src[4])<<32 | int64(src[5])<<40 | int64(src[6])<<48 | int64(src[7])<<56)
return i64, src[8:], true
} }
func appendu32(dst []byte, u32 uint32) []byte { func appendu32(dst []byte, u32 uint32) []byte {
return append(dst, byte(u32), byte(u32>>8), byte(u32>>16), byte(u32>>24)) b := []byte{0, 0, 0, 0}
binary.LittleEndian.PutUint32(b, u32)
return append(dst, b...)
} }
func readu32(src []byte) (uint32, []byte, bool) { func readu32(src []byte) (uint32, []byte, bool) {
@ -762,23 +761,20 @@ func readu32(src []byte) (uint32, []byte, bool) {
return 0, src, false return 0, src, false
} }
return (uint32(src[0]) | uint32(src[1])<<8 | uint32(src[2])<<16 | uint32(src[3])<<24), src[4:], true return binary.LittleEndian.Uint32(src), src[4:], true
} }
func appendu64(dst []byte, u64 uint64) []byte { func appendu64(dst []byte, u64 uint64) []byte {
return append(dst, b := []byte{0, 0, 0, 0, 0, 0, 0, 0}
byte(u64), byte(u64>>8), byte(u64>>16), byte(u64>>24), binary.LittleEndian.PutUint64(b, u64)
byte(u64>>32), byte(u64>>40), byte(u64>>48), byte(u64>>56), return append(dst, b...)
)
} }
func readu64(src []byte) (uint64, []byte, bool) { func readu64(src []byte) (uint64, []byte, bool) {
if len(src) < 8 { if len(src) < 8 {
return 0, src, false return 0, src, false
} }
u64 := (uint64(src[0]) | uint64(src[1])<<8 | uint64(src[2])<<16 | uint64(src[3])<<24 | return binary.LittleEndian.Uint64(src), src[8:], true
uint64(src[4])<<32 | uint64(src[5])<<40 | uint64(src[6])<<48 | uint64(src[7])<<56)
return u64, src[8:], true
} }
// keep in sync with readcstringbytes // keep in sync with readcstringbytes

View File

@ -4,10 +4,18 @@
// not use this file except in compliance with the License. You may obtain // not use this file except in compliance with the License. You may obtain
// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 // a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
// Package bsoncore contains functions that can be used to encode and decode BSON // Package bsoncore is intended for internal use only. It is made available to
// elements and values to or from a slice of bytes. These functions are aimed at // facilitate use cases that require access to internal MongoDB driver
// allowing low level manipulation of BSON and can be used to build a higher // functionality and state. The API of this package is not stable and there is
// level BSON library. // no backward compatibility guarantee.
//
// WARNING: THIS PACKAGE IS EXPERIMENTAL AND MAY BE MODIFIED OR REMOVED WITHOUT
// NOTICE! USE WITH EXTREME CAUTION!
//
// Package bsoncore contains functions that can be used to encode and decode
// BSON elements and values to or from a slice of bytes. These functions are
// aimed at allowing low level manipulation of BSON and can be used to build a
// higher level BSON library.
// //
// The Read* functions within this package return the values of the element and // The Read* functions within this package return the values of the element and
// a boolean indicating if the values are valid. A boolean was used instead of // a boolean indicating if the values are valid. A boolean was used instead of
@ -15,15 +23,12 @@
// enough bytes. This library attempts to do no validation, it will only return // enough bytes. This library attempts to do no validation, it will only return
// false if there are not enough bytes for an item to be read. For example, the // false if there are not enough bytes for an item to be read. For example, the
// ReadDocument function checks the length, if that length is larger than the // ReadDocument function checks the length, if that length is larger than the
// number of bytes available, it will return false, if there are enough bytes, it // number of bytes available, it will return false, if there are enough bytes,
// will return those bytes and true. It is the consumers responsibility to // it will return those bytes and true. It is the consumers responsibility to
// validate those bytes. // validate those bytes.
// //
// The Append* functions within this package will append the type value to the // The Append* functions within this package will append the type value to the
// given dst slice. If the slice has enough capacity, it will not grow the // given dst slice. If the slice has enough capacity, it will not grow the
// slice. The Append*Element functions within this package operate in the same // slice. The Append*Element functions within this package operate in the same
// way, but additionally append the BSON type and the key before the value. // way, but additionally append the BSON type and the key before the value.
//
// Warning: Package bsoncore is unstable and there is no backward compatibility
// guarantee. It is experimental and subject to change.
package bsoncore package bsoncore

View File

@ -51,7 +51,7 @@ func (e Element) KeyErr() (string, error) {
// KeyBytesErr returns the key for this element as a []byte, returning an error if the element is // KeyBytesErr returns the key for this element as a []byte, returning an error if the element is
// not valid. // not valid.
func (e Element) KeyBytesErr() ([]byte, error) { func (e Element) KeyBytesErr() ([]byte, error) {
if len(e) <= 0 { if len(e) == 0 {
return nil, ErrElementMissingType return nil, ErrElementMissingType
} }
idx := bytes.IndexByte(e[1:], 0x00) idx := bytes.IndexByte(e[1:], 0x00)
@ -99,7 +99,7 @@ func (e Element) Value() Value {
// ValueErr returns the value for this element, returning an error if the element is not valid. // ValueErr returns the value for this element, returning an error if the element is not valid.
func (e Element) ValueErr() (Value, error) { func (e Element) ValueErr() (Value, error) {
if len(e) <= 0 { if len(e) == 0 {
return Value{}, ErrElementMissingType return Value{}, ErrElementMissingType
} }
idx := bytes.IndexByte(e[1:], 0x00) idx := bytes.IndexByte(e[1:], 0x00)
@ -116,7 +116,7 @@ func (e Element) ValueErr() (Value, error) {
// String implements the fmt.String interface. The output will be in extended JSON format. // String implements the fmt.String interface. The output will be in extended JSON format.
func (e Element) String() string { func (e Element) String() string {
if len(e) <= 0 { if len(e) == 0 {
return "" return ""
} }
t := bsontype.Type(e[0]) t := bsontype.Type(e[0])
@ -135,7 +135,7 @@ func (e Element) String() string {
// DebugString outputs a human readable version of RawElement. It will attempt to stringify the // DebugString outputs a human readable version of RawElement. It will attempt to stringify the
// valid components of the element even if the entire element is not valid. // valid components of the element even if the entire element is not valid.
func (e Element) DebugString() string { func (e Element) DebugString() string {
if len(e) <= 0 { if len(e) == 0 {
return "<malformed>" return "<malformed>"
} }
t := bsontype.Type(e[0]) t := bsontype.Type(e[0])

View File

@ -924,13 +924,14 @@ func escapeString(s string) string {
func formatDouble(f float64) string { func formatDouble(f float64) string {
var s string var s string
if math.IsInf(f, 1) { switch {
case math.IsInf(f, 1):
s = "Infinity" s = "Infinity"
} else if math.IsInf(f, -1) { case math.IsInf(f, -1):
s = "-Infinity" s = "-Infinity"
} else if math.IsNaN(f) { case math.IsNaN(f):
s = "NaN" s = "NaN"
} else { default:
// Print exactly one decimalType place for integers; otherwise, print as many are necessary to // Print exactly one decimalType place for integers; otherwise, print as many are necessary to
// perfectly represent it. // perfectly represent it.
s = strconv.FormatFloat(f, 'G', -1, 64) s = strconv.FormatFloat(f, 'G', -1, 64)
@ -953,9 +954,7 @@ func (ss sortableString) Less(i, j int) bool {
} }
func (ss sortableString) Swap(i, j int) { func (ss sortableString) Swap(i, j int) {
oldI := ss[i] ss[i], ss[j] = ss[j], ss[i]
ss[i] = ss[j]
ss[j] = oldI
} }
func sortStringAlphebeticAscending(s string) string { func sortStringAlphebeticAscending(s string) string {

View File

@ -667,6 +667,7 @@ func gnuArg(inst *Inst, pc uint64, symname SymLookup, x Arg, usedPrefixes *bool)
} }
} }
case Imm: case Imm:
if (inst.Op == MOV || inst.Op == PUSH) && inst.DataSize == 32 { // See comment in plan9x.go.
if s, base := symname(uint64(x)); s != "" { if s, base := symname(uint64(x)); s != "" {
suffix := "" suffix := ""
if uint64(x) != base { if uint64(x) != base {
@ -674,6 +675,7 @@ func gnuArg(inst *Inst, pc uint64, symname SymLookup, x Arg, usedPrefixes *bool)
} }
return fmt.Sprintf("$%s%s", s, suffix) return fmt.Sprintf("$%s%s", s, suffix)
} }
}
if inst.Mode == 32 { if inst.Mode == 32 {
return fmt.Sprintf("$%#x", uint32(x)) return fmt.Sprintf("$%#x", uint32(x))
} }

View File

@ -341,6 +341,7 @@ func IntelSyntax(inst Inst, pc uint64, symname SymLookup) string {
func intelArg(inst *Inst, pc uint64, symname SymLookup, arg Arg) string { func intelArg(inst *Inst, pc uint64, symname SymLookup, arg Arg) string {
switch a := arg.(type) { switch a := arg.(type) {
case Imm: case Imm:
if (inst.Op == MOV || inst.Op == PUSH) && inst.DataSize == 32 { // See comment in plan9x.go.
if s, base := symname(uint64(a)); s != "" { if s, base := symname(uint64(a)); s != "" {
suffix := "" suffix := ""
if uint64(a) != base { if uint64(a) != base {
@ -348,6 +349,7 @@ func intelArg(inst *Inst, pc uint64, symname SymLookup, arg Arg) string {
} }
return fmt.Sprintf("$%s%s", s, suffix) return fmt.Sprintf("$%s%s", s, suffix)
} }
}
if inst.Mode == 32 { if inst.Mode == 32 {
return fmt.Sprintf("%#x", uint32(a)) return fmt.Sprintf("%#x", uint32(a))
} }

View File

@ -116,6 +116,16 @@ func plan9Arg(inst *Inst, pc uint64, symname func(uint64) (string, uint64), arg
return fmt.Sprintf("%#x", addr) return fmt.Sprintf("%#x", addr)
case Imm: case Imm:
if (inst.Op == MOV || inst.Op == PUSH) && inst.DataSize == 32 {
// Only try to convert an immediate to a symbol in certain
// special circumstances. See issue 72942.
//
// On 64-bit, symbol addresses always hit the Mem case below.
// Particularly, we use LEAQ to materialize the address of
// a global or function.
//
// On 32-bit, we sometimes use MOVL. Still try to symbolize
// those immediates.
if s, base := symname(uint64(a)); s != "" { if s, base := symname(uint64(a)); s != "" {
suffix := "" suffix := ""
if uint64(a) != base { if uint64(a) != base {
@ -123,6 +133,7 @@ func plan9Arg(inst *Inst, pc uint64, symname func(uint64) (string, uint64), arg
} }
return fmt.Sprintf("$%s%s(SB)", s, suffix) return fmt.Sprintf("$%s%s(SB)", s, suffix)
} }
}
if inst.Mode == 32 { if inst.Mode == 32 {
return fmt.Sprintf("$%#x", uint32(a)) return fmt.Sprintf("$%#x", uint32(a))
} }

12
vendor/modules.txt vendored
View File

@ -406,8 +406,8 @@ github.com/gin-contrib/cors
# github.com/gin-contrib/gzip v1.2.3 # github.com/gin-contrib/gzip v1.2.3
## explicit; go 1.23.0 ## explicit; go 1.23.0
github.com/gin-contrib/gzip github.com/gin-contrib/gzip
# github.com/gin-contrib/sessions v1.0.2 # github.com/gin-contrib/sessions v1.0.3
## explicit; go 1.20 ## explicit; go 1.23.0
github.com/gin-contrib/sessions github.com/gin-contrib/sessions
github.com/gin-contrib/sessions/memstore github.com/gin-contrib/sessions/memstore
# github.com/gin-contrib/sse v1.0.0 # github.com/gin-contrib/sse v1.0.0
@ -566,8 +566,8 @@ github.com/gorilla/handlers
# github.com/gorilla/securecookie v1.1.2 # github.com/gorilla/securecookie v1.1.2
## explicit; go 1.20 ## explicit; go 1.20
github.com/gorilla/securecookie github.com/gorilla/securecookie
# github.com/gorilla/sessions v1.2.2 # github.com/gorilla/sessions v1.4.0
## explicit; go 1.20 ## explicit; go 1.23
github.com/gorilla/sessions github.com/gorilla/sessions
# github.com/gorilla/websocket v1.5.3 # github.com/gorilla/websocket v1.5.3
## explicit; go 1.12 ## explicit; go 1.12
@ -957,7 +957,7 @@ github.com/yuin/goldmark/renderer
github.com/yuin/goldmark/renderer/html github.com/yuin/goldmark/renderer/html
github.com/yuin/goldmark/text github.com/yuin/goldmark/text
github.com/yuin/goldmark/util github.com/yuin/goldmark/util
# go.mongodb.org/mongo-driver v1.14.0 # go.mongodb.org/mongo-driver v1.17.3
## explicit; go 1.18 ## explicit; go 1.18
go.mongodb.org/mongo-driver/bson go.mongodb.org/mongo-driver/bson
go.mongodb.org/mongo-driver/bson/bsoncodec go.mongodb.org/mongo-driver/bson/bsoncodec
@ -1052,7 +1052,7 @@ go.uber.org/automaxprocs/maxprocs
# go.uber.org/multierr v1.11.0 # go.uber.org/multierr v1.11.0
## explicit; go 1.19 ## explicit; go 1.19
go.uber.org/multierr go.uber.org/multierr
# golang.org/x/arch v0.15.0 # golang.org/x/arch v0.16.0
## explicit; go 1.23.0 ## explicit; go 1.23.0
golang.org/x/arch/x86/x86asm golang.org/x/arch/x86/x86asm
# golang.org/x/crypto v0.37.0 # golang.org/x/crypto v0.37.0