# Git Modifying DLL

9 messages from 2021-08-19 to 2021-09-01. Participants: Jonathon Anderson, Randall S. Becker, Torsten Bögershausen, Jeff King, brian m. carlson.
Thread: https://gitlist.dev/t/56326

## Jonathon Anderson, 2021-08-19 17:58

Subject: Git Modifying DLL
Message-ID: <CAG83euoGmVUUBh00wAEX1muZogNPOQUV6+ppL8x8qCaDnzTbDw@mail.gmail.com>
URL: https://gitlist.dev/e/CAG83euoGmVUUBh00wAEX1muZogNPOQUV6%2BppL8x8qCaDnzTbDw%40mail.gmail.com

```
I'm having an issue with git modifying a DLL file and corrupting it.
When I download the original working file, it has a hash starting with
8FE400... I then commit the DLL and push it to our repo. When I
download the file from the repo, the DLL can't be loaded, and it has a
hash starting with E004FB...

Opening the DLL in a hex editor and using the compare feature, there's
a single change to the file. In the original, the byte code starting
at 0x0074 is 2E 0D 0D 0A 24.
In the git file, the byte code starting at 0x0074 is 2E 0D 0A 24

A single carriage return character (0x0D) has been removed, and the
file size has changed from 260,608 bytes to 260,607 bytes.

I ruled out the possibility that the repo server was doing anything to
the file because I deleted the file in my local repository then ran
"git reset --hard HEAD" to restore the file, and the hash had once
again changed to E004FB...

OS: Windows 10.0.19043 pro
git: 2.32.0.windows.1

I have no settings configured for git behavior handling line endings.

The original DLL can be found here:
https://www.powershellgallery.com/packages/PSWindowsUpdate/2.1.1.2

Navigate to "Manual Download", download the nuget package and unzip
it. The file is PSWindowsUpdate.dll

Thank you,
Jonathon

```

## Randall S. Becker, 2021-08-19 18:13

Subject: RE: Git Modifying DLL
Message-ID: <010f01d79525$f10a1f60$d31e5e20$@nexbridge.com>
URL: https://gitlist.dev/e/010f01d79525%24f10a1f60%24d31e5e20%24%40nexbridge.com
In-Reply-To: <CAG83euoGmVUUBh00wAEX1muZogNPOQUV6+ppL8x8qCaDnzTbDw@mail.gmail.com>

```
On August 19, 2021 1:59 PM, Jonathon Anderson wrote:
>
>I'm having an issue with git modifying a DLL file and corrupting it.
>When I download the original working file, it has a hash starting with 8FE400... I then commit the DLL and push it to our repo. When I
>download the file from the repo, the DLL can't be loaded, and it has a hash starting with E004FB...
>
>Opening the DLL in a hex editor and using the compare feature, there's a single change to the file. In the original, the byte code starting
>at 0x0074 is 2E 0D 0D 0A 24.
>In the git file, the byte code starting at 0x0074 is 2E 0D 0A 24
>
>A single carriage return character (0x0D) has been removed, and the file size has changed from 260,608 bytes to 260,607 bytes.
>
>I ruled out the possibility that the repo server was doing anything to the file because I deleted the file in my local repository then ran "git
>reset --hard HEAD" to restore the file, and the hash had once again changed to E004FB...
>
>OS: Windows 10.0.19043 pro
>git: 2.32.0.windows.1
>
>I have no settings configured for git behavior handling line endings.
>
>The original DLL can be found here:
>https://www.powershellgallery.com/packages/PSWindowsUpdate/2.1.1.2
>
>Navigate to "Manual Download", download the nuget package and unzip it. The file is PSWindowsUpdate.dll

Have you set up an entry for *.dll as binary in your .gitattributes file?

-Randall


```

## Jonathon Anderson, 2021-08-19 18:21

Subject: Re: Git Modifying DLL
Message-ID: <CAG83euo2B4QFU_S6Yqd3UACWq63p=L+T30CwzT52D8H=S5pRVg@mail.gmail.com>
URL: https://gitlist.dev/e/CAG83euo2B4QFU_S6Yqd3UACWq63p%3DL%2BT30CwzT52D8H%3DS5pRVg%40mail.gmail.com
In-Reply-To: <010f01d79525$f10a1f60$d31e5e20$@nexbridge.com>

