]> source.dussan.org Git - gitea.git/commitdiff
Fix incorrect object id hash function (#30708)
authorwxiaoguang <wxiaoguang@gmail.com>
Fri, 26 Apr 2024 09:49:48 +0000 (17:49 +0800)
committerGitHub <noreply@github.com>
Fri, 26 Apr 2024 09:49:48 +0000 (09:49 +0000)
Great thanks to @oliverpool for figuring out the problem and proposing a
fix.

Regression of #28138

Incorrect hash causes the user's LFS files get all deleted when running
`doctor fix all`

(by the way, remove unused/non-standard comments)

Co-authored-by: Giteabot <teabot@gitea.io>
modules/git/object_format.go
modules/git/object_id.go
modules/git/object_id_test.go

index a056b20e8a19fca10e748f6f22f53b55f02e885c..3de9ff8cf456c9298d5173cd9f190222bc39c8bb 100644 (file)
@@ -33,7 +33,6 @@ type ObjectFormat interface {
        ComputeHash(t ObjectType, content []byte) ObjectID
 }
 
-/* SHA1 Type */
 type Sha1ObjectFormatImpl struct{}
 
 var (
@@ -70,14 +69,10 @@ func (h Sha1ObjectFormatImpl) ComputeHash(t ObjectType, content []byte) ObjectID
        _, _ = hasher.Write([]byte(" "))
        _, _ = hasher.Write([]byte(strconv.FormatInt(int64(len(content)), 10)))
        _, _ = hasher.Write([]byte{0})
-
-       // HashSum generates a SHA1 for the provided hash
-       var sha1 Sha1Hash
-       copy(sha1[:], hasher.Sum(nil))
-       return &sha1
+       _, _ = hasher.Write(content)
+       return h.MustID(hasher.Sum(nil))
 }
 
-/* SHA256 Type */
 type Sha256ObjectFormatImpl struct{}
 
 var (
@@ -116,11 +111,8 @@ func (h Sha256ObjectFormatImpl) ComputeHash(t ObjectType, content []byte) Object
        _, _ = hasher.Write([]byte(" "))
        _, _ = hasher.Write([]byte(strconv.FormatInt(int64(len(content)), 10)))
        _, _ = hasher.Write([]byte{0})
-
-       // HashSum generates a SHA256 for the provided hash
-       var sha256 Sha1Hash
-       copy(sha256[:], hasher.Sum(nil))
-       return &sha256
+       _, _ = hasher.Write(content)
+       return h.MustID(hasher.Sum(nil))
 }
 
 var (
index 4f8c39ee1d64d365cf1f695b59dcbda921f48c06..33e5085005d2f3316ce2b0f7fb84fdff207a3c3c 100644 (file)
@@ -16,7 +16,6 @@ type ObjectID interface {
        Type() ObjectFormat
 }
 
-/* SHA1 */
 type Sha1Hash [20]byte
 
 func (h *Sha1Hash) String() string {
@@ -40,7 +39,6 @@ func MustIDFromString(hexHash string) ObjectID {
        return id
 }
 
-/* SHA256 */
 type Sha256Hash [32]byte
 
 func (h *Sha256Hash) String() string {
@@ -54,7 +52,6 @@ func (h *Sha256Hash) IsZero() bool {
 func (h *Sha256Hash) RawValue() []byte { return h[:] }
 func (*Sha256Hash) Type() ObjectFormat { return Sha256ObjectFormat }
 
-/* utility */
 func NewIDFromString(hexHash string) (ObjectID, error) {
        var theObjectFormat ObjectFormat
        for _, objectFormat := range SupportedObjectFormats {
index 1ad40096a07b15e645c63092f448388606e96412..03d0c85d878492f8f3ed04a0c678c32877ee3632 100644 (file)
@@ -18,4 +18,8 @@ func TestIsValidSHAPattern(t *testing.T) {
        assert.False(t, h.IsValid("abc"))
        assert.False(t, h.IsValid("123g"))
        assert.False(t, h.IsValid("some random text"))
+       assert.Equal(t, "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", ComputeBlobHash(Sha1ObjectFormat, nil).String())
+       assert.Equal(t, "2e65efe2a145dda7ee51d1741299f848e5bf752e", ComputeBlobHash(Sha1ObjectFormat, []byte("a")).String())
+       assert.Equal(t, "473a0f4c3be8a93681a267e3b1e9a7dcda1185436fe141f7749120a303721813", ComputeBlobHash(Sha256ObjectFormat, nil).String())
+       assert.Equal(t, "eb337bcee2061c5313c9a1392116b6c76039e9e30d71467ae359b36277e17dc7", ComputeBlobHash(Sha256ObjectFormat, []byte("a")).String())
 }