[issue43702] [Windows] correctly sort and remove duplicates in _winapi getenvironment()

2022-03-19 Thread Eryk Sun


Eryk Sun  added the comment:

> which name should be stored if they are duplicated with case insensitive?

Ideally os.environ would preserve the original case of the process environment, 
and os.environ.copy() would return a copy that's also case insensitive. That 
would prevent most problems with duplicates keys. See msg387676 in bpo-28824, 
and msg414319 in bpo-15373.

In msg390038 I suggested keeping the first key that's encountered. However, 
dicts preserve insertion order nowadays, so one could assume that the last one 
is the one that the caller wants to keep.

--

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue43702] [Windows] correctly sort and remove duplicates in _winapi getenvironment()

2022-03-19 Thread AN Long


AN Long  added the comment:

I have a question, how to determine which name should be stored if they are 
duplicated with case insensitive?

--
nosy: +asaka

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue43702] [Windows] correctly sort and remove duplicates in _winapi getenvironment()

2022-02-25 Thread Eryk Sun


Change by Eryk Sun :


--
versions: +Python 3.11 -Python 3.8

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue43702] [Windows] correctly sort and remove duplicates in _winapi getenvironment()

2021-04-01 Thread Eryk Sun


New submission from Eryk Sun :

getenvironment() in Modules/_winapi.c needs to sort variables in the 
environment block and remove duplicates case insensitively [1]. 

The sort order used to matter with SetEnvironmentVairableW(). As soon as it 
reached a name in the environment block that compared greater than the target 
name, it would insert a new variable. Nowadays, SetEnvironmentVairableW() 
searches the entire environment block before inserting a new value. Regardless, 
at the very least, getenvironment() is not well-behaved and not setting the 
environment in the documented sort order that users, and possibly other 
programs, expect.

Case-insensitive sorting in Windows uses upper case. The variable names in the 
mapping can be added to a list and sorted with a key function that's based on 
LCMapStringEx() [2], with the flag LCMAP_UPPERCASE. Loop over the sorted list 
to create the environment block. Remove duplicates by skipping a name that 
compares equal to the previously stored name according to 
CompareStringOrdinal() [3].

_winapi.LCMapStringEx(src, flags=LCMAP_UPPERCASE, locale=LOCALE_NAME_INVARIANT) 
could also be used in ntpath.normcase(), which would resolve bpo-42658.

---

[1] 
https://docs.microsoft.com/en-us/windows/win32/procthread/changing-environment-variables
[2] 
https://docs.microsoft.com/en-us/windows/win32/api/winnls/nf-winnls-lcmapstringex
[3] 
https://docs.microsoft.com/en-us/windows/win32/api/stringapiset/nf-stringapiset-comparestringordinal

--
components: Extension Modules, Windows
messages: 390038
nosy: eryksun, paul.moore, steve.dower, tim.golden, zach.ware
priority: normal
severity: normal
stage: needs patch
status: open
title: [Windows] correctly sort and remove duplicates in _winapi 
getenvironment()
type: behavior
versions: Python 3.10, Python 3.8, Python 3.9

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com