```
I had not. I tested that and it worked. I assumed that git would
automatically treat dll files as binary. Thanks for the help!

On Thu, Aug 19, 2021 at 1:13 PM Randall S. Becker
<rsbecker@nexbridge.com> wrote:
>
> On August 19, 2021 1:59 PM, Jonathon Anderson wrote:
> >
> >I'm having an issue with git modifying a DLL file and corrupting it.
> >When I download the original working file, it has a hash starting with 8FE400... I then commit the DLL and push it to our repo. When I
> >download the file from the repo, the DLL can't be loaded, and it has a hash starting with E004FB...
> >
> >Opening the DLL in a hex editor and using the compare feature, there's a single change to the file. In the original, the byte code starting
> >at 0x0074 is 2E 0D 0D 0A 24.
> >In the git file, the byte code starting at 0x0074 is 2E 0D 0A 24
> >
> >A single carriage return character (0x0D) has been removed, and the file size has changed from 260,608 bytes to 260,607 bytes.
> >
> >I ruled out the possibility that the repo server was doing anything to the file because I deleted the file in my local repository then ran "git
> >reset --hard HEAD" to restore the file, and the hash had once again changed to E004FB...
> >
> >OS: Windows 10.0.19043 pro
> >git: 2.32.0.windows.1
> >
> >I have no settings configured for git behavior handling line endings.
> >
> >The original DLL can be found here:
> >https://www.powershellgallery.com/packages/PSWindowsUpdate/2.1.1.2
> >
> >Navigate to "Manual Download", download the nuget package and unzip it. The file is PSWindowsUpdate.dll
>
> Have you set up an entry for *.dll as binary in your .gitattributes file?
>
> -Randall
>

```

## Torsten Bögershausen, 2021-08-20 15:37

Subject: Re: Git Modifying DLL
Message-ID: <20210820153756.c7b2d5zju7mkf4w5@tb-raspi4>
URL: https://gitlist.dev/e/20210820153756.c7b2d5zju7mkf4w5%40tb-raspi4
In-Reply-To: <CAG83euo2B4QFU_S6Yqd3UACWq63p=L+T30CwzT52D8H=S5pRVg@mail.gmail.com>

```
First of all, thanks for the report.
(And please, no top-posting in this list, see my comments at the end)

On Thu, Aug 19, 2021 at 01:21:03PM -0500, Jonathon Anderson wrote:
> I had not. I tested that and it worked. I assumed that git would
> automatically treat dll files as binary. Thanks for the help!
>
> On Thu, Aug 19, 2021 at 1:13 PM Randall S. Becker
> <rsbecker@nexbridge.com> wrote:
> >
> > On August 19, 2021 1:59 PM, Jonathon Anderson wrote:
> > >
> > >I'm having an issue with git modifying a DLL file and corrupting it.
> > >When I download the original working file, it has a hash starting with 8FE400... I then commit the DLL and push it to our repo. When I
> > >download the file from the repo, the DLL can't be loaded, and it has a hash starting with E004FB...
> > >
> > >Opening the DLL in a hex editor and using the compare feature, there's a single change to the file. In the original, the byte code starting
> > >at 0x0074 is 2E 0D 0D 0A 24.
> > >In the git file, the byte code starting at 0x0074 is 2E 0D 0A 24
> > >
> > >A single carriage return character (0x0D) has been removed, and the file size has changed from 260,608 bytes to 260,607 bytes.
> > >
> > >I ruled out the possibility that the repo server was doing anything to the file because I deleted the file in my local repository then ran "git
> > >reset --hard HEAD" to restore the file, and the hash had once again changed to E004FB...
> > >
> > >OS: Windows 10.0.19043 pro
> > >git: 2.32.0.windows.1
> > >
> > >I have no settings configured for git behavior handling line endings.
> > >
> > >The original DLL can be found here:
> > >https://www.powershellgallery.com/packages/PSWindowsUpdate/2.1.1.2
> > >
> > >Navigate to "Manual Download", download the nuget package and unzip it. The file is PSWindowsUpdate.dll
> >
> > Have you set up an entry for *.dll as binary in your .gitattributes file?
> >
> > -Randall
> >

I downloaded the dll.

I can not reproduce the issue here - so I wonder, what is going on.

Could you run the following experiment, please ?
(in git bash or so)

mkdir  dlltest
cd dlltest
git init
cp whereveritis/PSWindowsUpdate.dll .

git ls-files -o --eol

# I get
git ls-files --eol -o PSWindowsUpdate.dll
i/      w/-text attr/			PSWindowsUpdate.dll

This means, that the file is "classified" as "-text" in the working tree.
"-text" means the same as binary.
And git should not change CRLF at all.

Do you have any more .gitattributes in you repo?
Of course, you can run the command inside your repo.
Omit the "-o" for other and simply run
git ls-files --eol



```

