GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — bpo-29110: Fix file object leak in `aifc.open`. by Uberi · Pull Request #162 · python/cpython

Conversation

@Uberi

@Uberi Uberi commented Feb 18, 2017

Copy link
Copy Markdown
Contributor

When given an invalid AIFF file, aifc.open doesn't clean up after itself. This patch makes it close the file object if it was opened by the library.

Also, it adds one unit test, test.aifc_test.AifcMiscTest.test_close_opened_files_on_error. The patch can be verified with ./python -m test -j0 test_aifc.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@the-knights-who-say-ni the-knights-who-say-ni added the CLA signed label Feb 18, 2017
@serhiy-storchaka serhiy-storchaka added the type-bug An unexpected behavior, bug, or error label Feb 19, 2017
methane
methane reviewed Feb 21, 2017
View reviewed changes
Comment thread Lib/test/test_aifc.py Outdated

@methane methane Feb 21, 2017

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you use with self.assertRaises(aifc.Error): instead of try ~ except: pass?

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@Uberi Uberi Feb 21, 2017

Copy link
Copy Markdown
Contributor Author

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done!

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
methane
methane requested changes Feb 22, 2017
View reviewed changes

@methane methane left a comment

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add an entry at Lib section in Misc/NEWS.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread Lib/test/test_aifc.py Outdated

@methane methane Feb 22, 2017

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please wrap at 79 columns

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@Uberi Uberi Feb 22, 2017

Copy link
Copy Markdown
Contributor Author

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It seems to be 77 characters over here. Is there something I'm missing?

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@methane methane Feb 22, 2017

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Uh, I'm sorry. no problem.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread Lib/test/test_aifc.py Outdated

@methane methane Feb 22, 2017

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same here.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@Uberi
Uberi force-pushed the bpo-29110 branch from 932ef31 to 96fa443 Compare February 22, 2017 04:59
@Uberi

Uberi commented Feb 22, 2017

Copy link
Copy Markdown
Contributor Author

Rebased and squashed on upstream, added NEWS entry, and fixed the style thing noted above!

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

methane
methane reviewed Feb 22, 2017
View reviewed changes
Comment thread Misc/NEWS Outdated

@methane methane Feb 22, 2017

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add credit like Patch by <your name> at the end.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@Uberi
bpo-29110: Fix file object leak in aifc.open when given invalid AIF…
e09c582
…F file.
@Uberi
Uberi force-pushed the bpo-29110 branch from 96fa443 to e09c582 Compare February 22, 2017 05:14
@Uberi

Uberi commented Feb 22, 2017

Copy link
Copy Markdown
Contributor Author

Added and squashed!

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

methane
methane approved these changes Feb 22, 2017
View reviewed changes
@methane

methane commented Feb 22, 2017

Copy link
Copy Markdown
Member

We use "Squash and merge" in Github. So squash is not needed for next time.
Normal commit make it easy to review changes from last commit.

BTW, since this is bugfix, would you create backport (cherry-pick) pull request for 3.5 and 3.6 branch?
I can do it for you, but "cherry pick + pull request + squash merge" workflow drops original author.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@methane methane added needs backport to 3.5 labels Feb 22, 2017
@methane
methane merged commit 03f68b6 into python:master Feb 22, 2017
serhiy-storchaka
serhiy-storchaka reviewed Feb 23, 2017
View reviewed changes
Comment thread Lib/aifc.py
raise

# treat .aiff file extensions as non-compressed audio
if f.endswith('.aiff'):

@serhiy-storchaka serhiy-storchaka Feb 23, 2017

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is unrelated change and it introduces a regression. self._aifc is not defined if the file have non .aiff extension.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@methane methane Feb 23, 2017 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

self.initfp(file_object) initializes self._aifc = 1.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@serhiy-storchaka serhiy-storchaka Feb 23, 2017

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, sorry, I missed this. It would be better to write just self._aifc = not f.endswith('.aiff') if you want to modernize this code.

But now it looks to me that initfp() never fails. All changes of Aifc_write were not needed.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@methane methane Feb 23, 2017

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

MemoryError and MaxRecursionError can happen, but that's very unlikely and hard to test.
That's why I didn't request testing Aifc_write.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
serhiy-storchaka
serhiy-storchaka reviewed Feb 23, 2017
View reviewed changes
Comment thread Lib/test/test_aifc.py
#This file contains chunk types aifc doesn't recognize.
self.f = aifc.open(findfile('Sine-1000Hz-300ms.aif'))

def test_close_opened_files_on_error(self):

@serhiy-storchaka serhiy-storchaka Feb 23, 2017

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The test tests only Aifc_read. Needed a test for Aifc_write.

Is it possible to make tests common for aifc, sunau and wave?

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@methane methane Feb 25, 2017

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

#293 adds test for Aifc_write.

Since this type of test is depending on implementation (raise Exception on Edge case),
I didn't tried to make this generic.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
methane added a commit that referenced this pull request Feb 26, 2017
@methane
bpo-29110: add test for Aifc_write. (GH-293)
5dc33ee
follow up of GH-162
methane pushed a commit to methane/cpython that referenced this pull request Feb 26, 2017
@Uberi @methane
bpo-29110: Fix file object leak in aifc.open when given invalid AIF…
0a8c34e
…F file. (pythonGH-162)

(cherry picked from commit 03f68b6)
methane added a commit to methane/cpython that referenced this pull request Feb 26, 2017
@methane
bpo-29110: add test for Aifc_write. (pythonGH-293)
09d29fc
follow up of pythonGH-162
(cherry picked from commit 5dc33ee)
This was referenced Feb 26, 2017
[3.6] bpo-29110: Fix file object leak in aifc.open #310
Merged
[3.5] bpo-29110: Fix file object leak in aifc.open #311
Merged
methane pushed a commit to methane/cpython that referenced this pull request Feb 26, 2017
@Uberi @methane
bpo-29110: Fix file object leak in aifc.open when given invalid AIF…
c9cb89d
…F file. (pythonGH-162)