## Jeff King, 2021-08-20 18:00

Subject: Re: Git Modifying DLL
Message-ID: <YR/tyHWQ6+2sP2iA@coredump.intra.peff.net>
URL: https://gitlist.dev/e/YR%2FtyHWQ6%2B2sP2iA%40coredump.intra.peff.net
In-Reply-To: <CAG83euo2B4QFU_S6Yqd3UACWq63p=L+T30CwzT52D8H=S5pRVg@mail.gmail.com>

```
On Thu, Aug 19, 2021 at 01:21:03PM -0500, Jonathon Anderson wrote:

> I had not. I tested that and it worked. I assumed that git would
> automatically treat dll files as binary. Thanks for the help!

Git doesn't know about any file extensions by default. Its default "is
it binary" test looks for NUL bytes in the first 8k or so of the file.
I'd expect your DLL would probably have such a NUL byte.

Is it possible you have other .gitattributes set which are confusing
things?

You might try:

  git check-attr --all <path>

or:

  git ls-files --stdin | git check-attr --stdin --all

-Peff

```

## Jonathon Anderson, 2021-08-20 18:47

Subject: Re: Git Modifying DLL
Message-ID: <CAG83euofNXHx8-=7Obj-Ju5U_fjwNBuLVJjmccVhe9bqRFyBiw@mail.gmail.com>
URL: https://gitlist.dev/e/CAG83euofNXHx8-%3D7Obj-Ju5U_fjwNBuLVJjmccVhe9bqRFyBiw%40mail.gmail.com
In-Reply-To: <YR/tyHWQ6+2sP2iA@coredump.intra.peff.net>

```
On Fri, Aug 20, 2021 at 1:00 PM Jeff King <peff@peff.net> wrote:
>
> On Thu, Aug 19, 2021 at 01:21:03PM -0500, Jonathon Anderson wrote:
>
> > I had not. I tested that and it worked. I assumed that git would
> > automatically treat dll files as binary. Thanks for the help!
>
> Git doesn't know about any file extensions by default. Its default "is
> it binary" test looks for NUL bytes in the first 8k or so of the file.
> I'd expect your DLL would probably have such a NUL byte.
>
> Is it possible you have other .gitattributes set which are confusing
> things?
>
> You might try:
>
>   git check-attr --all <path>
>
> or:
>
>   git ls-files --stdin | git check-attr --stdin --all
>
> -Peff

When I remove '*.dll binary" from .gitattributes, I get this:

$ git check-attr --all ./PSWindowsUpdate.dll
./PSWindowsUpdate.dll: text: set
./PSWindowsUpdate.dll: eol: lf



When I add "*.dll binary" to .gitattributes, I get this:

$ git check-attr --all ./PSWindowsUpdate.dll
./PSWindowsUpdate.dll: binary: set
./PSWindowsUpdate.dll: diff: unset
./PSWindowsUpdate.dll: merge: unset
./PSWindowsUpdate.dll: text: unset
./PSWindowsUpdate.dll: eol: lf


I can also confirm that there are null bytes in the first 8k bytes.
These are the first 16 bytes

4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00

Thanks,
Jonathon

```

## brian m. carlson, 2021-08-20 19:14

Subject: Re: Git Modifying DLL
Message-ID: <YR//IDB9ml5RO2H6@camp.crustytoothpaste.net>
URL: https://gitlist.dev/e/YR%2F%2FIDB9ml5RO2H6%40camp.crustytoothpaste.net
In-Reply-To: <CAG83euofNXHx8-=7Obj-Ju5U_fjwNBuLVJjmccVhe9bqRFyBiw@mail.gmail.com>

```
On 2021-08-20 at 18:47:02, Jonathon Anderson wrote:
> On Fri, Aug 20, 2021 at 1:00 PM Jeff King <peff@peff.net> wrote:
> >
> > On Thu, Aug 19, 2021 at 01:21:03PM -0500, Jonathon Anderson wrote:
> >
> > > I had not. I tested that and it worked. I assumed that git would
> > > automatically treat dll files as binary. Thanks for the help!
> >
> > Git doesn't know about any file extensions by default. Its default "is
> > it binary" test looks for NUL bytes in the first 8k or so of the file.
> > I'd expect your DLL would probably have such a NUL byte.
> >
> > Is it possible you have other .gitattributes set which are confusing
> > things?
> >
> > You might try:
> >
> >   git check-attr --all <path>
> >
> > or:
> >
> >   git ls-files --stdin | git check-attr --stdin --all
> >
> > -Peff
> 
> When I remove '*.dll binary" from .gitattributes, I get this:
> 
> $ git check-attr --all ./PSWindowsUpdate.dll
> ./PSWindowsUpdate.dll: text: set
> ./PSWindowsUpdate.dll: eol: lf

Yes, this is definitely not correct.  The flag "text" being set tells
Git to do line-ending conversion and "eol=lf" says to convert line
endings into LF.

You should look for things in your .gitattributes file that say
something like "* text", which you probably don't want.  You could use
"* text=auto", which should be fine for most cases, though.  It's also
possible those aren't in a .gitattributes file in your repository but
one elsewhere on your system.  You can check gitattributes(5) for the
locations of other files that can affect it.

As a note, it is best practice not to check binary dependencies or build
artifacts into the repo.  Those are best stored elsewhere, such as an
artifact server.
-- 
brian m. carlson (he/him or they/them)
Toronto, Ontario, CA

```

## Randall S. Becker, 2021-08-20 19:51

Subject: RE: Git Modifying DLL
Message-ID: <01a101d795fc$ca46e520$5ed4af60$@nexbridge.com>
URL: https://gitlist.dev/e/01a101d795fc%24ca46e520%245ed4af60%24%40nexbridge.com
In-Reply-To: <YR//IDB9ml5RO2H6@camp.crustytoothpaste.net>

```
On August 20, 2021 3:15 PM, brian m. carlson wrote:
>On 2021-08-20 at 18:47:02, Jonathon Anderson wrote:
>> On Fri, Aug 20, 2021 at 1:00 PM Jeff King <peff@peff.net> wrote:
>> >
>> > On Thu, Aug 19, 2021 at 01:21:03PM -0500, Jonathon Anderson wrote:
>> >
>> > > I had not. I tested that and it worked. I assumed that git would
>> > > automatically treat dll files as binary. Thanks for the help!
>> >
>> > Git doesn't know about any file extensions by default. Its default
>> > "is it binary" test looks for NUL bytes in the first 8k or so of the file.
>> > I'd expect your DLL would probably have such a NUL byte.
>> >
>> > Is it possible you have other .gitattributes set which are confusing
>> > things?
>> >
>> > You might try:
>> >
>> >   git check-attr --all <path>
>> >
>> > or:
>> >
>> >   git ls-files --stdin | git check-attr --stdin --all
>> >
>> > -Peff
>>
>> When I remove '*.dll binary" from .gitattributes, I get this:
>>
>> $ git check-attr --all ./PSWindowsUpdate.dll
>> ./PSWindowsUpdate.dll: text: set
>> ./PSWindowsUpdate.dll: eol: lf
>
>Yes, this is definitely not correct.  The flag "text" being set tells Git to do line-ending conversion and "eol=lf" says to convert line endings
>into LF.
>
>You should look for things in your .gitattributes file that say something like "* text", which you probably don't want.  You could use
>"* text=auto", which should be fine for most cases, though.  It's also possible those aren't in a .gitattributes file in your repository but one
>elsewhere on your system.  You can check gitattributes(5) for the locations of other files that can affect it.
>
>As a note, it is best practice not to check binary dependencies or build artifacts into the repo.  Those are best stored elsewhere, such as an
>artifact server.

OT: Unless you are using git as an artifact repository to retain the dependency relationship between objects and the source commits that built them for PCI and SWIFT compliance. git is exceptional when it comes to evidence-of-origin forensics of specific installation artifacts when release structures are more complex than "deploy everything" use cases. But that may be a discussion we can have elsewhere.

Just my $20.00.
-Randall


```