(cherry picked from commit 03f68b6)
methane added a commit to methane/cpython that referenced this pull request Feb 26, 2017
@methane
bpo-29110: add test for Aifc_write. (pythonGH-293)
7d3913a
follow up of pythonGH-162
(cherry picked from commit 5dc33ee)
methane added a commit that referenced this pull request Feb 26, 2017
@methane
[3.6] bpo-29110: Fix file object leak in aifc.open (#310)
c9131b6
(cherry picked from commit 03f68b6) (GH-162)
(cherry picked from commit 5dc33ee) (GH-293)
@methane methane removed the needs backport to 3.6 label Feb 26, 2017
methane added a commit that referenced this pull request Feb 26, 2017
@methane
bpo-29110: Fix file object leak in aifc.open (GH-311)
b7fb1e2
(cherry picked from commit 03f68b6) (GH-162)
(cherry picked from commit 5dc33ee) (GH-293)
@methane methane removed the needs backport to 3.5 label Feb 26, 2017
@methane methane mentioned this pull request Feb 28, 2017
[2.7] bpo-29110: Fix file object leak in aifc.open #356
Merged
jaraco pushed a commit that referenced this pull request Dec 2, 2022
@berkerpeksag
Remove BPO link and strip newlines from commit body (#314)
dfb0d1f
Fixes #162
lazka pushed a commit to lazka/cpython that referenced this pull request Feb 10, 2024
@mstorsjo @lazka
Makefile: Add a dependency on $(LDLIBRARY) for the sharedmods target
67a024e
When building shared modules (*.pyd) for MinGW, they link against
the import library for the main python (e.g. -lpython3.11). When
linking shared modules on Linux, this doesn't happen, but those
shared libraries are linked with undefined references which
then are fulfilled by the host process when they are loaded.

Add a dependency to make sure that $(LDLIBRARY), e.g.
libpython$(LDVERSION).dll.a, exists before starting to build
the shared modules.

Previously, if libpython$(LDVERSION).dll.a didn't exist when
the shared modules were linked, some of them failed to link,
but this wasn't reported as an error in the build, and a
later invocation of setup.py would retry building them, which
then would succeed. E.g. there was a seemingly benign race
condition in the build.

However, in some rare cases, the race condition no longer
was benign. The build also produces a corresponding static library,
$(LIBRARY), e.g. libpython$(VERSION)$(ABIFLAGS).a - which in
the end would be named similarly, libpython3.11.a, when
$(LDLIBRARY) would be libpython3.11.dll.a.

If the static library exists but the import library doesn't, then
most modules would still fail to link, but a few ones wouldn't
(select, _multiprocessing, _overlapped and _socket). The ones
that did succeed linking with the static library would crash at
runtime though.

By making sure that the right, intended library to fulfill the
linker parameter "-lpython3.11" exists before building the shared
modules, we avoid the whole race condition that in some rare
cases could produce a Python build that crashes at runtime.

For Linux targets, this extra dependency is unnecessary, but should
not cause other problems ($(LDLIBRARY) is set to the same as
$(LIBRARY) if not building any shared library).

This fixes MSYS2 cpython-mingw issue python#162.
lazka pushed a commit to lazka/cpython that referenced this pull request Aug 25, 2024
@mstorsjo @lazka
Makefile: Add a dependency on $(LDLIBRARY) for the sharedmods target
5b5a247
When building shared modules (*.pyd) for MinGW, they link against
the import library for the main python (e.g. -lpython3.11). When
linking shared modules on Linux, this doesn't happen, but those
shared libraries are linked with undefined references which
then are fulfilled by the host process when they are loaded.

Add a dependency to make sure that $(LDLIBRARY), e.g.
libpython$(LDVERSION).dll.a, exists before starting to build
the shared modules.

Previously, if libpython$(LDVERSION).dll.a didn't exist when
the shared modules were linked, some of them failed to link,
but this wasn't reported as an error in the build, and a
later invocation of setup.py would retry building them, which
then would succeed. E.g. there was a seemingly benign race
condition in the build.

However, in some rare cases, the race condition no longer
was benign. The build also produces a corresponding static library,
$(LIBRARY), e.g. libpython$(VERSION)$(ABIFLAGS).a - which in
the end would be named similarly, libpython3.11.a, when
$(LDLIBRARY) would be libpython3.11.dll.a.

If the static library exists but the import library doesn't, then
most modules would still fail to link, but a few ones wouldn't
(select, _multiprocessing, _overlapped and _socket). The ones
that did succeed linking with the static library would crash at
runtime though.

By making sure that the right, intended library to fulfill the
linker parameter "-lpython3.11" exists before building the shared
modules, we avoid the whole race condition that in some rare
cases could produce a Python build that crashes at runtime.

For Linux targets, this extra dependency is unnecessary, but should
not cause other problems ($(LDLIBRARY) is set to the same as
$(LIBRARY) if not building any shared library).

This fixes MSYS2 cpython-mingw issue python#162.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Reviewers

@methane methane methane approved these changes
@serhiy-storchaka serhiy-storchaka serhiy-storchaka left review comments

Uh oh!

There was an error while loading. Please reload this page.

Assignees

No one assigned

Labels

type-bug An unexpected behavior, bug, or error

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

Uh oh!

There was an error while loading. Please reload this page.

4 participants

@Uberi @methane @serhiy-storchaka @the-knights-who-say-ni
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.