## Jonathon Anderson, 2021-09-01 21:07

Subject: Re: Git Modifying DLL
Message-ID: <CAG83euoQW=HHN-cSJc3pOzsYUMEmJ0=9o2+zymm-z5e=b1SXjA@mail.gmail.com>
URL: https://gitlist.dev/e/CAG83euoQW%3DHHN-cSJc3pOzsYUMEmJ0%3D9o2%2Bzymm-z5e%3Db1SXjA%40mail.gmail.com
In-Reply-To: <01a101d795fc$ca46e520$5ed4af60$@nexbridge.com>

```
So, I somehow didn't realize what this was when I was looking at it,
but this is the first line in our .gitattributes

* text eol=lf

It all makes sense now.

And, yea, we're using git to retain dependency relationships and bring
those files under version control so we can audit changes and go
through the full peer review process, etc

On Fri, Aug 20, 2021 at 2:51 PM Randall S. Becker
<rsbecker@nexbridge.com> wrote:
>
> On August 20, 2021 3:15 PM, brian m. carlson wrote:
> >On 2021-08-20 at 18:47:02, Jonathon Anderson wrote:
> >> On Fri, Aug 20, 2021 at 1:00 PM Jeff King <peff@peff.net> wrote:
> >> >
> >> > On Thu, Aug 19, 2021 at 01:21:03PM -0500, Jonathon Anderson wrote:
> >> >
> >> > > I had not. I tested that and it worked. I assumed that git would
> >> > > automatically treat dll files as binary. Thanks for the help!
> >> >
> >> > Git doesn't know about any file extensions by default. Its default
> >> > "is it binary" test looks for NUL bytes in the first 8k or so of the file.
> >> > I'd expect your DLL would probably have such a NUL byte.
> >> >
> >> > Is it possible you have other .gitattributes set which are confusing
> >> > things?
> >> >
> >> > You might try:
> >> >
> >> >   git check-attr --all <path>
> >> >
> >> > or:
> >> >
> >> >   git ls-files --stdin | git check-attr --stdin --all
> >> >
> >> > -Peff
> >>
> >> When I remove '*.dll binary" from .gitattributes, I get this:
> >>
> >> $ git check-attr --all ./PSWindowsUpdate.dll
> >> ./PSWindowsUpdate.dll: text: set
> >> ./PSWindowsUpdate.dll: eol: lf
> >
> >Yes, this is definitely not correct.  The flag "text" being set tells Git to do line-ending conversion and "eol=lf" says to convert line endings
> >into LF.
> >
> >You should look for things in your .gitattributes file that say something like "* text", which you probably don't want.  You could use
> >"* text=auto", which should be fine for most cases, though.  It's also possible those aren't in a .gitattributes file in your repository but one
> >elsewhere on your system.  You can check gitattributes(5) for the locations of other files that can affect it.
> >
> >As a note, it is best practice not to check binary dependencies or build artifacts into the repo.  Those are best stored elsewhere, such as an
> >artifact server.
>
> OT: Unless you are using git as an artifact repository to retain the dependency relationship between objects and the source commits that built them for PCI and SWIFT compliance. git is exceptional when it comes to evidence-of-origin forensics of specific installation artifacts when release structures are more complex than "deploy everything" use cases. But that may be a discussion we can have elsewhere.
>
> Just my $20.00.
> -Randall
>

```
